diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000000..481338581a --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,47 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: + - main + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + +permissions: + contents: write + +jobs: + deploy: + name: Deploy to GitHub Pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + + - uses: pnpm/action-setup@v2 + with: + version: 8.7.0 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build website + run: pnpm build + + # Popular action to deploy to GitHub Pages: + # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Build output to publish to the `gh-pages` branch: + publish_dir: ./build + # The following lines assign commit authorship to the official + # GH-Actions bot for deploys to `gh-pages` branch: + # https://github.com/actions/checkout/issues/13#issuecomment-724415212 + # The GH actions bot is used by default if you didn't specify the two fields. + # You can swap them out with your own user credentials. + user_name: github-actions[bot] + user_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..b2d6de3062 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/README.md b/README.md new file mode 100644 index 0000000000..0c6c2c27be --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000000..e00595dae7 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/blog/2019-05-28-first-blog-post.md b/blog/2019-05-28-first-blog-post.md new file mode 100644 index 0000000000..02f3f81bd2 --- /dev/null +++ b/blog/2019-05-28-first-blog-post.md @@ -0,0 +1,12 @@ +--- +slug: first-blog-post +title: First Blog Post +authors: + name: Gao Wei + title: Docusaurus Core Team + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +tags: [hola, docusaurus] +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/blog/2019-05-29-long-blog-post.md b/blog/2019-05-29-long-blog-post.md new file mode 100644 index 0000000000..26ffb1b1f6 --- /dev/null +++ b/blog/2019-05-29-long-blog-post.md @@ -0,0 +1,44 @@ +--- +slug: long-blog-post +title: Long Blog Post +authors: endi +tags: [hello, docusaurus] +--- + +This is the summary of a very long blog post, + +Use a `` comment to limit blog post size in the list view. + + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/blog/2021-08-01-mdx-blog-post.mdx b/blog/2021-08-01-mdx-blog-post.mdx new file mode 100644 index 0000000000..c04ebe323e --- /dev/null +++ b/blog/2021-08-01-mdx-blog-post.mdx @@ -0,0 +1,20 @@ +--- +slug: mdx-blog-post +title: MDX Blog Post +authors: [slorber] +tags: [docusaurus] +--- + +Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). + +:::tip + +Use the power of React to create interactive blog posts. + +```js + +``` + + + +::: diff --git a/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg new file mode 100644 index 0000000000..11bda09284 Binary files /dev/null and b/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg differ diff --git a/blog/2021-08-26-welcome/index.md b/blog/2021-08-26-welcome/index.md new file mode 100644 index 0000000000..9455168f17 --- /dev/null +++ b/blog/2021-08-26-welcome/index.md @@ -0,0 +1,25 @@ +--- +slug: welcome +title: Welcome +authors: [slorber, yangshun] +tags: [facebook, hello, docusaurus] +--- + +[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog). + +Simply add Markdown files (or folders) to the `blog` directory. + +Regular blog authors can be added to `authors.yml`. + +The blog post date can be extracted from filenames, such as: + +- `2019-05-30-welcome.md` +- `2019-05-30-welcome/index.md` + +A blog post folder can be convenient to co-locate blog post images: + +![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) + +The blog supports tags as well! + +**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config. diff --git a/blog/2023-10-02-refine-crm-overview.md b/blog/2023-10-02-refine-crm-overview.md new file mode 100644 index 0000000000..88662878de --- /dev/null +++ b/blog/2023-10-02-refine-crm-overview.md @@ -0,0 +1,173 @@ +--- +title: Building a Complete React CRM App with Refine, Ant Design and GraphQL +description: We'll explore the key features of our CRM app, the technologies we used. +slug: react-crm-with-refine +tags: [refine, react] +authors: + name: Gao Wei + title: Docusaurus Core Team + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +is_featured: true +image: https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-02-refine-crm-overview/social.jpg +hide_table_of_contents: false +--- + +![Image description](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/crm-general.gif) + +I want to introduce our newest example app – a full-fledged React CRM (Customer Relationship Management) application built using refine, Ant Design, and GraphQL. + +👉 [Live Demo](https://example.crm.refine.dev/) + +👉 [You can find the source code on GitHub here](https://github.com/refinedev/refine/tree/master/examples/app-crm) + +This example is open-source, which means anyone can freely utilize and customize the source code as they see fit. It's not just another application; it's a comprehensive solution that boasts all the features and functionalities required for an accurate enterprise-level application. + +Moreover, this application serves as a guiding light for all developers. Whether you're a seasoned pro or just starting, our project is a valuable resource that can be used as a reference to better understand best practices and modern development techniques. + +We'll publish an article series and Video tutorials on YouTube on building this CRM app from scratch. You can follow the refine to get notified when it's ready! + +Twitter: https://twitter.com/refine_dev +GitHub: https://github.com/refinedev/refine + +## Introduction + +This article briefly overviews the CRM application built using refine, an open-source React framework designed for rapidly developing web applications. + +We'll explore the key features of our CRM app, the technologies we used, and how you can adapt this template for various business needs. + +Step we'll cover: + +- [Key Features of the CRM App](#key-features-of-the-crm-app) +- [Technologies Used](#technologies-used) +- [Best Practices and Ecosystem Integration](#best-practices-and-ecosystem-integration) +- [Where Can You Use This CRM As A Reference Template?](#where-can-you-use-this-crm-as-a-reference-template) + +## Key Features of the CRM App + +Our CRM application is feature-rich and comes with everything you need to manage customer relationships efficiently: + +### Dashboard + +The Dashboard provides an at-a-glance overview of your CRM activities. It displays key metrics, recent customer interactions, and upcoming events, offering valuable insights to help you make informed decisions. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/halx7sfl9ctke1fu3w35.png) + +
+
+ +### Calendar Integration + +Effortlessly manage appointments, meetings, and important events with the integrated Calendar feature. Stay organized and ensure you never miss a crucial interaction with your customers. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2v8ghazuheiznefwat9.png) + +
+
+ +### Scrumboard-Project Kanban + +Our Scrumboard or Project Kanban page streamlines project management. Visualize project progress, manage tasks, and facilitate team collaboration with ease. Move tasks through customizable boards to keep your projects on track. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hcll7tbqx3t71i6v7a9.png) + +
+
+ +### Sales Pipeline + +Effectively manage your sales process from lead generation to deal closure. The Sales Pipeline provides a visual representation of your sales stages, helping your team prioritize leads and track conversions. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5uoj722wasvw2fx8z49.png) + +
+
+ +### Companies + +The Companies page allows you to organize and categorize your business contacts. Maintain detailed profiles for each company, including contact information, communication history, and associated contacts. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gjlahcc1icfthu2n31ar.png) + +
+
+ +### Contacts + +Manage individual contacts efficiently using the Contacts page. Keep track of customer interactions, schedule follow-ups, and access critical contact information quickly. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4c0ef7tv7nktax4gt3oz.png) + +
+
+ +### Quotes + +Create, send, and manage quotes seamlessly with the Quotes feature. Generate professional quotes for your customers, track their status, and convert them into sales. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rqj0pzgkrure7ov5mr9.png) + +
+
+ +### Administration + +The Administration section empowers you to configure and customize your CRM application to suit your specific business needs. Manage user roles, access permissions, and system settings effortlessly. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5deq6ceue79kloeuryz.png) + +
+ +### Authentication & Authorization + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m1r04i2h0cf1jegasbte.png) + +This example app is a comprehensive set of features that ensures you can streamline your customer interactions, project management, and sales processes, all within a single, user-friendly platform. Whether you're managing contacts, tracking sales, or overseeing projects, our CRM app provides the tools you need for success. + +## Technologies Used + +Our CRM app's modular structure and use of open-source tools make it adaptable to various business needs. So you can build all kinds of web apps like internal tools, admin panels, or dashboards on top of it. + +To bring our CRM app to life, we leveraged several cutting-edge technologies: + +### 1. refine + +[refine](https://github.com/refinedev/refine) served as the backbone of our CRM application. It offers a wide range of tools and components for easily building data-intensive applications. + +refine's internal hooks and components simplify the development process and eliminate repetitive tasks by providing industry-standard solutions for crucial aspects of a project, including authentication, access control, routing, networking, state management, and i18n. + +### 2. Ant Design + +[Ant Design](https://ant.design/), a popular UI library, provided the sleek and responsive user interface that our CRM app needed. Its pre-built components saved us time and effort. + +It's consistent and polished UI components ensured a professional and user-friendly interface. refine has a built-in integration for Ant Design. + +### 3. GraphQL + +We used [GraphQL](https://graphql.org/) for effective data retrieval and updating from our server. Additionally, we integrated [GraphQL Subscriptions](https://www.apollographql.com/docs/react/data/subscriptions/) to manage real-time modifications. + +For instance, on the Project Kanban page, tasks get updated automatically when cards are dragged and dropped between sections. + +![Image](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/real-time.gif) + +GraphQL's efficient data-fetching capabilities made working with large datasets a breeze. It's flexibility allowed us to tailor our queries to our exact requirements. + +refine has built-in data provider support for GraphQL.You can set it up during the project creation phase. + +## Best Practices and Ecosystem Integration + +Throughout the development process, we adhered to best practices and incorporated elements from the broader ecosystem. This ensures our CRM app is not only functional but also scalable and maintainable. + +The group responsible for the CRM example app is the core refine framework team. Feel free to explore the best practices within the ecosystem! + +## Where Can You Use This CRM As A Reference Template? + +Our CRM template isn't limited to just one use case. You can adapt it for various purposes, including: + +- **B2B Applications**: Streamline customer interactions in a business-to-business context. +- **Internal Tools**: Use it as an internal tool to manage employee or departmental tasks and interactions. +- **All CRUD Applications**: The template's versatility means it can serve as the foundation for creating all sorts of CRUD applications. + +## Conclusion + +In this article, we've introduced you to our CRM application built with refine. We've highlighted its key features, the technologies we used, and the advantages of our approach. With this CRM template, you have the power to tailor your customer relationship management system to meet your unique business needs. Whether you're running a B2B operation, need an efficient internal tool, or want a versatile CRUD application, our CRM template has you covered. diff --git a/blog/2023-12-15-kubectl-cheat-sheet.md b/blog/2023-12-15-kubectl-cheat-sheet.md new file mode 100644 index 0000000000..26b6c36433 --- /dev/null +++ b/blog/2023-12-15-kubectl-cheat-sheet.md @@ -0,0 +1,395 @@ +--- +title: Kubectl Cheat Sheet - With Examples +description: Kubectl is a very handy tool if you want to manage your applications deployed in Kubernetes. +slug: kubectl-cheat-sheet +tags: [kubernetes, docker] +authors: + name: Gao Wei + title: Docusaurus Core Team + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +image: https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-12-15-kubectl-cheat-sheet/social.png +hide_table_of_contents: false +--- + +## Introduction + +Kubernetes is a famous container orchestration tool that is very popular in modern software development. If you are using Kubernetes, you must have used Kubectl, which is the command line tool to manage your Kubernetes applications. This guide will walk you through the most frequently used commands for Kubectl. Not only will we discuss the important commands, but we will also discuss the practical code examples and the common errors that are faced during their execution. Some examples of what it can do includes: + +- Management of your pods +- Management of your deployments +- Management of your services +- And many more + +Now, we may not be able to cover each and every command, but be assured that the commands discussed below will certainly be of value if your application is using Kubernetes. Let's start with the basic one i.e. installation and setup of Kubectl. + +## Setup and Basic Commands + +### Installing kubectl: version + +Checks kubectl installation and version. + +**Common errors:** command not found (No kubectl installed). + +Refused connection to localhost:8080: Kubernetes cluster is not running or kubectl is misconfigured. + +### Basic Syntax + +The basic syntax of any kubectl command is: `kubectl [command] Type [name] [flags]` +Note that 'TYPE' and 'NAME' are context-dependent and may not be required in that order. + +**Common Flags:** + +Command include get, describe, and create. + +Type: pod, service. + +Name: Optional for commanding all resources of a type. + +Optional flags, like `--namespace` . + +**Example:** `kubectl get pods -n mynamespace` + +This command lists all 'mynamespace' pods. + +**Common Flags:** + +Use the -n or --namespace flag to specify the namespace. + +Use `kubectl get pods -n mynamespace` with -o or --output for output formats like json or yaml. E.g. `kubectl get pod mypod json` + +**Common Errors:** Invalid namespace or output format can cause server errors like "Not Found". + +## Cluster Management and Context + +### Viewing Cluster Info + +`kubectl cluster-info` + +Displays cluster master and service endpoints. + +**Common Flags:** + +`--kubeconfig` This option specifies the kubeconfig file. + +**Common Errors:** Unable to connect to server due to network or connection issues. + +**Example:** `kubectl cluster-info --kubeconfig=/myconfig` + +### Switching Context + +Switches one context to another. + +`kubectl config use-context [context_name]` + +**Common Flags:** It is most of the time used without any specific flags + +**Common Errors:** + +`error: no context exists with the name: [context_name]` : If context does not exist. + +**Example:** `kubectl config use-context staging-context` + +## Working with Namespaces + +Kubernetes namespaces segment and manage resources. Important namespace operations are below. + +### Namespace Creation + +This simple command creates a Kubernetes namespace. Due to its specific functionality, it has few variants and flags. +**Example:** + +Create a dev namespace using: `kubectl create namespace dev` + +**Common Errors:** + +Trying to create an existing namespace. +**Common flags:** + +- `--dry-run` Shows the namespace without creating it. +- `-o [format]` Outputs details in yaml or json format. + +### Namespace Listing + +This command displays all Kubernetes namespaces. + +**Example:** +Simple list: `kubectl get namespaces` +Detailed list: `kubectl get namespaces -o wide` + +**Common Errors:** +Using wrong flags or formats. + +**Common Flags:** + +- `-o wide`: Shows namespace details like age. +- `-o json` or `-o yaml` The details are output in JSON or YAML. +- `--show-labels`: It shows Namespace labels. + +### Namespace Deletion + +`kubectl delete [namespace_name]` + +This removes a namespace and its resources. Be careful since this is an irreversible operation. + +**Example:** +You can delete test namespace using: `Run kubectl delete namespace test` + +**Common Errors:** + +- Trying to delete a system or nonexistent namespace. +- Not migrating or backing up namespace resources. + + **Common Flags:** + +* `--grace-period=[seconds]` Allows setting a grace period before deletion. +* Use `--force` to delete the namespace forecibly. +* `--cascade` : Decides whether to delete namespace resources or not. + +## Management of pods and deployment + +### Pods Creating + +Pods are created with `kubectl run [pod_name]. --image=[image_name]` + +**Common Flags:** + +- `--env` Configure environment variables. +- `-l, --labels` Labels the pod. +- `--dry-run` Simulate pod-making. It is useful for testing on QA/Staging before deployment to production. + +**Example:** +Using the 'nginx' image to create 'nginx-pod' `kubectl run nginx-pod --image=nginx` + +**Common Error:** +The `Error: image not found` error occurs when the container image does not exist. + +### Get list of pods + +See all the pods in currently set namespace `kubectl get pods` + +**Common Flags**: + +- `-o wide ` To display the details like node name. +- `--show-labels` Labels also display for each pod. + **Example:** + `kubectl get pods -o wide` will show all pods with all their details. + +**Common Error:** +The `No resources found` error occurs when the namespace has no pods. + +### Deleting Pods + +The command to delete a pod is `kubectl delete pod [pod_name]` + +**Common Flags:** + +- `--grace-period`: Pause before killing the pod forcibly. +- `--force`: Immediately delete pod forcibly. + +**Example:** + +`kubectl delete nginx-pod` removes 'nginx-pod'. + +**Common Error:** +A common error is `Pod not found` when the pod does not exist. + +### Creating Deployments + +Creates a deployment with its name and image `kubectl create deployment [name] --image=[image]` + +**Common Flags:** + +- `--replicas` Set desired number of replicas. +- Run `--dry-run` to simulate deployment instead of actual deployment. + +**Example:** +Use the 'nginx' image to create 'nginx-deployment' `kubectl create deployment nginx-deployment --image=nginx` + +**Common Error:** +Image format errors often result in `Invalid image name` errors. + +### Listing deployments + +Shows namespace deployments `kubectl get deployments` + +**Common Flags:** +`-o wide` Shows extra details like replica count. + +**Example:** + +Displays all deployments `kubectl get deployments` + +**Common Error:** +The `No resources found` error occurs when the namespace has no deployments. + +## **Handling Services and Nodes** + +### Manage Services + +Overview +`kubectl get services` helps users quickly view all Kubernetes cluster services and their status. + +**Common Flags**: + +- `-o wide` : Provides additional details for each service. +- `--all-namespaces` You can see all the services present in all the namespaces. +- `--watch```Monitors service changes and updates display. + +**Example:** +`kubectl get services -o wide` +This command will display all default namespace services in detail. + +**Common Error:** +`Services' service-name' not found` Typing a service name incorrectly or querying a nonexistent service. + +### List Nodes + +Command `kubectl get nodes` displays all cluster nodes for size and health assessment. + +**Common Flags:** + +- `-o wide` Displays extra details like IP addresses, OS, kernel version, etc. +- `--selecto` Filters nodes by label. +- `--showlabels` Shows node labels. + +**Example:** +`kubectl get nodes --selector=environment=production` This command displays all production nodes. + +**Common Error:** +`Connection to server localhost:8080 refused` Usually due to incorrect kubectl configuration or inaccessible Kubernetes clusters. + +## Advanced Resource Management + +### Kubectl Labels + +Kubernetes labels are key-value pairs on pods. They organize and select object subsets. The command `kubectl get pods -l ` retrieves pods by label. + +**Common Flags:** + +- `--l` or `--selector`: Specifies label selector +- `--all-namespaces` searches all namespaces +- `-o' or `--output` Outputs the format (yaml, json) + +**Example:** +`kubectl get pods -l app=myApp` lists all pods with the label "app" equal to myApp. + +**Common Error**: +Incorrect label names or values often result in no results. Ensure pod labels are correct. + +### Scale deployments with kubectl + +Scaling deployments involves changing the number of pod replicas (instances). The `kubectl scale` command does this magic. + +**Common Flags:** + +- `--replicas` Specifies number of copies needed +- `--current-replicas` Current replica count (For conditional scaling) +- `--timeout:`Time to wait for scale operation completion + +**Example:** + +`kubectl scale deployment myDeployment --replicas=5` scales myDeployment to 5 replicas. + +**Common Error**: +A `deployment not found` error often occurs when scaling a nonexistent or misnamed deployment. The deployment name must be in the current namespace. + +## **Debugging and Logs** + +### Log Access + +Kubernetes pod logs can be retrieved using `kubectl logs [pod_name]`. Understanding pod-running applications and diagnosing issues requires this command. + +**Example:** +`kubectl logs my-app-pod` will show logs of the pod named "my-app-pod". + +**Common Error:** +`Error from server (NotFound): pods "my-app-pod" not found` This error occurs when the Kubernetes cluster does not have any pod with this name. + +### Tailing Logs + +You can stream or "tail" pod logs with `kubectl logs -f [pod_name]`. This helps monitor log outputs in real-time, especially in dynamic environments. + +**Example:** +`kubectl logs -f my-app-pod` Logs from the pod "my-app-pod" will be streamed live by this command. + +**Common Error:** +`Error from server (NotFound): pods "my-app-pod" not found`. This error means the Kubernetes cluster does not have the specified pod. + +## **Secrets and ConfigMaps** + +### Creating Secrets + +Kubernetes secrets store and manage passwords, OAuth tokens, and ssh keys. You can easily create these secrets with `kubectl create secret generic [secret_name] --from-literal=[key]=[value]` + +**Common Flags:** + +- `--from-literal` This flag specifies secret data as key-value pairs on the command line. +- `--from-file` Create secret from a file. In this case file name would be considered the key and its content will be the value. +- `--dry-run` Displays the object that would be sent to the cluster without actually sending it. +- +- `--output` or `-o' sets the output format (yaml or json). + +**Example:** +`kubectl create secret generic my-secret --from-literal=password=myStrongPassword` + +This command creates a secret named my-secret with one entry: password and myStrongPassword. + +**Common Error:** + +Incorrect or malformed key-value pairs are common when creating secrets. Following key=value format is essential. + +### Using ConfigMaps + +Kubernetes ConfigMaps stores non-confidential data in key-value pairs. Configuration files, command-line arguments, environment variables, port numbers, etc. can be stored there. The format is `kubectl create configmap [name] --from-literal=[key]=[value]` + +**Common Flags** + +Same as creating secrets (see above) + +**Example:** + +`kubectl create configmap app-config --from-literal=app_mode=production` + +A ConfigMap named "app-config" with app_mode set to production is created. + +**Common Error:** + +When using `--from-file`, referencing nonexistent files or directories is a common error. Verify file paths are correct and accessible. + +## **Useful Tips and Tricks** + +### Aliases for efficiency + +Using aliases for kubectl can speed up workflow by reducing keystrokes for each command. + +**Example:** + +`Alias k=kubectl` +You frequently check pod status. The alias lets you type `k get pods` instead of typing the whole word of kubectl. + +### Kubectl Autocomplete for Faster Command Completion + +Kubectl supports command-line autocompletion, saving significant time. This feature speeds up command, argument, and resource name completion. + +**Setting up autocomplete:** + +Source the autocomplete script in your shell's configuration file. For bash, You can add `source <(kubectl completion bash) `to your `.bashrc`. Add `source <(kubectl completion zsh)` to your `.zshrc` file for zsh. + +After setting up, typing a command like `kubectl get pod` and pressing tab completes this command to `kubectl get pods`. + +### Using Kubectl Port-Forward for Accessing Services Locally + +When using `kubectl port-forward`, you can access and interact with internal Kubernetes cluster services from your local machine. + +**Example:** + +Use `kubectl port-forward svc/my-web-app 5000:8080` to forward a cluster service on port 8080. + +The service's port 8080 receives traffic from your local machine's port 5000, so you can access the application at http://localhost:5000 in your browser. + +## Conclusion + +Kubetcl is a very handy tool if you want to manage your applications deployed in Kubernetes. Whether you are a novice or a seasoned practitioner, this guide will help you on every step of your Kubernetes journey, whether you are creating a pod or scaling your cluster. + +Give special attention to the different tips and tricks mentioned in this article because they will save you a lot of time and effort. We encourage you to try the commands mentioned in this article and get your hands dirty; that's the best way to master Kubectl. diff --git a/blog/authors.yml b/blog/authors.yml new file mode 100644 index 0000000000..bcb2991563 --- /dev/null +++ b/blog/authors.yml @@ -0,0 +1,17 @@ +endi: + name: Endilie Yacop Sucipto + title: Maintainer of Docusaurus + url: https://github.com/endiliey + image_url: https://github.com/endiliey.png + +yangshun: + name: Yangshun Tay + title: Front End Engineer @ Facebook + url: https://github.com/yangshun + image_url: https://github.com/yangshun.png + +slorber: + name: Sébastien Lorber + title: Docusaurus maintainer + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 0000000000..882372684a --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,10 @@ +project_id: '554141' +api_token_env: CROWDIN_PERSONAL_TOKEN +preserve_hierarchy: true +files: + # JSON 翻译文件 + - source: /i18n/en/**/* + translation: /i18n/%two_letters_code%/**/%original_file_name% + # Markdown 博客文件 + - source: /blog/**/* + translation: /i18n/%two_letters_code%/docusaurus-plugin-content-blog/**/%original_file_name% diff --git a/docusaurus.config.ts b/docusaurus.config.ts new file mode 100644 index 0000000000..3248efd882 --- /dev/null +++ b/docusaurus.config.ts @@ -0,0 +1,135 @@ +import { themes as prismThemes } from 'prism-react-renderer'; +import type { Config } from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; + +const DefaultLocale = 'en'; + +const config: Config = { + title: 'My Site2222', + tagline: 'Dinosaurs are cool', + favicon: 'img/favicon.ico', + + // Set the production url of your site here + url: 'https://illacloud.github.io', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: '/illa-website/', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'illacloud', // Usually your GitHub org/user name. + projectName: 'illa-website', // Usually your repo name. + + onBrokenLinks: 'warn', + onBrokenMarkdownLinks: 'warn', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en', 'zh', 'ja', 'de'], + }, + + presets: [ + [ + 'classic', + { + docs: false, + blog: false, + theme: { + customCss: './src/css/custom.css', + }, + } satisfies Preset.Options, + ], + ], + + themeConfig: { + // Replace with your project's social card + image: 'img/docusaurus-social-card.jpg', + colorMode: { + defaultMode: 'dark', + }, + navbar: { + title: 'ILLA', + logo: { + alt: 'ILLA', + srcDark: 'img/logo.svg', + src: 'img/whiteLogo.svg', + width: '51px', + height: '24px', + }, + items: [{ to: '/blog', label: 'Blog', position: 'left' }], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Community', + items: [ + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/docusaurus', + }, + { + label: 'Discord', + href: 'https://discordapp.com/invite/docusaurus', + }, + { + label: 'Twitter', + href: 'https://twitter.com/docusaurus', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: '/blog', + }, + { + label: 'GitHub', + href: 'https://github.com/facebook/docusaurus', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + } satisfies Preset.ThemeConfig, + plugins: [ + async function taildindcss() { + return { + name: 'docusaurus-tailwindcss', + configurePostCss(options) { + options.plugins.push(require('tailwindcss')); + options.plugins.push(require('autoprefixer')); + return options; + }, + }; + }, + [ + './plugins/blog-plugin.js', + { + blogTitle: 'Blog', + blogDescription: + 'A resource for ILLA, front-end ecosystem, and web development', + routeBasePath: '/blog', + postsPerPage: 12, + blogSidebarTitle: 'All posts', + blogSidebarCount: 0, + feedOptions: { + type: 'all', + copyright: `Copyright © ${new Date().getFullYear()} ILLA.`, + }, + }, + ], + ], +}; + +export default config; diff --git a/i18n/de/code.json b/i18n/de/code.json new file mode 100644 index 0000000000..bbbe0a583e --- /dev/null +++ b/i18n/de/code.json @@ -0,0 +1,604 @@ +{ + "footer.status": { + "message": "Status" + }, + "footer.roadmap": { + "message": "Fahrplan" + }, + "footer.changelog": { + "message": "Changelog" + }, + "footer.media": { + "message": "Medienset" + }, + "footer.drive": { + "message": "ILLA-Laufwerk" + }, + "footer.cloud": { + "message": "ILLA AI" + }, + "footer.selfhost": { + "message": "Selbst-Gastgeber" + }, + "footer.table": { + "message": "Tisch" + }, + "footer.chart": { + "message": "Diagramm" + }, + "footer.upload": { + "message": "Hochladen" + }, + "footer.switch": { + "message": "Wechseln" + }, + "footer.select": { + "message": "Auswählen" + }, + "footer.radio_group": { + "message": "Funkgruppe" + }, + "footer.checkbox_group": { + "message": "Checkbox-Gruppe" + }, + "footer.pdf": { + "message": "PDF" + }, + "footer.video": { + "message": "Video" + }, + "footer.mysql": { + "message": "MySQL" + }, + "footer.postgre": { + "message": "PostgreSQL" + }, + "footer.mongodb": { + "message": "MongoDB" + }, + "footer.firebase": { + "message": "Firebase" + }, + "footer.elasticsearch": { + "message": "Elastische Suche" + }, + "footer.mssql": { + "message": "Microsoft SQL Server" + }, + "footer.supabase": { + "message": "Supabase" + }, + "footer.dynamo": { + "message": "DynamoDB" + }, + "footer.hf": { + "message": "Hugging Face Inferenz-API" + }, + "footer.components": { + "message": "Komponenten" + }, + "footer.integrations": { + "message": "Integrationen" + }, + "footer.product": { + "message": "Produkte" + }, + "footer.company": { + "message": "Firma" + }, + "footer.community": { + "message": "Community" + }, + "slogan-1": { + "message": "Baue AI Driven Business App" + }, + "footer.privacy-policy": { + "message": "Datenschutzerklärung" + }, + "footer.terms-of-service": { + "message": "Nutzungsbedingungen" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Navigation der Blog-Liste", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Neuere Einträge", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Ältere Einträge", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "nav.product": { + "message": "Produkte" + }, + "sub_nav.product.drive": { + "message": "ILLA-Laufwerk" + }, + "sub_nav.product.cloud": { + "message": "ILLA AI" + }, + "sub_nav.product.selfhost": { + "message": "Selbst-Host" + }, + "nav.resource": { + "message": "Ressource" + }, + "sub_nav.resource.integrations": { + "message": "Integrationen" + }, + "sub_nav.resource.components": { + "message": "Komponenten" + }, + "nav.pricing": { + "message": "Preis" + }, + "nav.doc": { + "message": "Doc" + }, + "nav.blog": { + "message": "Blog" + }, + "nav.marketplace": { + "message": "Marktplatz" + }, + "nav.contact": { + "message": "Buch-Demo" + }, + "footer.less": { + "message": "Weniger anzeigen" + }, + "footer.more": { + "message": "Mehr anzeigen" + }, + "theme.blog.post.readingTime.plurals": { + "message": "1 min gelesen|{readingTime} min gelesen", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "call-to-action.title": { + "message": "Erstelle Apps mit ILLA-Cloud starten" + }, + "call-to-action.desc": { + "message": "Jedes interne Werkzeug, das Sie benötigen, kann mit ILLA Cloud in 1 Minute erstellt werden." + }, + "call-to-action.button-1": { + "message": "Cloud kostenlos testen" + }, + "call-to-action.button-2": { + "message": "mit GitHub anmelden" + }, + "title.github": { + "message": "Github" + }, + "title.stars": { + "message": "Sterne" + }, + "title.star-us": { + "message": "Markiere uns" + }, + "description": { + "message": "Ermächtigen Sie Ihr Team mit AI Agent und fortgeschrittenen Low-Code-Tools um Business-Apps zu erstellen" + }, + "illa-Cloud": { + "message": "Los geht's" + }, + "starts": { + "message": "Startet" + }, + "stars": { + "message": "Startet" + }, + "join-community": { + "message": "Trete Discord bei" + }, + "content.all.title": { + "message": "ILLA Cloud integriert alles" + }, + "how_to_use.title.3_steps_to_customize": { + "message": "Schritte, um Ihre KI-Werkzeuge anzupassen" + }, + "how_to_use.description.build_tools_through": { + "message": "Erstellen Sie Werkzeuge durch Drag-and-Drop Komponenten, passen Sie Ihren KI Agent an, verbinden Sie sich mit Ihren Datenquellen, und machen Sie die KI zu einem intelligenten Werkzeug, das auf Ihre Bedürfnisse und Daten zugeschnitten ist und Ihre Arbeit intelligenter macht." + }, + "how_to_use.step1_title.create_ai_agent_for": { + "message": "KI-Agent für einen bestimmten Zweck erstellen" + }, + "how_to_use.step1_description.you_can_create_an_ai": { + "message": "Sie können einen AI Agent für einen bestimmten Zweck erstellen und ihn bei bestimmten Aufgaben, am Arbeitsplatz oder in Ihrem täglichen Leben hilfreicher machen. " + }, + "how_to_use.step1_button.ai_agent_marketplace": { + "message": "KI-Agenten-Marktplatz" + }, + "how_to_use.step2_title.build_the_frontend_p": { + "message": "Erstellen Sie die Frontend-Seite in wenigen Minuten" + }, + "how_to_use.step2_description.by_dragging_and_drop": { + "message": "Durch Ziehen und Ablegen von Komponenten können Sie schnell die Schnittstelle des Werkzeugs erstellen und alle gewünschten Funktionen implementieren." + }, + "how_to_use.step2_button.illa_app_marketplace": { + "message": "ILLA App Marketplace" + }, + "how_to_use.step3_title.connect_to_your_data": { + "message": "Verbinden Sie sich mit Ihren Datenquellen und KI-Agenten" + }, + "how_to_use.step3_description.enable_data_integrat": { + "message": "Datenintegration und -automatisierung aktivieren. Der AI Agent führt spezifische Aufgaben basierend auf Ihren Anforderungen und Daten aus." + }, + "how_to_use.step3_button.supported_data_sourc": { + "message": "Unterstützte Datenquellen" + }, + "testimonial.title.user_testimonials": { + "message": "Benutzermeinungen" + }, + "testimonial.testimonial1_content.illa_cloud_has_been": { + "message": "ILLA Cloud ist für mich ein Spielwechsel. Es hilft mir, in kürzester Zeit hocheffiziente Inhalte zu generieren. Der maßgeschneiderte AI Agent und die App erfüllen meine geschäftlichen Bedürfnisse." + }, + "testimonial.testimonial1_username.christopher": { + "message": "Martha" + }, + "testimonial.testimonial1_usertitle.seo_specialist": { + "message": "SEO-Spezialist" + }, + "testimonial.testimonial2_content.i_think_i_become_a_b": { + "message": "Dieses Tool hat mich revolutioniert und mir wertvolle Zeit erspart. Ob Blog-Ideen oder strukturierende Artikel, die AI Agenten waren ein großer Gewinn für mich und mein Team." + }, + "testimonial.testimonial2_username.lucas": { + "message": "Lucas" + }, + "testimonial.testimonial2_usertitle.content_strategist": { + "message": "Inhaltsstratege" + }, + "testimonial.testimonial3_content.it_empowers_me_to_pr": { + "message": "Es ermöglicht mir, mit minimalem Aufwand außergewöhnliche Kundenbetreuung zu bieten. Der vorgebaute AI Agent und die App sowie die Fähigkeit, sie an unsere spezifischen Bedürfnisse anzupassen, haben die Effektivität unseres Teams deutlich gesteigert." + }, + "testimonial.testimonial3_username.harper": { + "message": "Harper" + }, + "testimonial.testimonial3_usertitle.customer_service_man": { + "message": "Kundenservice-Manager" + }, + "testimonial.testimonial4_content.ai_agent_low_code": { + "message": "AI Agent & Low-Code hat meinen E-Mail-Schreibprozess verändert. Es vereinfacht die Erstellung wirkungsvoller E-Mails, so dass ich mühelos ansprechende und überzeugende Nachrichten erstellen kann. ILLA Cloud hat unsere E-Mail-Kommunikation auf neue Höhen gebracht." + }, + "testimonial.testimonial4_username.abigail": { + "message": "Abigail" + }, + "testimonial.testimonial4_usertitle.communication_specia": { + "message": "Kommunikationsspezialist" + }, + "testimonial.testimonial5_content.i_need_to_oversee_va": { + "message": "Ich muss verschiedene Aspekte meines Unternehmens überwachen. ILLA Cloud liefert mir eine umfassende Lösung. Es spart mir nicht nur Zeit und Mühe in Entwicklung und Design, sondern ermöglicht mir auch, mein Geschäft besser zu verwalten und zu überwachen. " + }, + "testimonial.testimonial5_username.matthew": { + "message": "Matthäus" + }, + "testimonial.testimonial5_usertitle.business_founder": { + "message": "Firmengründer" + }, + "testimonial.testimonial6_content.using_illa_cloud_to": { + "message": "Die Verwendung von ILLA Cloud zum Erstellen eines Verwaltungs-Dashboards war unglaublich einfach. Nach nur einem Arbeitstag konnten wir Aufgaben wie die Überwachung des Projektfortschritts und die Zuweisung von Ressourcen innerhalb dieses Dashboards erfüllen." + }, + "testimonial.testimonial6_username.samuel": { + "message": "Samuel" + }, + "testimonial.testimonial6_usertitle.website_administrato": { + "message": "Website-Administrator" + }, + "customer.title": { + "message": "Vertrauen von Tausenden von Teams" + }, + "template.title.quickly_start_from_a": { + "message": "Schnell von einer Vorlage starten" + }, + "template.button.explore_more_templat": { + "message": "Weitere Vorlagen erkunden" + }, + "template.template1_title.car_rental_admin_pan": { + "message": "Auto-Mieten-Admin-Panel" + }, + "template.template1_description.build_for_car_rental": { + "message": "Bauen Sie für Autovermieter, um Trends bei der Nutzung, Kosten und Wartung zu erkennen und zu verfolgen" + }, + "template.template1_button.learn_more": { + "message": "Mehr erfahren" + }, + "template.template2_title.cms_with_content_gen": { + "message": "CMS mit Inhaltsgenerierung" + }, + "template.template2_description.build_for_business_o": { + "message": "Aufbau für Geschäftsoperationsteams, um Inhalte effizienter zu erstellen und zu verwalten" + }, + "template.template2_button.learn_more": { + "message": "Mehr erfahren" + }, + "template.template3_title.applicant_tracking": { + "message": "Bewerberverfolgung" + }, + "template.template3_description.build_for_the_human": { + "message": "Bauen Sie für das Team der Humanressourcen, um fortzufahren und den Fortschritt zu verfolgen" + }, + "template.template3_button.learn_more": { + "message": "Mehr erfahren" + }, + "solutions.title.how_illa_ai_improves": { + "message": "Wie ILLA KI die Arbeitsmethoden verbessert" + }, + "theme.blog.post.readMore": { + "message": "Lesen Sie mehr", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Lesen Sie mehr über {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "solutions.illa_title.illa_ai": { + "message": "ILLA Cloud" + }, + "solutions.human_title.human_work": { + "message": "Menschliche Arbeit" + }, + "theme.ErrorPageContent.title": { + "message": "Diese Seite ist abgestürzt.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.blog.archive.title": { + "message": "Archivieren", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archivieren", + "description": "The page & hero description of the blog archive page" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Zurück nach oben scrollen", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Blog-Beitragsseiten-Navigation", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Neuerer Beitrag", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Älterer Beitrag", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "Ein Beitrag|{count} Beiträge", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} getaggt mit \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "Alle Tags anzeigen", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "Wechseln Sie zwischen dem dunklen und dem hellen Modus (derzeit {mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "dunkler Modus", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "lichtmodus", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Breadcrumbs", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} Elemente", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Docs-Seiten", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Vorherige", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Nächste", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "One doc tagged|{count} docs tagged", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} mit \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Version: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "Dies ist eine unveröffentlichte Dokumentation für {siteTitle} {versionLabel} Version.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "Dies ist eine Dokumentation für {siteTitle} {versionLabel}, die nicht mehr aktiv gewartet wird.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "Aktuelle Dokumentation finden Sie im {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "neueste Version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Diese Seite bearbeiten", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Direkter Link zu {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " auf {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " von {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Zuletzt aktualisierte{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versionen", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "Seite nicht gefunden", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "Tags:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "Vorsicht", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "gefahr", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "notiz", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "tip", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "warnung", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Schließen", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Aktuelle Blog-Beitragsnavigation", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "Kopiert", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Code in Zwischenablage kopieren", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "Kopieren", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Wortumbruch umschalten", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Sidebar Kategorie '{label} ' erweitern", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Collapse sidebar category '{label}'", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "Haupt", + "description": "The ARIA label for the main navigation" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Sprachen", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.NotFound.p1": { + "message": "Wir konnten nicht finden, was Sie suchten.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Bitte wenden Sie sich an den Besitzer der Website, die Sie mit der ursprünglichen URL verlinkt und lassen Sie sie wissen, dass der Link defekt ist.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "Auf dieser Seite", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.docs.breadcrumbs.home": { + "message": "Startseite", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Seitenleiste einklappen", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Seitenleiste einklappen", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Docs sidebar", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Navigationsleiste schließen", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Zurück zum Hauptmenü", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Navigationsleiste umschalten", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Erneut versuchen", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Zum Hauptinhalt springen", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Tags", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "Nicht gelistete Seite", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "Diese Seite ist nicht aufgelistet. Suchmaschinen indizieren sie nicht und nur Benutzer, die einen direkten Link haben, können darauf zugreifen.", + "description": "The unlisted content banner message" + } +} diff --git a/i18n/de/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md b/i18n/de/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md new file mode 100644 index 0000000000..28e2a3a46f --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md @@ -0,0 +1,14 @@ +--- +slug: erster Blog-Beitrag +title: Erster Blogbeitrag +authors: + name: Gao Wei + title: Docusaurus Kernteam + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +tags: + - hola + - dokusaurus +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/i18n/de/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md b/i18n/de/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md new file mode 100644 index 0000000000..4695aa0a8d --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md @@ -0,0 +1,46 @@ +--- +slug: langer Blog-Beitrag +title: Langer Blog-Beitrag +authors: endi +tags: + - hallo + - dokusaurus +--- + +Dies ist die Zusammenfassung eines sehr langen Blog-Beitrags, + +Benutze einen `` Kommentar um die Größe des Blogs in der Listenansicht zu begrenzen. + + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/i18n/de/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx b/i18n/de/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx new file mode 100644 index 0000000000..9172dc10b3 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx @@ -0,0 +1,22 @@ +--- +slug: mdx-blog-Beitrag +title: MDX-Blog-Beitrag +authors: + - slorber +tags: + - dokusaurus +--- + +Blogbeiträge unterstützen [Docusaurus Markdown Features](https://docusaurus.io/docs/markdown-features), wie z.B. [MDX](https://mdxjs.com/). + +:::tip + +Nutzen Sie die Kraft der Reaktion, um interaktive Blog-Beiträge zu erstellen. + +```js + +``` + + + +::: diff --git a/i18n/de/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/i18n/de/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg new file mode 100644 index 0000000000..11bda09284 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg differ diff --git a/i18n/de/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md b/i18n/de/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md new file mode 100644 index 0000000000..4ec9452630 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md @@ -0,0 +1,30 @@ +--- +slug: willkommen +title: Begrüßung +authors: + - slorber + - yangshun +tags: + - facebook + - hallo + - dokusaurus +--- + +[Docusaurus blogging features](https://docusaurus.io/docs/blog) werden durch das [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog) unterstützt. + +Fügen Sie einfach Markdown Dateien (oder Ordner) in das Verzeichnis `blog` ein. + +Reguläre Blog-Autoren können zu `authors.yml` hinzugefügt werden. + +Das Blog-Beitragsdatum kann aus Dateinamen extrahiert werden, wie: + +- `2019-05-30-welcome.md` +- `2019-05-30-welcome/index.md` + +Ein Blog-Post-Ordner kann bequem sein, um Blog-Post-Bilder zu lokalisieren: + +![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) + +Der Blog unterstützt auch Tags! + +**Und wenn du keinen Blog möchtest**: lösche einfach dieses Verzeichnis und benutze `blog: false` in deiner Docusaurus Konfiguration. diff --git a/i18n/de/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md b/i18n/de/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md new file mode 100644 index 0000000000..212e89969c --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md @@ -0,0 +1,175 @@ +--- +title: Erstellung einer kompletten React CRM App mit Refine, Ant Design und GraphQL +description: Wir werden die wichtigsten Funktionen unserer CRM-App erforschen, die Technologien, die wir verwendet haben. +slug: reakt-crm-mit-verfeinert +tags: + - verfeinern + - reagieren +authors: + name: Gao Wei + title: Docusaurus Kernteam + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +is_featured: true +image: https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-02-refine-crm-overview/social.jpg +hide_table_of_contents: false +--- + +![Bildbeschreibung](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/crm-general.gif) + +Ich möchte unsere neueste Beispiel-App vorstellen – eine vollständige React CRM-Anwendung (Customer Relationship Management), die mit Raffine-Ant-Design und GraphQL erstellt wurde. + +👉 [Live Demo](https://example.crm.refine.dev/) + +👉 [Du findest den Quellcode auf GitHub hier](https://github.com/refinedev/refine/tree/master/examples/app-crm) + +Dieses Beispiel ist Open-Source, was bedeutet, dass jeder den Quellcode frei nutzen und anpassen kann, wie er es für richtig hält. Es handelt sich nicht nur um eine andere Anwendung, sondern um eine umfassende Lösung, die alle Funktionen und Funktionalitäten bietet, die für eine präzise Anwendung auf Unternehmensebene erforderlich sind. + +Darüber hinaus dient diese Anwendung als Leitfaden für alle Entwickler. Egal, ob Sie ein erfahrener Profi sind oder gerade anfangen, unser Projekt ist eine wertvolle Ressource, die als Referenz zum besseren Verständnis bewährter Verfahren und moderner Entwicklungstechniken verwendet werden kann. + +Wir werden eine Artikelreihe und Video-Tutorials auf YouTube veröffentlichen, um diese CRM-App von Grund auf neu aufzubauen. Du kannst der Verfeinerung folgen, um benachrichtigt zu werden, wenn es fertig ist! + +Twitter: https\://twitter.com/refine_dev +GitHub: https\://github.com/refinedev/refine + +## Einführung + +Dieser Artikel überblickt kurz die CRM-Anwendung, die mit Raffe, einem Open-Source-React-Framework, das für die schnelle Entwicklung von Web-Anwendungen entwickelt wurde. + +Wir werden die wichtigsten Funktionen unserer CRM-App erforschen, die Technologien, die wir verwendet haben und wie Sie diese Vorlage an verschiedene Anforderungen anpassen können. + +Schritt, den wir abdecken: + +- [Schlüsselfunktionen der CRM-App](#key-features-of-the-crm-app) +- [Technologien benutzt](#technologies-benutzt) +- [Best Practices and Ecosystem Integration](#best-practices-and-ecosystem-integration) +- [Wo können Sie dieses CRM als Referenzvorlage verwenden?](#where e-can-you-use-this-crm-as-a-reference-template) + +## Schlüsselfunktionen der CRM-App + +Unsere CRM-Anwendung ist funktional reich und bietet alles, was Sie brauchen, um Kundenbeziehungen effizient zu verwalten: + +### Dashboard + +The Dashboard provides an at-a-glance overview of your CRM activities. It displays key metrics, recent customer interactions, and upcoming events, offering valuable insights to help you make informed decisions. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/halx7sfl9ctke1fu3w35.png) + +
+
+ +### Calendar Integration + +Effortlessly manage appointments, meetings, and important events with the integrated Calendar feature. Stay organized and ensure you never miss a crucial interaction with your customers. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2v8ghazuheiznefwat9.png) + +
+
+ +### Scrumboard-Project Kanban + +Our Scrumboard or Project Kanban page streamlines project management. Visualize project progress, manage tasks, and facilitate team collaboration with ease. Move tasks through customizable boards to keep your projects on track. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hcll7tbqx3t71i6v7a9.png) + +
+
+ +### Sales Pipeline + +Effectively manage your sales process from lead generation to deal closure. The Sales Pipeline provides a visual representation of your sales stages, helping your team prioritize leads and track conversions. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5uoj722wasvw2fx8z49.png) + +
+
+ +### Companies + +The Companies page allows you to organize and categorize your business contacts. Maintain detailed profiles for each company, including contact information, communication history, and associated contacts. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gjlahcc1icfthu2n31ar.png) + +
+
+ +### Contacts + +Manage individual contacts efficiently using the Contacts page. Keep track of customer interactions, schedule follow-ups, and access critical contact information quickly. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4c0ef7tv7nktax4gt3oz.png) + +
+
+ +### Quotes + +Create, send, and manage quotes seamlessly with the Quotes feature. Generate professional quotes for your customers, track their status, and convert them into sales. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rqj0pzgkrure7ov5mr9.png) + +
+
+ +### Administration + +The Administration section empowers you to configure and customize your CRM application to suit your specific business needs. Manage user roles, access permissions, and system settings effortlessly. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5deq6ceue79kloeuryz.png) + +
+ +### Authentication & Authorization + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m1r04i2h0cf1jegasbte.png) + +This example app is a comprehensive set of features that ensures you can streamline your customer interactions, project management, and sales processes, all within a single, user-friendly platform. Whether you're managing contacts, tracking sales, or overseeing projects, our CRM app provides the tools you need for success. + +## Technologies Used + +Our CRM app's modular structure and use of open-source tools make it adaptable to various business needs. So you can build all kinds of web apps like internal tools, admin panels, or dashboards on top of it. + +To bring our CRM app to life, we leveraged several cutting-edge technologies: + +### 1. refine + +[refine](https://github.com/refinedev/refine) served as the backbone of our CRM application. It offers a wide range of tools and components for easily building data-intensive applications. + +refine's internal hooks and components simplify the development process and eliminate repetitive tasks by providing industry-standard solutions for crucial aspects of a project, including authentication, access control, routing, networking, state management, and i18n. + +### 2. Ant Design + +[Ant Design](https://ant.design/), a popular UI library, provided the sleek and responsive user interface that our CRM app needed. Its pre-built components saved us time and effort. + +It's consistent and polished UI components ensured a professional and user-friendly interface. refine has a built-in integration for Ant Design. + +### 3. GraphQL + +We used [GraphQL](https://graphql.org/) for effective data retrieval and updating from our server. Additionally, we integrated [GraphQL Subscriptions](https://www.apollographql.com/docs/react/data/subscriptions/) to manage real-time modifications. + +For instance, on the Project Kanban page, tasks get updated automatically when cards are dragged and dropped between sections. + +![Image](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/real-time.gif) + +GraphQL's efficient data-fetching capabilities made working with large datasets a breeze. It's flexibility allowed us to tailor our queries to our exact requirements. + +refine has built-in data provider support for GraphQL.You can set it up during the project creation phase. + +## Best Practices and Ecosystem Integration + +Throughout the development process, we adhered to best practices and incorporated elements from the broader ecosystem. This ensures our CRM app is not only functional but also scalable and maintainable. + +The group responsible for the CRM example app is the core refine framework team. Feel free to explore the best practices within the ecosystem! + +## Where Can You Use This CRM As A Reference Template? + +Our CRM template isn't limited to just one use case. You can adapt it for various purposes, including: + +- **B2B Applications**: Streamline customer interactions in a business-to-business context. +- **Internal Tools**: Use it as an internal tool to manage employee or departmental tasks and interactions. +- **All CRUD Applications**: The template's versatility means it can serve as the foundation for creating all sorts of CRUD applications. + +## Conclusion + +In this article, we've introduced you to our CRM application built with refine. We've highlighted its key features, the technologies we used, and the advantages of our approach. With this CRM template, you have the power to tailor your customer relationship management system to meet your unique business needs. Whether you're running a B2B operation, need an efficient internal tool, or want a versatile CRUD application, our CRM template has you covered. diff --git a/i18n/de/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md b/i18n/de/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md new file mode 100644 index 0000000000..96e9351dd1 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md @@ -0,0 +1,397 @@ +--- +title: Kubectl Cheat Sheet - Mit Beispielen +description: Kubectl ist ein sehr praktisches Werkzeug, wenn Sie Ihre Anwendungen in Kubernetes verwalten möchten. +slug: kubectl-Cheat-Blatt +tags: + - kubernetes + - docker +authors: + name: Gao Wei + title: Docusaurus Kernteam + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +image: https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-12-15-kubectl-cheat-sheet/social.png +hide_table_of_contents: false +--- + +## Einführung + +Kubernetes ist ein berühmtes Containerorchesterwerkzeug, das in der modernen Softwareentwicklung sehr beliebt ist. Wenn Sie Kubernetes verwenden, müssen Sie Kubectl, das Kommandozeilenwerkzeug zur Verwaltung Ihrer Kubernetes Anwendungen, verwendet haben. Diese Anleitung führt Sie durch die am häufigsten verwendeten Befehle für Kubectl. Wir werden nicht nur die wichtigen Befehle diskutieren, aber wir werden auch die praktischen Code-Beispiele und die gemeinsamen Fehler, die bei ihrer Ausführung auftreten, diskutieren. Einige Beispiele dafür, was es tun kann: + +- Verwaltung Ihrer Pods +- Verwaltung Ihrer Deployment +- Verwaltung Ihrer Dienste +- Und viele weitere + +Jetzt können wir möglicherweise nicht alle Befehle abdecken, aber seien Sie versichert, dass die unten beschriebenen Befehle sicherlich von Nutzen sein werden, wenn Ihre Anwendung Kubernetes verwendet. Beginnen wir mit der Basisinstallation und dem Setup von Kubectl. + +## Setup und Basic Befehle + +### Installiere kubectl: Version + +Prüft die Installation und Version kubectl. + +**Übliche Fehler:** Befehl nicht gefunden (kein kubectl installiert). + +Verbindung zu localhost:8080: Kubernetes wird nicht ausgeführt oder kubectl ist falsch konfiguriert. + +### Basissyntax + +Die grundlegende Syntax eines Kubectl Befehls ist: `kubectl [command] Typ [name] [flags]` +Beachten Sie, dass 'TYPE' und 'NAME' kontextabhängig sind und in dieser Reihenfolge möglicherweise nicht benötigt werden. + +**Gewöhnliche Flaggen:** + +Das Kommando enthält Erhalten, Beschreiben und Erstellen. + +Typ: Pod, Service. + +Name: Optional, um alle Ressourcen eines Typs zu kommentieren. + +Optionale Flags, wie `--namespace` . + +**Beispiel:** `kubectl get pods -n mynamespace` + +Dieser Befehl listet alle 'mynamespace' Pods auf. + +**Gewöhnliche Flaggen:** + +Verwenden Sie das Flag -n oder --namespace um den Namensraum anzugeben. + +Verwende `kubectl get pods -n mynamespace` mit -o oder --output für Ausgabeformate wie json oder yaml. Z.B. `kubectl get pod mypod json` + +**Übliche Fehler:** Ungültiger Namensraum oder Ausgabeformat können Serverfehler wie "Nicht gefunden" verursachen. + +## Cluster-Management und -Kontext + +### Cluster-Info anzeigen + +"kubectl cluster-info" + +Zeigt Cluster-Master- und Service-Endpunkte an. + +**Gewöhnliche Flaggen:** + +`--kubeconfig` Diese Option gibt die kubeconfig-Datei an. + +**Übliche Fehler:** Verbindung zum Server wegen Netzwerk- oder Verbindungsproblemen nicht möglich. + +**Beispiel:** `kubectl cluster-info --kubeconfig=/myconfig` + +### Kontext wechseln + +Wechselt einen Kontext zu einem anderen. + +`kubectl config use-context [context_name]` + +**Gewöhnliche Flaggen:** Die meiste Zeit wird ohne bestimmte Flaggen verwendet + +**Übliche Fehler:** + +`error: Kein Kontext mit dem Namen: [context_name]` : Falls Kontext nicht existiert. + +**Beispiel:** `kubectl config use-context staging-context` + +## Arbeiten mit Namensräumen + +Kubernetes Namensräume Segment und Verwaltung von Ressourcen. Wichtige Namespace Operationen sind unten. + +### Namensraum-Erstellung + +Dieser einfache Befehl erzeugt einen Kubernetes Namensraum. Aufgrund seiner spezifischen Funktionalität gibt es nur wenige Varianten und Flags. +**Beispiel:** + +Erstelle einen dev namespace unter Verwendung von `kubectl create namespace dev` + +**Übliche Fehler:** + +Versucht einen existierenden Namensraum zu erstellen. +**Gewöhnliche Flaggen:** + +- `--dry-run` zeigt den Namensraum an, ohne ihn zu erstellen. +- `-o [format]` Gibt Details im yaml oder json Format aus. + +### Namensraum-Liste + +Dieser Befehl zeigt alle Kubernetes Namensräume an. + +**Beispiel:** +Einfache Liste: `kubectl get namespaces` +Detaillierte Liste: `kubectl get namespaces -o wide` + +**Übliche Fehler:** +Falsche Flaggen oder Formate verwenden. + +**Gewöhnliche Flaggen:** + +- `-o breit`: Zeigt Namespace Details wie Alter. +- `-o json` oder `-o yaml` Die Details werden in JSON oder YAML ausgegeben. +- `--show-labels`: Es zeigt Namensraum-Labels an. + +### Namensraum löschen + +`kubectl löschen [namespace_name]` + +Dies entfernt einen Namensraum und seine Ressourcen. Seien Sie vorsichtig, da dies eine unumkehrbare Operation ist. + +**Beispiel:** +Du kannst den Testnamespace mit dem Befehl `Run kubectl delete namespace test` löschen + +**Übliche Fehler:** + +- Versucht ein System oder einen nicht existierenden Namensraum zu löschen. +- Namensraum-Ressourcen werden nicht migriert oder gesichert. + + **Gewöhnliche Flaggen:** + +* `--grace-period=[seconds]` Erlaubt das Setzen einer Gnadenfrist vor dem Löschen. +* Benutze `--force`, um den Namensraum vorausschauend zu löschen. +* `--cascade` : Legt fest, ob Namensraum-Ressourcen gelöscht werden sollen oder nicht. + +## Verwaltung von Pods und Bereitstellung + +### Pods erstellen + +Pods werden mit `kubectl run [pod_name] erstellt. --image=[image_name]` + +**Gewöhnliche Flaggen:** + +- `--env` Umgebungsvariablen konfigurieren. +- `-l, --labels` Labels den Pod. +- `--dry-run` pod-making simulieren. Es ist nützlich, um QA/Staging vor dem Einsatz in der Produktion zu testen. + +**Beispiel:** +Benutze das 'nginx' Bild um 'nginx-pod' `kubectl zu erstellen nginx-pod --image=nginx` + +**Üblicher Fehler:** +Der Fehler `Error: image not found` tritt auf, wenn das Containerbild nicht existiert. + +### Liste der Pods holen + +Zeige alle Pods im aktuell gesetzten Namensraum `kubectl get pods` + +**Gemeinsame Flaggen**: + +- `-o wide ` Um die Details wie den Knotennamen anzuzeigen. +- `--show-labels` Labels werden auch für jeden Pod angezeigt. + **Beispiel:** + `kubectl get pods -o wide` zeigt alle Pods mit all ihren Details. + +**Üblicher Fehler:** +Der `Keine Ressourcen gefunden` Fehler tritt auf, wenn der Namensraum keine Pods hat. + +### Lösche Pods + +Der Befehl zum Löschen eines Pods ist `kubectl delete pod [pod_name]` + +**Gewöhnliche Flaggen:** + +- `--grace-period`: Pause bevor du den Pod gewaltsam tötest. +- `--force`: Lösche pod sofort gewaltsam. + +**Beispiel:** + +"kubectl delete nginx-pod" entfernt 'nginx-pod'. + +**Üblicher Fehler:** +Ein häufiger Fehler ist `Pod nicht gefunden` wenn der Pod nicht existiert. + +### Erstelle Deployments + +Erstellt ein Deployment mit seinem Namen und Bild `kubectl erstelle Deployment [name] --image=[image]` + +**Gewöhnliche Flaggen:** + +- `--replicas` Gewünschte Anzahl an Repliken. +- Führen Sie `--dry-run` aus, um die Bereitstellung zu simulieren statt der eigentlichen Bereitstellung. + +**Beispiel:** +Benutze das 'nginx' Bild um 'nginx-deployment' zu erstellen `kubectl deployment nginx-deployment --image=nginx` + +**Üblicher Fehler:** Fehler im +Bildformat führen oft zu `Ungültiger Bildname` Fehlern. + +### Bereitstellungen auflisten + +Zeigt Namespace Deployments `kubectl get deployments` + +**Gewöhnliche Flaggen:** +`-o wide` Zeigt zusätzliche Details wie die Anzahl der Repliken. + +**Beispiel:** + +Zeigt alle Deployment `kubectl get deployments` an + +**Üblicher Fehler:** +Der `Keine Ressourcen gefunden` Fehler tritt auf, wenn der Namensraum keine Deployments hat. + +## **Dienstleistungen und Knoten** + +### Dienste verwalten + +Übersicht +`kubectl get services` hilft Benutzern schnell alle Kubernetes Cluster-Dienste und ihren Status anzuzeigen. + +**Gemeinsame Flaggen**: + +- `-o wide` : Stellt zusätzliche Details für jeden Service bereit. +- `--all-namespaces` Du kannst alle Dienste in allen Namensräumen sehen. +- \`--watch\`\`\`Überwachung der Service-Änderungen und Aktualisierungen. + +**Beispiel:** +`kubectl get services -o wide` +Dieser Befehl wird alle Standard-Namensraumdienste detailliert anzeigen. + +**Üblicher Fehler:** +"Dienst-Name" wurde nicht gefunden\`, um einen Dienstnamen falsch einzugeben oder einen nicht existierenden Dienst abzufragen. + +### Listenknoten + +Befehl `kubectl get nodes` zeigt alle Cluster-Knoten für Größe und Gesundheitsprüfung an. + +**Gewöhnliche Flaggen:** + +- `-o wide` zeigt zusätzliche Details wie IP-Adressen, Betriebssystem, Kernel-Version etc. an. +- `--selecto` Filterknoten per Label. +- `--showlabels` zeigt Knotenbeschriftungen. + +**Beispiel:** +`kubectl get nodes --selector=environment=production` Dieser Befehl zeigt alle Produktionsknoten an. + +**Üblicher Fehler:** +`Verbindung zum Server localhost:8080 verweigert` Normalerweise aufgrund fehlerhafter kubectl Konfiguration oder unzugänglicher Kubernetes Cluster. + +## Erweitertes Ressourcenmanagement + +### Kubectl Etiketten + +Kubernetes Etiketten sind Schlüssel-Wert-Paare auf Pods. Sie organisieren und wählen Objekt-Untergruppen aus. Der Befehl `kubectl get pods -l ` ruft Pods per Label ab. + +**Gewöhnliche Flaggen:** + +- `--l` oder `--selector`: Legt den Label-Selektor fest +- `--all-namespaces` durchsucht alle Namensräume +- `-o' oder `--output\` gibt das Format aus (yaml, json) + +**Beispiel:** +`kubectl get pods -l app=myApp` listet alle Pods mit dem Label "app" gleich myApp auf. + +**Üblicher Fehler**: +Falsche Labelnamen oder Werte führen oft zu keinem Ergebnis. Stellen Sie sicher, dass die Pod-Labels korrekt sind. + +### Verwendungen mit Kubectl skalieren + +Bei der Skalierung von Anwendungen wird die Anzahl der pod-Repliken (Instanzen) geändert. Der Befehl `kubectl scale` macht diese Magie. + +**Gewöhnliche Flaggen:** + +- `--replicas` Gibt die Anzahl der benötigten Kopien an +- `--current-replicas` Aktuelle Replikanzahl (fr bedingte Skalierung) +- `--timeout:`Zeit bis zur Fertigstellung des Skalierungsvorgangs zu warten + +**Beispiel:** + +`kubectl skaliert die Verteilung von myDeployment --replicas=5` skaliert myDeployment auf 5 Repliken. + +**Üblicher Fehler**: +Ein `deployment not found` Fehler tritt oft auf, wenn ein nicht vorhandenes oder falsch benanntes Deployment skaliert wird. Der Bereitstellungsname muss im aktuellen Namensraum liegen. + +## **Debuggen und Protokolle** + +### Log-Zugriff + +Kubernetes pod Logs können mit `kubectl logs [pod_name] ` abgerufen werden. Das Verständnis von pod-Laufenden Anwendungen und die Diagnose von Problemen erfordert diesen Befehl. + +**Beispiel:** +`kubectl logs my-app-pod` zeigen Logs des Pods namens "my-app-pod". + +**Üblicher Fehler:** +`Error from server (NotFound): pods "my-app-pod" not found` Dieser Fehler tritt auf, wenn der Kubernetes Cluster keinen Pod mit diesem Namen hat. + +### Bindungsprotokolle + +Du kannst Pod Logs mit `kubectl logs -f [pod_name] ` streamen oder "Schwanz". Dies ermöglicht die Überwachung von Log-Ausgängen in Echtzeit, insbesondere in dynamischen Umgebungen. + +**Beispiel:** +`kubectl logs -f my-app-pod` Logs aus dem Pod "my-app-pod" werden von diesem Befehl live gestreamt. + +**Üblicher Fehler:** +`Fehler vom Server (NotFound): Pods "my-app-pod" nicht gefunden`. Dieser Fehler bedeutet, dass der Kubernetes Cluster nicht den angegebenen Pod hat. + +## **Geheimnisse und ConfigMaps** + +### Geheimnisse erstellen + +Kubernetes Geheimnisse speichern und verwalten Passwörter, OAuth Token und ssh Schlüssel. Du kannst diese Geheimnisse einfach mit `kubectl erstellen geheime generische Geheimnisse [secret_name] --from-literal=[key]=[value]` + +**Gewöhnliche Flaggen:** + +- `--from-literal` Dieses Flag gibt geheime Daten als Schlüssel-Wert-Paare in der Befehlszeile an. +- `--from-file` Geheimnis aus einer Datei erstellen. In diesem Fall wird der Dateiname als der Schlüssel betrachtet und sein Inhalt wird der Wert sein. +- `--dry-run` Zeigt das Objekt an, das an den Cluster gesendet wird, ohne es tatsächlich zu senden. +- +- `--output` oder \`-o' setzt das Ausgabeformat (yaml oder json). + +**Beispiel:** +`kubectl erstelle geheimes generisches my-secret --from-literal=password=myStrongPassword` + +Dieser Befehl erstellt ein Geheimnis namens my-secret mit einem Eintrag: Passwort und myStrongPasswort. + +**Üblicher Fehler:** + +Falsche oder fehlerhafte Schlüssel-Wert-Paare sind üblich, wenn Sie Geheimnisse erstellen. Das nachfolgende Key=Value-Format ist unerlässlich. + +### ConfigMaps verwenden + +Kubernetes ConfigMaps speichert nicht vertrauliche Daten in Schlüsselwert-Paaren. Konfigurationsdateien, Kommandozeilenargumente, Umgebungsvariablen, Portnummern usw. können dort gespeichert werden. Das Format ist `kubectl create configmap [name] --from-literal=[key]=[value]` + +**Gewöhnliche Flaggen** + +Ähnlich wie das Erstellen von Geheimnissen (siehe oben) + +**Beispiel:** + +`kubectl erstelle configmap app-config --from-literal=app_mode=production` + +Eine ConfigMap mit dem Namen "app-config" mit app_mode auf die Produktion wird erstellt. + +**Üblicher Fehler:** + +Bei der Verwendung von `--from-file`, das Verweisen von nicht existierenden Dateien oder Verzeichnissen ist ein häufiger Fehler. Dateipfade überprüfen sind korrekt und zugänglich. + +## **Nützliche Tipps und Tricks** + +### Aliase für Effizienz + +Die Verwendung von Aliasen für kubectl kann den Arbeitsablauf beschleunigen, indem die Tastenanschläge für jeden Befehl reduziert werden. + +**Beispiel:** + +`Alias k=kubectl` +Du prüfst häufig den Pod Status. Mit dem Alias kannst du `k get pods` eintippen, anstatt das ganze Wort des Kubectls einzugeben. + +### Kubectl Autovervollständigung für schnellere Befehlsabwicklung + +Kubectl unterstützt die automatische Vervollständigung von Befehlszeilen und spart viel Zeit. Diese Funktion beschleunigt die Vervollständigung von Befehl, Argument und Ressourcennamen. + +**Automatische Einrichtung wird eingerichtet:** + +Quellcode des automatischen Vervollständigungsskripts in der Konfigurationsdatei Ihrer Shell . Für Bashh kannst du `source <(kubectl completion bash) `zu deiner `.bashrc` hinzufügen. Füge `source <(kubectl completion zsh)` zu deiner `.zshrc` Datei für zsh hinzu. + +Nach dem Einrichten eines Befehls wie `kubectl get pod` und drücken des Tab beendet diesen Befehl auf `kubectl get pods`. + +### Kubectl Port-Forward für lokale Zugriffsdienste verwenden + +Wenn Sie `kubectl port-forward` verwenden, können Sie auf interne Kubernetes Cluster-Dienste von Ihrem lokalen Rechner aus zugreifen und mit ihnen interagieren. + +**Beispiel:** + +Benutze `kubectl port-forward svc/my-web-app 5000:8080` um einen Cluster-Dienst auf Port 8080 zu leiten. + +Der Port 8080 des Dienstes empfängt den Datenverkehr vom Port 5000 Ihres lokalen Rechners, so dass Sie die Anwendung unter http\://localhost:5000 in Ihrem Browser abrufen können. + +## Schlussfolgerung + +Kubetcl ist ein sehr praktisches Tool, wenn Sie Ihre Anwendungen in Kubernetes verwalten möchten. Egal ob Sie ein Anfänger oder ein erfahrener Praktiker sind, dieser Leitfaden hilft Ihnen bei jedem Schritt Ihrer Kubernetes Reise, ob Sie einen Pod erstellen oder Ihren Cluster skalieren. + +Geben Sie besondere Aufmerksamkeit auf die verschiedenen Tipps und Tricks in diesem Artikel, weil sie sparen Sie viel Zeit und Aufwand. Wir empfehlen Ihnen, die in diesem Artikel genannten Befehle auszuprobieren und die Hände schmutzig zu bekommen; das ist der beste Weg, Kubectl. zu meistern. diff --git a/i18n/de/docusaurus-plugin-content-blog/authors.yml b/i18n/de/docusaurus-plugin-content-blog/authors.yml new file mode 100644 index 0000000000..cc19f743c1 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/authors.yml @@ -0,0 +1,15 @@ +endi: + name: Endilie Yacop Sucipto + title: Entwickler von Docusaurus + url: https://github.com/endiliey + image_url: https://github.com/endiliey.png +yangshun: + name: Yangshun Tay + title: Front-End-Ingenieur @ Facebook + url: https://github.com/yangshun + image_url: https://github.com/yangshun.png +slorber: + name: Se bastien Lorber + title: Docusaurus Betreuer + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png diff --git a/i18n/de/docusaurus-plugin-content-blog/options.json b/i18n/de/docusaurus-plugin-content-blog/options.json new file mode 100644 index 0000000000..766af69777 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-blog/options.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "Blog", + "description": "The title for the blog used in SEO" + }, + "description": { + "message": "Eine Ressource für ILLA, Front-End-Ökosystem und Web-Entwicklung", + "description": "The description for the blog used in SEO" + }, + "sidebar.title": { + "message": "Alle Beiträge", + "description": "The label for the left sidebar" + } +} diff --git a/i18n/de/docusaurus-theme-classic/footer.json b/i18n/de/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000000..b440f2b989 --- /dev/null +++ b/i18n/de/docusaurus-theme-classic/footer.json @@ -0,0 +1,34 @@ +{ + "link.title.Community": { + "message": "Community", + "description": "The title of the footer links column with title=Community in the footer" + }, + "link.title.More": { + "message": "Mehr", + "description": "The title of the footer links column with title=More in the footer" + }, + "link.item.label.Stack Overflow": { + "message": "Stack-Überlauf", + "description": "The label of footer link with label=Stack Overflow linking to https://stackoverflow.com/questions/tagged/docusaurus" + }, + "link.item.label.Discord": { + "message": "Discord", + "description": "The label of footer link with label=Discord linking to https://discordapp.com/invite/docusaurus" + }, + "link.item.label.Twitter": { + "message": "Twitter", + "description": "The label of footer link with label=Twitter linking to https://twitter.com/docusaurus" + }, + "link.item.label.Blog": { + "message": "Blog", + "description": "The label of footer link with label=Blog linking to /blog" + }, + "link.item.label.GitHub": { + "message": "GitHub", + "description": "The label of footer link with label=GitHub linking to https://github.com/facebook/docusaurus" + }, + "copyright": { + "message": "Copyright ©️ 2023 My Project, Inc. Built with Docusaurus.", + "description": "The footer copyright" + } +} diff --git a/i18n/de/docusaurus-theme-classic/navbar.json b/i18n/de/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000000..604c4ef8a3 --- /dev/null +++ b/i18n/de/docusaurus-theme-classic/navbar.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "ILLA", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "ILLA", + "description": "The alt text of navbar logo" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + } +} diff --git a/i18n/en/code.json b/i18n/en/code.json new file mode 100644 index 0000000000..207b7b3b95 --- /dev/null +++ b/i18n/en/code.json @@ -0,0 +1,604 @@ +{ + "footer.status": { + "message": "Status" + }, + "footer.roadmap": { + "message": "Roadmap" + }, + "footer.changelog": { + "message": "Changelog" + }, + "footer.media": { + "message": "Media Kit" + }, + "footer.drive": { + "message": "ILLA Drive" + }, + "footer.cloud": { + "message": "ILLA AI" + }, + "footer.selfhost": { + "message": "Self host" + }, + "footer.table": { + "message": "Table" + }, + "footer.chart": { + "message": "Chart" + }, + "footer.upload": { + "message": "Upload" + }, + "footer.switch": { + "message": "Switch" + }, + "footer.select": { + "message": "Select" + }, + "footer.radio_group": { + "message": "Radio Group" + }, + "footer.checkbox_group": { + "message": "Checkbox Group" + }, + "footer.pdf": { + "message": "PDF" + }, + "footer.video": { + "message": "Video" + }, + "footer.mysql": { + "message": "MySQL" + }, + "footer.postgre": { + "message": "PostgreSQL" + }, + "footer.mongodb": { + "message": "MongoDB" + }, + "footer.firebase": { + "message": "Firebase" + }, + "footer.elasticsearch": { + "message": "Elastic Search" + }, + "footer.mssql": { + "message": "Microsoft SQL Server" + }, + "footer.supabase": { + "message": "Supabase" + }, + "footer.dynamo": { + "message": "DynamoDB" + }, + "footer.hf": { + "message": "Hugging Face Inference API" + }, + "footer.components": { + "message": "Components" + }, + "footer.integrations": { + "message": "Integrations" + }, + "footer.product": { + "message": "Products" + }, + "footer.company": { + "message": "Company" + }, + "footer.community": { + "message": "Community" + }, + "slogan-1": { + "message": "Build AI Driven Business App" + }, + "footer.privacy-policy": { + "message": "Privacy policy" + }, + "footer.terms-of-service": { + "message": "Terms of service" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Blog list page navigation", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Newer Entries", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Older Entries", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "nav.product": { + "message": "Products" + }, + "sub_nav.product.drive": { + "message": "ILLA Drive" + }, + "sub_nav.product.cloud": { + "message": "ILLA AI" + }, + "sub_nav.product.selfhost": { + "message": "Self Host" + }, + "nav.resource": { + "message": "Resource" + }, + "sub_nav.resource.integrations": { + "message": "Integrations" + }, + "sub_nav.resource.components": { + "message": "Components" + }, + "nav.pricing": { + "message": "Pricing" + }, + "nav.doc": { + "message": "Doc" + }, + "nav.blog": { + "message": "Blog" + }, + "nav.marketplace": { + "message": "Marketplace" + }, + "nav.contact": { + "message": "Book demo" + }, + "footer.less": { + "message": "Show less" + }, + "footer.more": { + "message": "Show more" + }, + "theme.blog.post.readingTime.plurals": { + "message": "One min read|{readingTime} min read", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "call-to-action.title": { + "message": "Start Building Apps with ILLA Cloud" + }, + "call-to-action.desc": { + "message": "Any internal tool you need can be built using ILLA Cloud in 1 minute." + }, + "call-to-action.button-1": { + "message": "Try Cloud for free" + }, + "call-to-action.button-2": { + "message": "sign in with GitHub" + }, + "title.github": { + "message": "Github" + }, + "title.stars": { + "message": "Stars" + }, + "title.star-us": { + "message": "Star us" + }, + "description": { + "message": "Empower your team with AI Agent and advanced low-code tools to create business apps" + }, + "illa-Cloud": { + "message": "Get start" + }, + "starts": { + "message": "Starts" + }, + "stars": { + "message": "Starts" + }, + "join-community": { + "message": "Join Discord" + }, + "content.all.title": { + "message": "ILLA Cloud integrates everything" + }, + "how_to_use.title.3_steps_to_customize": { + "message": "steps to customize your AI tools" + }, + "how_to_use.description.build_tools_through": { + "message": "Build tools through drag-and-drop components, customize your AI Agent, connect to your data sources, and make AI a smart tool tailored to your needs and data, making your work more intelligent." + }, + "how_to_use.step1_title.create_ai_agent_for": { + "message": "Create AI Agent for a specific purpose" + }, + "how_to_use.step1_description.you_can_create_an_ai": { + "message": "You can create an AI Agent for a specific purpose and make it more helpful at specific tasks, at work, or in your daily life. " + }, + "how_to_use.step1_button.ai_agent_marketplace": { + "message": "AI Agent Marketplace" + }, + "how_to_use.step2_title.build_the_frontend_p": { + "message": "Build the frontend page in a few minutes" + }, + "how_to_use.step2_description.by_dragging_and_drop": { + "message": "By dragging and dropping components, you can quickly build the interface of the tool and implement any functionality you desire." + }, + "how_to_use.step2_button.illa_app_marketplace": { + "message": "ILLA App Marketplace" + }, + "how_to_use.step3_title.connect_to_your_data": { + "message": "Connect to your data sources and AI Agents" + }, + "how_to_use.step3_description.enable_data_integrat": { + "message": "Enable data integration and automation. AI Agent will perform specific tasks based on your requirements and data." + }, + "how_to_use.step3_button.supported_data_sourc": { + "message": "Supported data sources" + }, + "testimonial.title.user_testimonials": { + "message": "User Testimonials" + }, + "testimonial.testimonial1_content.illa_cloud_has_been": { + "message": "ILLA Cloud has been a game-changer for me. It helps me generate highly efficient content in less time. The customized AI Agent and App perfectly cater to my business needs." + }, + "testimonial.testimonial1_username.christopher": { + "message": "Christopher" + }, + "testimonial.testimonial1_usertitle.seo_specialist": { + "message": "SEO Specialist" + }, + "testimonial.testimonial2_content.i_think_i_become_a_b": { + "message": "I think I become a BlogMaster now! This tool has revolutionized my content generation process, saving me valuable time. Whether it's generating blog ideas or structuring articles, the AI Agents have been a tremendous asset to me and my team." + }, + "testimonial.testimonial2_username.lucas": { + "message": "Lucas" + }, + "testimonial.testimonial2_usertitle.content_strategist": { + "message": "Content Strategist" + }, + "testimonial.testimonial3_content.it_empowers_me_to_pr": { + "message": "It empowers me to provide exceptional customer support with minimal effort. The pre-built AI Agent and App, along with the ability to customize them for our specific needs, have significantly enhanced our team's effectiveness." + }, + "testimonial.testimonial3_username.harper": { + "message": "Harper" + }, + "testimonial.testimonial3_usertitle.customer_service_man": { + "message": "Customer Service Manager" + }, + "testimonial.testimonial4_content.ai_agent_low_code": { + "message": "AI Agent & low-code has transformed my email writing process. It streamlines the creation of impactful emails, enabling me to craft engaging and persuasive messages effortlessly. ILLA Cloud has elevated our email communication to new heights." + }, + "testimonial.testimonial4_username.abigail": { + "message": "Abigail" + }, + "testimonial.testimonial4_usertitle.communication_specia": { + "message": "Communication Specialist" + }, + "testimonial.testimonial5_content.i_need_to_oversee_va": { + "message": "I need to oversee various aspects of my company. ILLA Cloud provides me with a comprehensive solution. It not only saves me time and effort in development and design but also allows me to manage and monitor my business better. " + }, + "testimonial.testimonial5_username.matthew": { + "message": "Matthew" + }, + "testimonial.testimonial5_usertitle.business_founder": { + "message": "Business Founder" + }, + "testimonial.testimonial6_content.using_illa_cloud_to": { + "message": "Using ILLA Cloud to build a management dashboard has been incredibly easy. After just one day of work, we were able to accomplish tasks such as monitoring project progress and allocating resources within this dashboard." + }, + "testimonial.testimonial6_username.samuel": { + "message": "Samuel" + }, + "testimonial.testimonial6_usertitle.website_administrato": { + "message": "Website Administrator" + }, + "customer.title": { + "message": "Trusted by thousands of teams" + }, + "template.title.quickly_start_from_a": { + "message": "Quickly start from a template" + }, + "template.button.explore_more_templat": { + "message": "Explore more templates" + }, + "template.template1_title.car_rental_admin_pan": { + "message": "Car rental admin panel" + }, + "template.template1_description.build_for_car_rental": { + "message": "Build for car rental companies to identify and track trends in vehicle usage, costs, and servicing" + }, + "template.template1_button.learn_more": { + "message": "Learn more" + }, + "template.template2_title.cms_with_content_gen": { + "message": "CMS with content generation" + }, + "template.template2_description.build_for_business_o": { + "message": "Build for business operations teams to create and manage content more efficiently" + }, + "template.template2_button.learn_more": { + "message": "Learn more" + }, + "template.template3_title.applicant_tracking": { + "message": "Applicant tracking" + }, + "template.template3_description.build_for_the_human": { + "message": "Build for the human resources team to collect resumes and track progress" + }, + "template.template3_button.learn_more": { + "message": "Learn more" + }, + "solutions.title.how_illa_ai_improves": { + "message": "How ILLA AI Improves Work Practices" + }, + "theme.blog.post.readMore": { + "message": "Read More", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Read more about {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "solutions.illa_title.illa_ai": { + "message": "ILLA Cloud" + }, + "solutions.human_title.human_work": { + "message": "Human work" + }, + "theme.ErrorPageContent.title": { + "message": "This page crashed.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.blog.archive.title": { + "message": "Archive", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archive", + "description": "The page & hero description of the blog archive page" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Scroll back to top", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Blog post page navigation", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Newer Post", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Older Post", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "One post|{count} posts", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} tagged with \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "View All Tags", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "Switch between dark and light mode (currently {mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "dark mode", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "light mode", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Breadcrumbs", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} items", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Docs pages", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Previous", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Next", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "One doc tagged|{count} docs tagged", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} with \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Version: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "This is unreleased documentation for {siteTitle} {versionLabel} version.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "latest version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Edit this page", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Direct link to {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " on {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " by {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Last updated{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versions", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "Page Not Found", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "Tags:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "caution", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "danger", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "note", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "tip", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "warning", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Close", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Blog recent posts navigation", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "Copied", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Copy code to clipboard", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "Copy", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Toggle word wrap", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Expand sidebar category '{label}'", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Collapse sidebar category '{label}'", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "Main", + "description": "The ARIA label for the main navigation" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Languages", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.NotFound.p1": { + "message": "We could not find what you were looking for.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "On this page", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.docs.breadcrumbs.home": { + "message": "Home page", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Collapse sidebar", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Collapse sidebar", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Docs sidebar", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Close navigation bar", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Back to main menu", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Toggle navigation bar", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Try again", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Skip to main content", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Tags", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "Unlisted page", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "This page is unlisted. Search engines will not index it, and only users having a direct link can access it.", + "description": "The unlisted content banner message" + } +} diff --git a/i18n/en/docusaurus-plugin-content-blog/options.json b/i18n/en/docusaurus-plugin-content-blog/options.json new file mode 100644 index 0000000000..4b2a56d2ed --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-blog/options.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "Blog", + "description": "The title for the blog used in SEO" + }, + "description": { + "message": "A resource for ILLA, front-end ecosystem, and web development", + "description": "The description for the blog used in SEO" + }, + "sidebar.title": { + "message": "All posts", + "description": "The label for the left sidebar" + } +} diff --git a/i18n/en/docusaurus-theme-classic/footer.json b/i18n/en/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000000..6b6e6e7550 --- /dev/null +++ b/i18n/en/docusaurus-theme-classic/footer.json @@ -0,0 +1,34 @@ +{ + "link.title.Community": { + "message": "Community", + "description": "The title of the footer links column with title=Community in the footer" + }, + "link.title.More": { + "message": "More", + "description": "The title of the footer links column with title=More in the footer" + }, + "link.item.label.Stack Overflow": { + "message": "Stack Overflow", + "description": "The label of footer link with label=Stack Overflow linking to https://stackoverflow.com/questions/tagged/docusaurus" + }, + "link.item.label.Discord": { + "message": "Discord", + "description": "The label of footer link with label=Discord linking to https://discordapp.com/invite/docusaurus" + }, + "link.item.label.Twitter": { + "message": "Twitter", + "description": "The label of footer link with label=Twitter linking to https://twitter.com/docusaurus" + }, + "link.item.label.Blog": { + "message": "Blog", + "description": "The label of footer link with label=Blog linking to /blog" + }, + "link.item.label.GitHub": { + "message": "GitHub", + "description": "The label of footer link with label=GitHub linking to https://github.com/facebook/docusaurus" + }, + "copyright": { + "message": "Copyright © 2023 My Project, Inc. Built with Docusaurus.", + "description": "The footer copyright" + } +} diff --git a/i18n/en/docusaurus-theme-classic/navbar.json b/i18n/en/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000000..604c4ef8a3 --- /dev/null +++ b/i18n/en/docusaurus-theme-classic/navbar.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "ILLA", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "ILLA", + "description": "The alt text of navbar logo" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + } +} diff --git a/i18n/ja/code.json b/i18n/ja/code.json new file mode 100644 index 0000000000..4314e21538 --- /dev/null +++ b/i18n/ja/code.json @@ -0,0 +1,604 @@ +{ + "footer.status": { + "message": "ステータス" + }, + "footer.roadmap": { + "message": "ロードマップ" + }, + "footer.changelog": { + "message": "更新履歴" + }, + "footer.media": { + "message": "メディアキット" + }, + "footer.drive": { + "message": "ILLAドライブ" + }, + "footer.cloud": { + "message": "ILLA AI" + }, + "footer.selfhost": { + "message": "自己ホスト" + }, + "footer.table": { + "message": "表" + }, + "footer.chart": { + "message": "グラフ" + }, + "footer.upload": { + "message": "アップロード" + }, + "footer.switch": { + "message": "切り替え" + }, + "footer.select": { + "message": "選択" + }, + "footer.radio_group": { + "message": "無線グループ" + }, + "footer.checkbox_group": { + "message": "チェックボックスグループ" + }, + "footer.pdf": { + "message": "PDF" + }, + "footer.video": { + "message": "ビデオ" + }, + "footer.mysql": { + "message": "MySQL" + }, + "footer.postgre": { + "message": "PostgreSQL" + }, + "footer.mongodb": { + "message": "MongoDB" + }, + "footer.firebase": { + "message": "Firebase" + }, + "footer.elasticsearch": { + "message": "Elastic Search" + }, + "footer.mssql": { + "message": "Microsoft SQL Server" + }, + "footer.supabase": { + "message": "Supabase" + }, + "footer.dynamo": { + "message": "DynamoDB" + }, + "footer.hf": { + "message": "顔推論API をハグする" + }, + "footer.components": { + "message": "コンポーネント" + }, + "footer.integrations": { + "message": "統合" + }, + "footer.product": { + "message": "商品" + }, + "footer.company": { + "message": "会社名" + }, + "footer.community": { + "message": "コミュニティ" + }, + "slogan-1": { + "message": "AI駆動型ビジネスアプリを構築" + }, + "footer.privacy-policy": { + "message": "プライバシーポリシー" + }, + "footer.terms-of-service": { + "message": "利用規約" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "ブログ一覧ページのナビゲーション", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "新しい項目", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "古い項目", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "nav.product": { + "message": "商品" + }, + "sub_nav.product.drive": { + "message": "ILLAドライブ" + }, + "sub_nav.product.cloud": { + "message": "ILLA AI" + }, + "sub_nav.product.selfhost": { + "message": "自己ホスト" + }, + "nav.resource": { + "message": "リソース" + }, + "sub_nav.resource.integrations": { + "message": "統合" + }, + "sub_nav.resource.components": { + "message": "コンポーネント" + }, + "nav.pricing": { + "message": "価格" + }, + "nav.doc": { + "message": "Doc" + }, + "nav.blog": { + "message": "ブログ" + }, + "nav.marketplace": { + "message": "市場" + }, + "nav.contact": { + "message": "デモを予約する" + }, + "footer.less": { + "message": "表示を減らす" + }, + "footer.more": { + "message": "詳細を表示" + }, + "theme.blog.post.readingTime.plurals": { + "message": "1分間の読み取り|{readingTime} 分間の読み取り", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "call-to-action.title": { + "message": "ILLA クラウドを使ったアプリの構築を開始" + }, + "call-to-action.desc": { + "message": "必要なあらゆる内部ツールは、ILLA Cloud を使用して1分で構築できます。" + }, + "call-to-action.button-1": { + "message": "無料でクラウドを試す" + }, + "call-to-action.button-2": { + "message": "GitHub でサインイン" + }, + "title.github": { + "message": "Github" + }, + "title.stars": { + "message": "星" + }, + "title.star-us": { + "message": "星印を付ける" + }, + "description": { + "message": "AI Agent と高度なローコードツールを使用してビジネスアプリを作成できるようにします" + }, + "illa-Cloud": { + "message": "始めよう" + }, + "starts": { + "message": "開始" + }, + "stars": { + "message": "開始" + }, + "join-community": { + "message": "Discord に参加" + }, + "content.all.title": { + "message": "ILLA Cloud はすべてを統合しました" + }, + "how_to_use.title.3_steps_to_customize": { + "message": "AIツールをカスタマイズする手順" + }, + "how_to_use.description.build_tools_through": { + "message": "ドラッグ&ドロップのコンポーネントを使用してツールを構築し、AI エージェントをカスタマイズし、データソースに接続します。 AIをニーズやデータに合わせたスマートツールとして活用することで、よりインテリジェントな作業を実現します。" + }, + "how_to_use.step1_title.create_ai_agent_for": { + "message": "特定の目的のためにAIエージェントを作成する" + }, + "how_to_use.step1_description.you_can_create_an_ai": { + "message": "特定の目的のためにAIエージェントを作成し、特定のタスク、仕事、または日常生活でより役に立つようにすることができます。 " + }, + "how_to_use.step1_button.ai_agent_marketplace": { + "message": "AIエージェントマーケットプレイスformat@@0" + }, + "how_to_use.step2_title.build_the_frontend_p": { + "message": "数分でフロントエンドページを構築する" + }, + "how_to_use.step2_description.by_dragging_and_drop": { + "message": "コンポーネントをドラッグ&ドロップすることで、ツールのインターフェイスを素早く構築し、任意の機能を実装できます。" + }, + "how_to_use.step2_button.illa_app_marketplace": { + "message": "ILLAアプリ市場" + }, + "how_to_use.step3_title.connect_to_your_data": { + "message": "データソースとAIエージェントに接続" + }, + "how_to_use.step3_description.enable_data_integrat": { + "message": "AIエージェントは、お客様の要件とデータに基づいて特定のタスクを実行します。" + }, + "how_to_use.step3_button.supported_data_sourc": { + "message": "サポートされているデータソース" + }, + "testimonial.title.user_testimonials": { + "message": "ユーザーの声" + }, + "testimonial.testimonial1_content.illa_cloud_has_been": { + "message": "ILLA Cloud は私にとってゲームチェンジャーであり、効率的なコンテンツを短時間で生成するのに役立ちます。 カスタマイズされたAIエージェントとアプリは、私のビジネスニーズに完全に対応します。" + }, + "testimonial.testimonial1_username.christopher": { + "message": "クリストファー" + }, + "testimonial.testimonial1_usertitle.seo_specialist": { + "message": "SEO Specialist" + }, + "testimonial.testimonial2_content.i_think_i_become_a_b": { + "message": "私は今BlogMasterになったと思います! このツールは私のコンテンツ生成プロセスに革命をもたらし、私に貴重な時間を節約しました。 ブログのアイデアを生み出しているのか、記事を構成しているのかに関わらず、AIエージェントは私と私のチームにとって大きな資産となっています。" + }, + "testimonial.testimonial2_username.lucas": { + "message": "Lucas" + }, + "testimonial.testimonial2_usertitle.content_strategist": { + "message": "コンテンツ戦略家" + }, + "testimonial.testimonial3_content.it_empowers_me_to_pr": { + "message": "最小限の労力で優れたカスタマーサポートを提供することができます。 あらかじめ構築されたAIエージェントとアプリは、特定のニーズに合わせてカスタマイズする機能とともに、チームの効率性を大幅に向上させました。" + }, + "testimonial.testimonial3_username.harper": { + "message": "Harper" + }, + "testimonial.testimonial3_usertitle.customer_service_man": { + "message": "カスタマーサービスマネージャー" + }, + "testimonial.testimonial4_content.ai_agent_low_code": { + "message": "AIエージェントとローコードは、電子メールの書き込みプロセスを変換しました。 インパクトのある電子メールの作成を合理化することで、私は魅力的で説得力のあるメッセージを簡単に作成することができます。 ILLA クラウドは、当社の電子メール通信を新たな高みに高めました。" + }, + "testimonial.testimonial4_username.abigail": { + "message": "Abigail" + }, + "testimonial.testimonial4_usertitle.communication_specia": { + "message": "通信スペシャリスト" + }, + "testimonial.testimonial5_content.i_need_to_oversee_va": { + "message": "会社の様々な側面を監督する必要があります。ILLA Cloud は私に包括的なソリューションを提供してくれます。 開発と設計に時間と労力を節約するだけでなく、自分のビジネスをより良く管理し、監視することもできます。 " + }, + "testimonial.testimonial5_username.matthew": { + "message": "Matthew" + }, + "testimonial.testimonial5_usertitle.business_founder": { + "message": "ビジネス創業者" + }, + "testimonial.testimonial6_content.using_illa_cloud_to": { + "message": "ILLA Cloud を使用して管理ダッシュボードを構築するのは非常に簡単でした。 たった1日で、プロジェクトの進捗を監視したり、このダッシュボード内でリソースを割り当てたりといったタスクを達成することができました。" + }, + "testimonial.testimonial6_username.samuel": { + "message": "サミュエル" + }, + "testimonial.testimonial6_usertitle.website_administrato": { + "message": "ウェブサイト管理者" + }, + "customer.title": { + "message": "何千ものチームに信頼されています" + }, + "template.title.quickly_start_from_a": { + "message": "テンプレートからすばやく開始" + }, + "template.button.explore_more_templat": { + "message": "テンプレートをもっと見る" + }, + "template.template1_title.car_rental_admin_pan": { + "message": "レンタカー管理パネル" + }, + "template.template1_description.build_for_car_rental": { + "message": "レンタカー会社を構築して、車両の使用状況、コスト、およびサービスの傾向を特定して追跡する" + }, + "template.template1_button.learn_more": { + "message": "もっと詳しく" + }, + "template.template2_title.cms_with_content_gen": { + "message": "コンテンツ生成を伴うCMS" + }, + "template.template2_description.build_for_business_o": { + "message": "より効率的にコンテンツを作成および管理するためのビジネスオペレーションチームを構築します" + }, + "template.template2_button.learn_more": { + "message": "もっと詳しく" + }, + "template.template3_title.applicant_tracking": { + "message": "申請者の追跡" + }, + "template.template3_description.build_for_the_human": { + "message": "人事チームを建設して、履歴書を集めて進捗状況を追跡しましょう" + }, + "template.template3_button.learn_more": { + "message": "もっと詳しく" + }, + "solutions.title.how_illa_ai_improves": { + "message": "ILLA AIが作業慣行を改善する方法" + }, + "theme.blog.post.readMore": { + "message": "続きを読む", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "{title} についてもっと読む", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "solutions.illa_title.illa_ai": { + "message": "ILLA Cloud" + }, + "solutions.human_title.human_work": { + "message": "人間の仕事" + }, + "theme.ErrorPageContent.title": { + "message": "このページはクラッシュしました。", + "description": "The title of the fallback page when the page crashed" + }, + "theme.blog.archive.title": { + "message": "アーカイブ", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "アーカイブ", + "description": "The page & hero description of the blog archive page" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "トップに戻る", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "ブログ投稿ページのナビゲーション", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "新しい投稿", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "以前の投稿", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "1 つの投稿|{count} 投稿", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} は \"{tagName} \" でタグ付けされています", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "すべてのタグを表示", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "ダークモードとライトモードを切り替える (現在の {mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "ダークモード", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "ライトモード", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "パンくずリスト", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} アイテム", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "ドキュメントページ", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "前", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "次へ", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "タグ付けされたドキュメント|{count} ドキュメント", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "「{nDocsTagged} 」の{tagName}", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "バージョン: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "これは、 {siteTitle} {versionLabel} バージョンの未リリースのドキュメントです。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "これは {siteTitle} {versionLabel}のドキュメントであり、現在アクティブにメンテナンスされていません。", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "最新のドキュメントについては、 {latestVersionLink} ({versionLabel} ) を参照してください。", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新バージョン", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "このページを編集", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "{heading} への直接リンク", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " 作成者: {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "最終更新{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "バージョン", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "ページが見つかりません", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "タグ:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "注意", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "危険", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "情報", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "メモ", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "tip", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "警告", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "閉じる", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "ブログの最近の投稿ナビゲーション", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "コピーしました", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "クリップボードにコードをコピー", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "コピー", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "ワードラップの切り替え", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "サイドバーカテゴリ '{label} ' を展開", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "サイドバーカテゴリ「{label}」を閉じる", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "メイン", + "description": "The ARIA label for the main navigation" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "言語", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.NotFound.p1": { + "message": "お探しのものが見つかりませんでした。", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "元のURLにリンクしたサイトの所有者に連絡し、リンクが切れていることを知らせてください。", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "このページ", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.docs.breadcrumbs.home": { + "message": "ホームページ", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "サイドバーを閉じる", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "サイドバーを閉じる", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Docs sidebar", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "ナビゲーションバーを閉じる", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "→ メインメニューに戻る", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "ナビゲーションバーの切り替え", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "もう一度やり直してください", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "メインコンテンツにスキップ", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "タグ", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "リストされていないページ", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "このページはリストされていません。検索エンジンはインデックスを作成せず、ダイレクトリンクを持つユーザーのみがアクセスできます。", + "description": "The unlisted content banner message" + } +} diff --git a/i18n/ja/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md b/i18n/ja/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md new file mode 100644 index 0000000000..f2697fb3cb --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md @@ -0,0 +1,14 @@ +--- +slug: first-blog-post +title: 最初のブログ投稿 +authors: + name: Gao Wei + title: Docusaurusコアチーム + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +tags: + - hola + - docusaurus +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/i18n/ja/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md b/i18n/ja/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md new file mode 100644 index 0000000000..edd55cedeb --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md @@ -0,0 +1,46 @@ +--- +slug: long blog-post +title: ロングブログ投稿 +authors: endi +tags: + - こんにちは + - docusaurus +--- + +これは非常に長いブログ記事の概要です + +``コメントを使用して、リストビューでブログの投稿サイズを制限します。 + + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/i18n/ja/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx b/i18n/ja/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx new file mode 100644 index 0000000000..f19cd198fa --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx @@ -0,0 +1,22 @@ +--- +slug: mdx-blog-post +title: MDXブログ投稿 +authors: + - slorber +tags: + - docusaurus +--- + +Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). + +:::tip + +React の機能を使用してインタラクティブなブログ記事を作成します。 + +```js + +``` + + + +::: diff --git a/i18n/ja/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/i18n/ja/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg new file mode 100644 index 0000000000..11bda09284 Binary files /dev/null and b/i18n/ja/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg differ diff --git a/i18n/ja/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md b/i18n/ja/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md new file mode 100644 index 0000000000..2b912a006f --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md @@ -0,0 +1,30 @@ +--- +slug: いらっしゃいませ +title: ようこそ +authors: + - slorber + - yangshun +tags: + - facebook + - こんにちは + - docusaurus +--- + +[Docusaurus blogging features](https://docusaurus.io/docs/blog) はformat@@0(https\://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog)によって支えられています。 + +`blog`ディレクトリにMarkdownファイル(またはフォルダ)を追加するだけです。 + +ブログの作者は `authors.yml` に追加できます。 + +ブログ投稿の日付は以下のようなファイル名から抽出できます: + +- `2019-05-30-welcome.md` +- `2019-05-30-welcome/index.md` + +ブログ投稿の画像を共有するには、ブログ投稿フォルダが便利です。 + +![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) + +ブログもタグをサポートしています! + +\*\*ブログが欲しくない場合は、このディレクトリを削除して、Docusaurusの設定で`blog: false`を使用してください。 diff --git a/i18n/ja/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md b/i18n/ja/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md new file mode 100644 index 0000000000..e5b2f4b36e --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md @@ -0,0 +1,175 @@ +--- +title: Building a Complete React CRM App with Refine, Ant Design and GraphQL +description: We'll explore the key features of our CRM app, the technologies we used. +slug: react-crm-with-refine +tags: + - refine + - react +authors: + name: Gao Wei + title: Docusaurus Core Team + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +is_featured: true +image: https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-02-refine-crm-overview/social.jpg +hide_table_of_contents: false +--- + +![Image description](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/crm-general.gif) + +I want to introduce our newest example app – a full-fledged React CRM (Customer Relationship Management) application built using refine, Ant Design, and GraphQL. + +👉 [Live Demo](https://example.crm.refine.dev/) + +👉 [You can find the source code on GitHub here](https://github.com/refinedev/refine/tree/master/examples/app-crm) + +This example is open-source, which means anyone can freely utilize and customize the source code as they see fit. It's not just another application; it's a comprehensive solution that boasts all the features and functionalities required for an accurate enterprise-level application. + +Moreover, this application serves as a guiding light for all developers. Whether you're a seasoned pro or just starting, our project is a valuable resource that can be used as a reference to better understand best practices and modern development techniques. + +We'll publish an article series and Video tutorials on YouTube on building this CRM app from scratch. You can follow the refine to get notified when it's ready! + +Twitter: https\://twitter.com/refine_dev +GitHub: https\://github.com/refinedev/refine + +## Introduction + +This article briefly overviews the CRM application built using refine, an open-source React framework designed for rapidly developing web applications. + +We'll explore the key features of our CRM app, the technologies we used, and how you can adapt this template for various business needs. + +Step we'll cover: + +- [Key Features of the CRM App](#key-features-of-the-crm-app) +- [Technologies Used](#technologies-used) +- [Best Practices and Ecosystem Integration](#best-practices-and-ecosystem-integration) +- [Where Can You Use This CRM As A Reference Template?](#where-can-you-use-this-crm-as-a-reference-template) + +## Key Features of the CRM App + +Our CRM application is feature-rich and comes with everything you need to manage customer relationships efficiently: + +### Dashboard + +The Dashboard provides an at-a-glance overview of your CRM activities. It displays key metrics, recent customer interactions, and upcoming events, offering valuable insights to help you make informed decisions. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/halx7sfl9ctke1fu3w35.png) + +
+
+ +### Calendar Integration + +Effortlessly manage appointments, meetings, and important events with the integrated Calendar feature. Stay organized and ensure you never miss a crucial interaction with your customers. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2v8ghazuheiznefwat9.png) + +
+
+ +### Scrumboard-Project Kanban + +Our Scrumboard or Project Kanban page streamlines project management. Visualize project progress, manage tasks, and facilitate team collaboration with ease. Move tasks through customizable boards to keep your projects on track. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hcll7tbqx3t71i6v7a9.png) + +
+
+ +### Sales Pipeline + +Effectively manage your sales process from lead generation to deal closure. The Sales Pipeline provides a visual representation of your sales stages, helping your team prioritize leads and track conversions. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5uoj722wasvw2fx8z49.png) + +
+
+ +### Companies + +The Companies page allows you to organize and categorize your business contacts. Maintain detailed profiles for each company, including contact information, communication history, and associated contacts. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gjlahcc1icfthu2n31ar.png) + +
+
+ +### Contacts + +Manage individual contacts efficiently using the Contacts page. Keep track of customer interactions, schedule follow-ups, and access critical contact information quickly. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4c0ef7tv7nktax4gt3oz.png) + +
+
+ +### Quotes + +Create, send, and manage quotes seamlessly with the Quotes feature. Generate professional quotes for your customers, track their status, and convert them into sales. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rqj0pzgkrure7ov5mr9.png) + +
+
+ +### Administration + +The Administration section empowers you to configure and customize your CRM application to suit your specific business needs. Manage user roles, access permissions, and system settings effortlessly. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5deq6ceue79kloeuryz.png) + +
+ +### Authentication & Authorization + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m1r04i2h0cf1jegasbte.png) + +This example app is a comprehensive set of features that ensures you can streamline your customer interactions, project management, and sales processes, all within a single, user-friendly platform. Whether you're managing contacts, tracking sales, or overseeing projects, our CRM app provides the tools you need for success. + +## Technologies Used + +Our CRM app's modular structure and use of open-source tools make it adaptable to various business needs. So you can build all kinds of web apps like internal tools, admin panels, or dashboards on top of it. + +To bring our CRM app to life, we leveraged several cutting-edge technologies: + +### 1. refine + +[refine](https://github.com/refinedev/refine) served as the backbone of our CRM application. It offers a wide range of tools and components for easily building data-intensive applications. + +refine's internal hooks and components simplify the development process and eliminate repetitive tasks by providing industry-standard solutions for crucial aspects of a project, including authentication, access control, routing, networking, state management, and i18n. + +### 2. Ant Design + +[Ant Design](https://ant.design/), a popular UI library, provided the sleek and responsive user interface that our CRM app needed. Its pre-built components saved us time and effort. + +It's consistent and polished UI components ensured a professional and user-friendly interface. refine has a built-in integration for Ant Design. + +### 3. GraphQL + +We used [GraphQL](https://graphql.org/) for effective data retrieval and updating from our server. Additionally, we integrated [GraphQL Subscriptions](https://www.apollographql.com/docs/react/data/subscriptions/) to manage real-time modifications. + +For instance, on the Project Kanban page, tasks get updated automatically when cards are dragged and dropped between sections. + +![Image](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/real-time.gif) + +GraphQL's efficient data-fetching capabilities made working with large datasets a breeze. It's flexibility allowed us to tailor our queries to our exact requirements. + +refine has built-in data provider support for GraphQL.You can set it up during the project creation phase. + +## Best Practices and Ecosystem Integration + +Throughout the development process, we adhered to best practices and incorporated elements from the broader ecosystem. This ensures our CRM app is not only functional but also scalable and maintainable. + +The group responsible for the CRM example app is the core refine framework team. Feel free to explore the best practices within the ecosystem! + +## Where Can You Use This CRM As A Reference Template? + +Our CRM template isn't limited to just one use case. You can adapt it for various purposes, including: + +- **B2B Applications**: Streamline customer interactions in a business-to-business context. +- **Internal Tools**: Use it as an internal tool to manage employee or departmental tasks and interactions. +- **All CRUD Applications**: The template's versatility means it can serve as the foundation for creating all sorts of CRUD applications. + +## Conclusion + +In this article, we've introduced you to our CRM application built with refine. We've highlighted its key features, the technologies we used, and the advantages of our approach. With this CRM template, you have the power to tailor your customer relationship management system to meet your unique business needs. Whether you're running a B2B operation, need an efficient internal tool, or want a versatile CRUD application, our CRM template has you covered. diff --git a/i18n/ja/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md b/i18n/ja/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md new file mode 100644 index 0000000000..6c912ff950 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md @@ -0,0 +1,397 @@ +--- +title: クベックルチートシート - 例あり +description: Kubernetesにデプロイしたアプリケーションを管理したい場合、Kubectlは非常に便利なツールです。 +slug: kubectl-cheat-sheet +tags: + - kubernetes + - docker +authors: + name: Gao Wei + title: Docusaurusコアチーム + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +image: https://fine.ams3.cdn.digitaloceanspaces.com/blog/2023-12-15-kubectl-cheat-sheet/social.png +hide_table_of_contents: false +--- + +## はじめに + +Kubernetesは有名なコンテナオーケストレーションツールで、現代のソフトウェア開発で非常に人気があります。 Kubernetesを使用している場合は、Kubernetesアプリケーションを管理するためのコマンドラインツールであるKubernetesを使用する必要があります。 このガイドでは、最も頻繁に使用されるKubectlコマンドについて説明します。 重要な命令について議論するだけでなく、 しかし実際のコード例と実行中に直面する共通のエラーについても話し合います それができることのいくつかの例は以下のとおりです。 + +- ポッドの管理 +- あなたのデプロイの管理 +- サービスの管理 +- その他 + +今では、各コマンドをカバーすることができないかもしれません。 ただし、アプリケーションで Kubernetes を使用している場合、以下で説明するコマンドは確実に価値があります。 基本的なもの、すなわち、Kubectlのインストールとセットアップから始めましょう。 + +## セットアップと基本コマンド + +### kubectlのインストール: version + +kubectl のインストールとバージョンをチェックします。 + +**一般的なエラー:** コマンドが見つかりません (kubectl がインストールされていません)。 + +localhostへの接続を拒否:8080:Kubernetesクラスタが実行されていないか、kubectlが誤って設定されています。 + +### 基本構文 + +The basic syntax of any kubectl command is: `kubectl [command] Type [name] [flags]` +Note that 'TYPE' and 'NAME' are context-dependent and may not be required in that order. + +**一般的なフラグ:** + +コマンドには、get、describe、create が含まれます。 + +タイプ: pod, サービス. + +名前: 型のすべてのリソースを指定するオプション。 + +`--namespace` のようなオプションフラグ。 + +**例:** `kubectl get pods -n mynamespace` + +このコマンドはすべての 'mynamespace' ポッドを一覧表示します。 + +**一般的なフラグ:** + +-n または --namespace フラグを使用して名前空間を指定します。 + +json や yaml などの出力フォーマットには `kubectl get pods -n mynamespace` を -o または --output で指定します。 例えば、 `kubectl get pod mypod json` + +**一般的なエラー:** 無効な名前空間または出力フォーマットは、"Not Found"のようなサーバーエラーを引き起こす可能性があります。 + +## クラスター管理とコンテキスト + +### クラスター情報を表示 + +`kubectl cluster-info` + +クラスターマスターとサービスエンドポイントを表示します。 + +**一般的なフラグ:** + +`--kubeconfig` このオプションは、kubeconfig ファイルを指定します。 + +**一般的なエラー:** ネットワークまたは接続の問題が原因でサーバーに接続できません。 + +**例:** `kubectl cluster-info --kubeconfig=/myconfig` + +### コンテキストの切り替え + +コンテキストを別のコンテキストに切り替えます。 + +`kubectl config use-context [context_name]` + +**一般的なフラグ:** 特定のフラグなしで使用されるほとんどの時間です + +**一般的なエラー:** + +`error: name: [context_name]` : context が存在しない場合。 + +**例:** `kubectl config use-context staging-context` + +## 名前空間の操作 + +Kubernetes 名前空間セグメントとリソースの管理。 重要な名前空間操作は以下のとおりです。 + +### ネームスペースの作成 + +このシンプルなコマンドは Kubernetes 名前空間を作成します。 その特定の機能のために、それはほとんどのバリエーションとフラグを持っています。 +**例:** + +開発者名前空間を作成: `kubectl create namespace dev` + +**一般的なエラー:** + +既存の名前空間を作成しようとしています。 +**一般的なフラグ:** + +- `--dry-run` 名前空間を作成せずに表示します。 +- `-o [format]` yaml または json 形式で詳細を出力します。 + +### ネームスペースの一覧 + +このコマンドはすべての Kubernetes 名前空間を表示します。 + +**例:** +シンプルなリスト: `kubectl get namespaces` +詳細なリスト: `kubectl get namespaces -o wide` + +**一般的なエラー:** +フラグやフォーマットが間違っています。 + +**一般的なフラグ:** + +- `-o wide`: 年齢などの名前空間の詳細を表示します。 +- `-o json` または `-o yaml` 詳細は JSON または YAML で出力されます。 +- `--show-labels`: ネームスペースのラベルを表示します。 + +### ネームスペースの削除 + +`kubectl delete [namespace_name]` + +名前空間とそのリソースを削除します。 これは不可逆的な操作であるため、注意してください。 + +**例:** +`Run kubectl delete namespace test` + +**一般的なエラー:** + +- システムまたは存在しない名前空間を削除しようとしています。 +- 名前空間リソースを移行またはバックアップしません。 + + **一般的なフラグ:** + +* `--grace-period=[seconds]` 削除前に猶予期間を設定します。 +* `--force` を使って名前空間を削除します。 +* `--casade` : 名前空間リソースを削除するかどうかを決定します。 + +## ポッドと展開の管理 + +### Pods Creating + +Pods are created with `kubectl run [pod_name]. --image=[image_name]` + +**一般的なフラグ:** + +- `--env` 環境変数を設定します。 +- `-l, --labels` ポッドにラベルを付けます。 +- `--dry-run` ポッドメイキングをシミュレートします。 本番環境にデプロイする前に、QA/ステージングでテストする場合に便利です。 + +**例:** +'nginx' イメージを使用して 'nginx-pod' `kubectl run nginx-pod --image=nginx` を作成する + +**一般的なエラー:** +`Error: image not found` error occurred when the container image doesn't exist. + +### Podのリストを取得する + +`kubectl get pods`の現在設定されている名前空間ですべてのポッドを参照してください。 + +**共通フラグ**: + +- `-o wide ` ノード名のような詳細を表示する。 +- `--show-labels` ポッドごとにラベルも表示されます。 + **例:** + `kubectl get pods -o wide`は全てのポッドを表示します。 + +**一般的なエラー:** +`リソースが見つかりません` エラーは、名前空間にポッドがないときに発生します。 + +### ポッドを削除中 + +ポッドを削除するコマンドは `kubectl delete pod [pod_name] `です。 + +**一般的なフラグ:** + +- `--grace-period `: 強制的にポッドを殺す前に一時停止します。 +- `--force`: 直ちにポッドを強制的に削除します。 + +**例:** + +`kubectl delete nginx-pod` remove 'nginx-pod' . + +**一般的なエラー:** +ポッドが存在しない場合は、ポッドが見つかりませんでした。 + +### デプロイの作成 + +`kubectl create deploy [name] --image=[image] ` という名前のデプロイを作成します。 + +**一般的なフラグ:** + +- `--レプリカ` 希望のレプリカ数を設定します。 +- 実際のデプロイではなく、デプロイをシミュレートするために`--dry-run`を実行します。 + +**例:** +'nginx' イメージを使用して 'nginx-deployment' `kubectl create deployment nginx-deployment --image=nginx` + +**一般的なエラー:** +画像フォーマットエラーは、しばしば`無効な画像名`エラーになります。 + +### リストのデプロイメント + +namespace deployments `kubectl get deployments`を表示 + +**一般的なフラグ:** +`-o wide` レプリカ数のような追加の詳細を表示します。 + +**例:** + +すべてのデプロイを表示します `kubectl get deployments` + +**一般的なエラー:** +namespace にデプロイがない場合、`リソースが見つかりません` エラーが発生します。 + +## **サービスとノードの処理** + +### サービスの管理 + +概要 +`kubectl get services`は、すべてのKubernetesクラスタサービスとそのステータスをすばやく表示するのに役立ちます。 + +**共通フラグ**: + +- `-o wide` : 各サービスに追加の詳細を提供します。 +- `--all-namespaces` すべての名前空間に存在するすべてのサービスを見ることができます。 +- \`--watch\`\`\`Monitors サービスの変更と更新の表示。 + +**例:** +`kubectl get services -o wide` +このコマンドはデフォルトの名前空間サービスを詳細に表示します。 + +**一般的なエラー:** +`Services' service-name' が見つかりません` サービス名を入力するか、存在しないサービスをクエリします。 + +### ノードの一覧 + +コマンド `kubectl get nodes` は、サイズと健康評価のためのすべてのクラスタノードを表示します。 + +**一般的なフラグ:** + +- `-o wide` IPアドレス、OS、カーネルバージョンなどの詳細を表示します。 +- `--selecto` ラベルでノードをフィルターします。 +- `--showlabels` ノード ラベルを表示します。 + +**例:** +`kubectl get nodes --selector=environment=production` このコマンドは全てのプロダクションノードを表示します。 + +**一般的なエラー:** +`サーバーlocalhostへの接続:8080 refused` kubectlの設定が正しくないか、Kubernetesクラスタにアクセスできないため通常。 + +## 高級資源管理 + +### Kubectl Labels + +Kubernetes ラベルは Pods のキーと値のペアです。 オブジェクトサブセットを整理して選択します。 `kubectl get pods -l `コマンドはラベルでポッドを取得します。 + +**一般的なフラグ:** + +- `--l` または `--selector`: ラベルセレクターを指定します +- `--all-namespaces` はすべての名前空間を検索します +- `-o' または `--output\` フォーマット (yaml, json) を出力します。 + +**例:** +`kubectl get pods -l app=myApp`は、myAppと同じラベル"app"を持つすべてのポッドをリストします。 + +**一般的なエラー**: +ラベル名や値が正しくない場合、結果が出ません。 pod ラベルが正しいことを確認します。 + +### Kubectl による展開を拡大する + +スケーリング展開には、ポッドレプリカの数(インスタンス)を変更する必要があります。 `kubectl scale`コマンドはこの魔法を発揮します。 + +**一般的なフラグ:** + +- `--レプリカ` 必要なコピーの数を指定します +- `--current-レプリカ` 現在のレプリカ数(条件付きスケーリング用) +- `--timeout:`スケール操作の完了を待つ時間 + +**例:** + +`kubectl scale deployment myDeployment --レプリカ=5` は myDeployment を 5 つのレプリカにスケールします。 + +**一般的なエラー**: +「デプロイが見つかりません」エラーは、存在しない、または誤った名前のデプロイをスケーリングする場合によく発生します。 デプロイメント名は現在の名前空間にある必要があります。 + +## **デバッグとログ** + +### ログアクセス + +Kubernetes ポッドのログは `kubectl logs [pod_name] ` を使って取得できます。 Pod-running アプリケーションと診断の問題を理解するには、このコマンドが必要です。 + +**例:** +`kubectl logs my-app-pod` は "my-app-pod" という名前のポッドのログを表示します。 + +**一般的なエラー:** +`サーバーからのエラー (NotFound): pods "my-app-pod" が見つかりません` このエラーは、Kubernetes クラスターにこの名前のポッドがない場合に発生します。 + +### テーリングログ + +`kubectl logs -f [pod_name] ` を使って、"tail" ポッドのログをストリーミングできます。 これにより、特に動的環境でのログ出力の監視に役立ちます。 + +**例:** +`kubectl logs -f my-app-pod` ポッドからのログは、このコマンドによってライブストリーミングされます。 + +**一般的なエラー:** +`サーバーからのエラー (NotFound): pods "my-app-pod" not found`. このエラーは、Kubernetesクラスタに指定されたポッドがないことを意味します。 + +## **シークレットとコンフィグマップ** + +### シークレットの作成 + +Kubernetesのsecretsは、パスワード、OAuthトークン、sshキーを保存および管理します。 `kubectl create secret generic [secret_name] --from-literal=[key]=[value] ` で簡単にこれらのシークレットを作成できます。 + +**一般的なフラグ:** + +- `--from-literal` コマンドラインで秘密データをキーと値のペアとして指定します。 +- `--from-file` ファイルからシークレットを作成します。 この場合、ファイル名はキーとみなされ、その内容が値となります。 +- `--dry-run` クラスターに送信されるオブジェクトを実際に送信せずに表示します。 +- +- `--output` または \`-o' は出力フォーマット (yaml または json) を設定します。 + +**例:** +`kubectl create secret generic my-secret --from-literal=password=myStrongPassword` + +このコマンドは、パスワードと myStrongPassword という 1 つのエントリを持つ my-secret という名前の秘密を作成します。 + +**一般的なエラー:** + +シークレットを作成するときに、不正なキーと値のペアが一般的です。 以下のkey=value形式が不可欠です。 + +### ConfigMapsの使用 + +Kubernetes ConfigMapsは非機密データをキーと値のペアに格納します。 設定ファイル、コマンドライン引数、環境変数、ポート番号などを保存できます。 フォーマットは `kubectl create configmap [name] --from-literal=[key]=[value]` + +**一般的なフラグ** + +シークレットの作成と同様(上記参照) + +**例:** + +`kubectl configmap app-config --from-literal=app_mode=production` を作成する + +プロダクションにapp_modeを設定した"app-config"という名前のConfigMapが作成されます。 + +**一般的なエラー:** + +`--from-file` を使用する場合、存在しないファイルやディレクトリを参照することは一般的なエラーです。 ファイルパスが正しくアクセス可能であることを確認します。 + +## **役に立つヒントとコツ** + +### 効率のためのエイリアス + +kubectl のエイリアスを使用すると、各コマンドのキーストロークを削減することで、ワークフローを高速化できます。 + +**例:** + +`Alias k=kubectl` +ポッドの状態をよく確認します。 エイリアスでは、kubectl の単語全体を入力する代わりに `k get pods` を入力できます。 + +### コマンド完了を高速化するためのKubectl Autocomplete + +Kubectl はコマンドラインの自動補完をサポートし、かなりの時間を節約します。 この機能はコマンド、引数、リソース名補完を高速化します。 + +**オートコンプリートの設定** + +シェルの設定ファイル内のオートコンプリートスクリプトをソースします。 bashの場合は、`source <(kubectl completion bash) `を `.bashrc` に追加します。 zsh の `.zshrc` ファイルに `source <(kubectl completion zsh)` を追加します。 + +設定後、`kubectl get pod`のようなコマンドを入力し、tabキーを押すと`kubectl get pods`が完了します。 + +### ローカルでサービスにアクセスするために Kubectl Port-Forward を使用する + +`kubectl port-forward` を使用する場合は、ローカルマシンから内部の Kubernetes クラスターサービスにアクセスして操作することができます。 + +**例:** + +`kubectl port-forward svc/my-web-app 5000:8080` を使用して、ポート8080でクラスタサービスを転送します。 + +サービスのポート 8080 は、ローカルマシンのポート 5000 からトラフィックを受信します。そのため、ブラウザで http\://localhost:5000 からアプリケーションにアクセスできます。 + +## 結論 + +Kubernetesにデプロイしたアプリケーションを管理したい場合、Kubetclは非常に便利なツールです。 初心者でも経験豊富な実務者でも、このガイドはKubernetesの旅のあらゆるステップをお手伝いします ポッドを作成するか、クラスタをスケーリングするかに関わらず。 + +彼らはあなたに多くの時間と労力を節約するので、彼らはこの記事で述べられているさまざまなヒントやトリックに特別な注意を払ってください。 この記事で説明されているコマンドを試して、手を汚すことをお勧めします。それがクベックルをマスターする最良の方法です。 diff --git a/i18n/ja/docusaurus-plugin-content-blog/authors.yml b/i18n/ja/docusaurus-plugin-content-blog/authors.yml new file mode 100644 index 0000000000..be22a110f2 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/authors.yml @@ -0,0 +1,15 @@ +endi: + name: Endilie Yacop Sucipto + title: Docusaurusのメンテナー + url: https://github.com/endiliy + image_url: https://github.com/endiliey.png +yangshun: + name: Yangshun Tay + title: フロントエンドエンジニア@ Facebook + url: https://github.com/yangshun + image_url: https://github.com/yangshun.png +slorber: + name: Sebastien Lorber + title: Docusaurusメンテナー + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png diff --git a/i18n/ja/docusaurus-plugin-content-blog/options.json b/i18n/ja/docusaurus-plugin-content-blog/options.json new file mode 100644 index 0000000000..bb9e447079 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-blog/options.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "ブログ", + "description": "The title for the blog used in SEO" + }, + "description": { + "message": "ILLA、フロントエンドエコシステム、およびウェブ開発のためのリソース", + "description": "The description for the blog used in SEO" + }, + "sidebar.title": { + "message": "すべての投稿", + "description": "The label for the left sidebar" + } +} diff --git a/i18n/ja/docusaurus-theme-classic/footer.json b/i18n/ja/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000000..a65fa8fe6b --- /dev/null +++ b/i18n/ja/docusaurus-theme-classic/footer.json @@ -0,0 +1,34 @@ +{ + "link.title.Community": { + "message": "コミュニティ", + "description": "The title of the footer links column with title=Community in the footer" + }, + "link.title.More": { + "message": "もっと見る", + "description": "The title of the footer links column with title=More in the footer" + }, + "link.item.label.Stack Overflow": { + "message": "スタックオーバーフロー", + "description": "The label of footer link with label=Stack Overflow linking to https://stackoverflow.com/questions/tagged/docusaurus" + }, + "link.item.label.Discord": { + "message": "Discord", + "description": "The label of footer link with label=Discord linking to https://discordapp.com/invite/docusaurus" + }, + "link.item.label.Twitter": { + "message": "Twitter", + "description": "The label of footer link with label=Twitter linking to https://twitter.com/docusaurus" + }, + "link.item.label.Blog": { + "message": "ブログ", + "description": "The label of footer link with label=Blog linking to /blog" + }, + "link.item.label.GitHub": { + "message": "GitHub", + "description": "The label of footer link with label=GitHub linking to https://github.com/facebook/docusaurus" + }, + "copyright": { + "message": "Copyright ©️ 2023 My Project, Inc. Built with Docusaurus.", + "description": "The footer copyright" + } +} diff --git a/i18n/ja/docusaurus-theme-classic/navbar.json b/i18n/ja/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000000..4dc03c1260 --- /dev/null +++ b/i18n/ja/docusaurus-theme-classic/navbar.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "ILLA", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "ILLA", + "description": "The alt text of navbar logo" + }, + "item.label.Blog": { + "message": "ブログ", + "description": "Navbar item with label Blog" + } +} diff --git a/i18n/zh/code.json b/i18n/zh/code.json new file mode 100644 index 0000000000..71af98260e --- /dev/null +++ b/i18n/zh/code.json @@ -0,0 +1,604 @@ +{ + "footer.status": { + "message": "状态" + }, + "footer.roadmap": { + "message": "路径图" + }, + "footer.changelog": { + "message": "更新日志" + }, + "footer.media": { + "message": "媒体套件" + }, + "footer.drive": { + "message": "ILLA 驱动器" + }, + "footer.cloud": { + "message": "ILLA AI" + }, + "footer.selfhost": { + "message": "自主机" + }, + "footer.table": { + "message": "表" + }, + "footer.chart": { + "message": "图表" + }, + "footer.upload": { + "message": "上传" + }, + "footer.switch": { + "message": "交换机" + }, + "footer.select": { + "message": "选择" + }, + "footer.radio_group": { + "message": "无线电组" + }, + "footer.checkbox_group": { + "message": "复选框组" + }, + "footer.pdf": { + "message": "PDF" + }, + "footer.video": { + "message": "视频" + }, + "footer.mysql": { + "message": "MySQL" + }, + "footer.postgre": { + "message": "PostgreSQL" + }, + "footer.mongodb": { + "message": "MongoDB" + }, + "footer.firebase": { + "message": "Firebase" + }, + "footer.elasticsearch": { + "message": "弹性搜索" + }, + "footer.mssql": { + "message": "Microsoft SQL 服务器" + }, + "footer.supabase": { + "message": "Supabase" + }, + "footer.dynamo": { + "message": "动态DB" + }, + "footer.hf": { + "message": "Hugging Face Inference API" + }, + "footer.components": { + "message": "组件" + }, + "footer.integrations": { + "message": "集成" + }, + "footer.product": { + "message": "产品" + }, + "footer.company": { + "message": "公司" + }, + "footer.community": { + "message": "社区" + }, + "slogan-1": { + "message": "创建 AI 驱动的业务应用程序" + }, + "footer.privacy-policy": { + "message": "隐私政策" + }, + "footer.terms-of-service": { + "message": "服务条款" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "博客列表导航", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "较新的文章", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "较早的文章", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "nav.product": { + "message": "产品" + }, + "sub_nav.product.drive": { + "message": "ILLA 驱动器" + }, + "sub_nav.product.cloud": { + "message": "ILLA AI" + }, + "sub_nav.product.selfhost": { + "message": "自机主机" + }, + "nav.resource": { + "message": "资源" + }, + "sub_nav.resource.integrations": { + "message": "集成" + }, + "sub_nav.resource.components": { + "message": "组件" + }, + "nav.pricing": { + "message": "定价" + }, + "nav.doc": { + "message": "门" + }, + "nav.blog": { + "message": "博客" + }, + "nav.marketplace": { + "message": "市场" + }, + "nav.contact": { + "message": "书牌演示" + }, + "footer.less": { + "message": "显示更少的" + }, + "footer.more": { + "message": "显示更多" + }, + "theme.blog.post.readingTime.plurals": { + "message": "One min read|{readingTime} min read", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "call-to-action.title": { + "message": "使用 ILLA 云启动构建应用程序" + }, + "call-to-action.desc": { + "message": "您需要的任何内部工具可以在 1 分钟内使用 ILLA 云构建。" + }, + "call-to-action.button-1": { + "message": "免费试用云端" + }, + "call-to-action.button-2": { + "message": "使用 GitHub 登录" + }, + "title.github": { + "message": "Github" + }, + "title.stars": { + "message": "星星" + }, + "title.star-us": { + "message": "给我们加星" + }, + "description": { + "message": "使用 AI 代理和高级低代码工具赋予您的团队创建商业应用" + }, + "illa-Cloud": { + "message": "开始游戏" + }, + "starts": { + "message": "开始" + }, + "stars": { + "message": "开始" + }, + "join-community": { + "message": "加入Discord" + }, + "content.all.title": { + "message": "ILLA 云集成了所有内容" + }, + "how_to_use.title.3_steps_to_customize": { + "message": "自定义您的 AI 工具的步骤" + }, + "how_to_use.description.build_tools_through": { + "message": "通过拖放组件创建工具,定制您的 AI 代理,连接到您的数据源 并使AI 成为适合您需要和数据的智能工具,使您的工作更加智能。" + }, + "how_to_use.step1_title.create_ai_agent_for": { + "message": "为特定目的创建 AI 代理" + }, + "how_to_use.step1_description.you_can_create_an_ai": { + "message": "您可以为特定目的创建一个 AI 代理人,并使它对特定任务、工作或日常生活更有帮助。 " + }, + "how_to_use.step1_button.ai_agent_marketplace": { + "message": "AI 代理市场" + }, + "how_to_use.step2_title.build_the_frontend_p": { + "message": "几分钟后构建前端页面" + }, + "how_to_use.step2_description.by_dragging_and_drop": { + "message": "通过拖放组件, 您可以快速构建工具的接口并实现您想要的任何功能。" + }, + "how_to_use.step2_button.illa_app_marketplace": { + "message": "ILLA 应用市场" + }, + "how_to_use.step3_title.connect_to_your_data": { + "message": "连接到您的数据源和 AI 代理" + }, + "how_to_use.step3_description.enable_data_integrat": { + "message": "启用数据集成和自动化。AI Agent将根据您的要求和数据执行特定任务。" + }, + "how_to_use.step3_button.supported_data_sourc": { + "message": "支持的数据源" + }, + "testimonial.title.user_testimonials": { + "message": "用户感言" + }, + "testimonial.testimonial1_content.illa_cloud_has_been": { + "message": "ILLA 云对我来说是一个游戏更改器。它帮助我在较少的时间内生成高效的内容。 定制的 AI 代理人和应用程序完全符合我的业务需要。" + }, + "testimonial.testimonial1_username.christopher": { + "message": "克里斯托弗文" + }, + "testimonial.testimonial1_usertitle.seo_specialist": { + "message": "SEO 专家" + }, + "testimonial.testimonial2_content.i_think_i_become_a_b": { + "message": "我想我现在就成为博客大师!这个工具使我的内容生成过程发生了革命性变化,节省了我宝贵的时间。 无论是生成博客想法还是构建文章结构,AI Agents 对我和我的团队来说都是一个巨大的财富。" + }, + "testimonial.testimonial2_username.lucas": { + "message": "Lucas" + }, + "testimonial.testimonial2_usertitle.content_strategist": { + "message": "内容策略师" + }, + "testimonial.testimonial3_content.it_empowers_me_to_pr": { + "message": "这使我有权以最起码的努力提供特殊的客户支持。 预建的 AI 代理人和应用,以及根据我们的具体需要定制这些代理人的能力,大大提高了我们团队的效力。" + }, + "testimonial.testimonial3_username.harper": { + "message": "Harper" + }, + "testimonial.testimonial3_usertitle.customer_service_man": { + "message": "客户服务管理器" + }, + "testimonial.testimonial4_content.ai_agent_low_code": { + "message": "AI Agent & low-code 改变了我的电子邮件写入过程。 它简化了影响大的电子邮件的创建,使我能够轻松地精心设计出有说服力的信息。 ILLA 云已将我们的电子邮件通信提升到新的高度。" + }, + "testimonial.testimonial4_username.abigail": { + "message": "Abigail" + }, + "testimonial.testimonial4_usertitle.communication_specia": { + "message": "通信专家" + }, + "testimonial.testimonial5_content.i_need_to_oversee_va": { + "message": "我需要监督我公司的各个方面,ILLA Cloud为我提供了一个全面的解决办法。 这不仅节省了我在发展和设计方面的时间和努力,而且也使我能够更好地管理和监测我的工作。 " + }, + "testimonial.testimonial5_username.matthew": { + "message": "马修文" + }, + "testimonial.testimonial5_usertitle.business_founder": { + "message": "商业创始人" + }, + "testimonial.testimonial6_content.using_illa_cloud_to": { + "message": "使用ILLA Cloud来构建一个管理仪表板非常容易。 在仅仅一天的工作之后,我们得以完成监测项目进展和在这个仪表板内分配资源等任务。" + }, + "testimonial.testimonial6_username.samuel": { + "message": "塞缪尔" + }, + "testimonial.testimonial6_usertitle.website_administrato": { + "message": "网站管理员" + }, + "customer.title": { + "message": "被数千队信任的" + }, + "template.title.quickly_start_from_a": { + "message": "快速从模板开始" + }, + "template.button.explore_more_templat": { + "message": "探索更多模板" + }, + "template.template1_title.car_rental_admin_pan": { + "message": "汽车租金管理面板" + }, + "template.template1_description.build_for_car_rental": { + "message": "建设汽车租赁公司,以查明和跟踪车辆使用、费用和维修方面的趋势" + }, + "template.template1_button.learn_more": { + "message": "了解更多" + }, + "template.template2_title.cms_with_content_gen": { + "message": "内容生成CMS" + }, + "template.template2_description.build_for_business_o": { + "message": "建设业务团队以更有效地创建和管理内容" + }, + "template.template2_button.learn_more": { + "message": "了解更多" + }, + "template.template3_title.applicant_tracking": { + "message": "申请者跟踪" + }, + "template.template3_description.build_for_the_human": { + "message": "建立人力资源小组,收集简历并跟踪进展情况" + }, + "template.template3_button.learn_more": { + "message": "了解更多" + }, + "solutions.title.how_illa_ai_improves": { + "message": "ILLA AI 如何改进工作做法" + }, + "theme.blog.post.readMore": { + "message": "阅读更多", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Read more about {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "solutions.illa_title.illa_ai": { + "message": "ILLA 云" + }, + "solutions.human_title.human_work": { + "message": "人的工作" + }, + "theme.ErrorPageContent.title": { + "message": "此页面已崩溃。", + "description": "The title of the fallback page when the page crashed" + }, + "theme.blog.archive.title": { + "message": "归档", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "归档", + "description": "The page & hero description of the blog archive page" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "回到顶部", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "博客导航", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "较新的帖子", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "较早的帖子", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "一篇博文| {count} 篇博文", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} 篇博文含有标签“{tagName}”", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "查看所有标签", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "切换浅色/暗黑模式(当前为{mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "暗色模式", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "浅色模式", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "面包屑导航", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} 篇内容", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "文档页面", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "上一个", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "下一个", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "One doc tagged|{count} docs tagged", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} with \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "版本:{versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "这是尚未发行的 {siteTitle} {versionLabel} 版本文档。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "此为 {siteTitle} {versionLabel} 版的文档,现已不再积极维护。", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "要查看最新版本,请参阅{latestVersionLink}({versionLabel})。", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新版本", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "编辑此页面", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Direct link to {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " on {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " by {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Last updated{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "版本", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "找不到页面", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "标签:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "警告", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "危险", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "信息", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "备注", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "tip", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "警告", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "关闭", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "博客最近帖子导航", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "已复制", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "复制代码到剪贴板", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "复制", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "切换单词换行", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Expand sidebar category '{label}'", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Collapse sidebar category '{label}'", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "主要的", + "description": "The ARIA label for the main navigation" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "语文", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.NotFound.p1": { + "message": "我们找不到你想要的东西。", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "请联系链接到原始URL的站点所有者并让他们知道他们的链接已经损坏。", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "在本页", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.docs.breadcrumbs.home": { + "message": "主页", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "折叠侧边栏", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "折叠侧边栏", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Docs sidebar", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "关闭导航栏", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "format@@0 返回主菜单", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "切换导航栏", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "再试一次", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "跳转到主要内容", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "标签", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "未列出页面", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "此页面未列出。搜索引擎不会索引它,只有拥有直接链接的用户才能访问它。", + "description": "The unlisted content banner message" + } +} diff --git a/i18n/zh/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md b/i18n/zh/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md new file mode 100644 index 0000000000..8defc5a941 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/2019-05-28-first-blog-post.md @@ -0,0 +1,14 @@ +--- +slug: 第一个博客帖子 +title: 首个博客文章 +authors: + name: Gao Wei + title: Docusaurus 核心团队 + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +tags: + - hola + - 异星座 +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/i18n/zh/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md b/i18n/zh/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md new file mode 100644 index 0000000000..426ed67f55 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/2019-05-29-long-blog-post.md @@ -0,0 +1,46 @@ +--- +slug: 长博客帖子 +title: 长博客文章 +authors: endi +tags: + - 你好 + - 异星座 +--- + +这是一个很长的博客文章的摘要。 + +使用一个 `` 注释来限制列表视图中的博文大小。 + + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/i18n/zh/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx b/i18n/zh/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx new file mode 100644 index 0000000000..0da09192a4 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/2021-08-01-mdx-blog-post.mdx @@ -0,0 +1,22 @@ +--- +slug: mdx-blog-帖子 +title: MDX 博客文章 +authors: + - slorber +tags: + - 异星座 +--- + +Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). + +:::tip + +使用React的力量创建交互式博客文章。 + +```js + +``` + + + +::: diff --git a/i18n/zh/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/i18n/zh/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg new file mode 100644 index 0000000000..11bda09284 Binary files /dev/null and b/i18n/zh/docusaurus-plugin-content-blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg differ diff --git a/i18n/zh/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md b/i18n/zh/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md new file mode 100644 index 0000000000..3e825c9729 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/2021-08-26-welcome/index.md @@ -0,0 +1,30 @@ +--- +slug: 欢迎 +title: 欢迎使用 +authors: + - slorber + - yangshun +tags: + - 脸书 + - 你好 + - 异星座 +--- + +[Docusaurus blogging features](https://docusaurus.io/docs/blog)由[blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog)提供功能。 + +只需将 Markdown 文件 (或文件夹) 添加到 `blog` 目录。 + +普通博客作者可以添加到 `authors.yml` 。 + +博客文章日期可以从文件名中提取,如: + +- `2019-05-30-welcome.md` +- `2019-05-30-welcome/index.md` + +博客帖子文件夹可以方便共用博文图片: + +![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) + +博客也支持标签! + +**如果你不想要博客**:只需删除这个目录,并在你的 Docusaurus 配置中使用“博客:false”。 diff --git a/i18n/zh/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md b/i18n/zh/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md new file mode 100644 index 0000000000..e5b2f4b36e --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/2023-10-02-refine-crm-overview.md @@ -0,0 +1,175 @@ +--- +title: Building a Complete React CRM App with Refine, Ant Design and GraphQL +description: We'll explore the key features of our CRM app, the technologies we used. +slug: react-crm-with-refine +tags: + - refine + - react +authors: + name: Gao Wei + title: Docusaurus Core Team + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +is_featured: true +image: https://refine.ams3.cdn.digitaloceanspaces.com/blog/2023-10-02-refine-crm-overview/social.jpg +hide_table_of_contents: false +--- + +![Image description](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/crm-general.gif) + +I want to introduce our newest example app – a full-fledged React CRM (Customer Relationship Management) application built using refine, Ant Design, and GraphQL. + +👉 [Live Demo](https://example.crm.refine.dev/) + +👉 [You can find the source code on GitHub here](https://github.com/refinedev/refine/tree/master/examples/app-crm) + +This example is open-source, which means anyone can freely utilize and customize the source code as they see fit. It's not just another application; it's a comprehensive solution that boasts all the features and functionalities required for an accurate enterprise-level application. + +Moreover, this application serves as a guiding light for all developers. Whether you're a seasoned pro or just starting, our project is a valuable resource that can be used as a reference to better understand best practices and modern development techniques. + +We'll publish an article series and Video tutorials on YouTube on building this CRM app from scratch. You can follow the refine to get notified when it's ready! + +Twitter: https\://twitter.com/refine_dev +GitHub: https\://github.com/refinedev/refine + +## Introduction + +This article briefly overviews the CRM application built using refine, an open-source React framework designed for rapidly developing web applications. + +We'll explore the key features of our CRM app, the technologies we used, and how you can adapt this template for various business needs. + +Step we'll cover: + +- [Key Features of the CRM App](#key-features-of-the-crm-app) +- [Technologies Used](#technologies-used) +- [Best Practices and Ecosystem Integration](#best-practices-and-ecosystem-integration) +- [Where Can You Use This CRM As A Reference Template?](#where-can-you-use-this-crm-as-a-reference-template) + +## Key Features of the CRM App + +Our CRM application is feature-rich and comes with everything you need to manage customer relationships efficiently: + +### Dashboard + +The Dashboard provides an at-a-glance overview of your CRM activities. It displays key metrics, recent customer interactions, and upcoming events, offering valuable insights to help you make informed decisions. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/halx7sfl9ctke1fu3w35.png) + +
+
+ +### Calendar Integration + +Effortlessly manage appointments, meetings, and important events with the integrated Calendar feature. Stay organized and ensure you never miss a crucial interaction with your customers. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2v8ghazuheiznefwat9.png) + +
+
+ +### Scrumboard-Project Kanban + +Our Scrumboard or Project Kanban page streamlines project management. Visualize project progress, manage tasks, and facilitate team collaboration with ease. Move tasks through customizable boards to keep your projects on track. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hcll7tbqx3t71i6v7a9.png) + +
+
+ +### Sales Pipeline + +Effectively manage your sales process from lead generation to deal closure. The Sales Pipeline provides a visual representation of your sales stages, helping your team prioritize leads and track conversions. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5uoj722wasvw2fx8z49.png) + +
+
+ +### Companies + +The Companies page allows you to organize and categorize your business contacts. Maintain detailed profiles for each company, including contact information, communication history, and associated contacts. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gjlahcc1icfthu2n31ar.png) + +
+
+ +### Contacts + +Manage individual contacts efficiently using the Contacts page. Keep track of customer interactions, schedule follow-ups, and access critical contact information quickly. + +![Imag](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4c0ef7tv7nktax4gt3oz.png) + +
+
+ +### Quotes + +Create, send, and manage quotes seamlessly with the Quotes feature. Generate professional quotes for your customers, track their status, and convert them into sales. + +![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rqj0pzgkrure7ov5mr9.png) + +
+
+ +### Administration + +The Administration section empowers you to configure and customize your CRM application to suit your specific business needs. Manage user roles, access permissions, and system settings effortlessly. + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5deq6ceue79kloeuryz.png) + +
+ +### Authentication & Authorization + +![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m1r04i2h0cf1jegasbte.png) + +This example app is a comprehensive set of features that ensures you can streamline your customer interactions, project management, and sales processes, all within a single, user-friendly platform. Whether you're managing contacts, tracking sales, or overseeing projects, our CRM app provides the tools you need for success. + +## Technologies Used + +Our CRM app's modular structure and use of open-source tools make it adaptable to various business needs. So you can build all kinds of web apps like internal tools, admin panels, or dashboards on top of it. + +To bring our CRM app to life, we leveraged several cutting-edge technologies: + +### 1. refine + +[refine](https://github.com/refinedev/refine) served as the backbone of our CRM application. It offers a wide range of tools and components for easily building data-intensive applications. + +refine's internal hooks and components simplify the development process and eliminate repetitive tasks by providing industry-standard solutions for crucial aspects of a project, including authentication, access control, routing, networking, state management, and i18n. + +### 2. Ant Design + +[Ant Design](https://ant.design/), a popular UI library, provided the sleek and responsive user interface that our CRM app needed. Its pre-built components saved us time and effort. + +It's consistent and polished UI components ensured a professional and user-friendly interface. refine has a built-in integration for Ant Design. + +### 3. GraphQL + +We used [GraphQL](https://graphql.org/) for effective data retrieval and updating from our server. Additionally, we integrated [GraphQL Subscriptions](https://www.apollographql.com/docs/react/data/subscriptions/) to manage real-time modifications. + +For instance, on the Project Kanban page, tasks get updated automatically when cards are dragged and dropped between sections. + +![Image](https://refine.ams3.cdn.digitaloceanspaces.com/CRM-app/real-time.gif) + +GraphQL's efficient data-fetching capabilities made working with large datasets a breeze. It's flexibility allowed us to tailor our queries to our exact requirements. + +refine has built-in data provider support for GraphQL.You can set it up during the project creation phase. + +## Best Practices and Ecosystem Integration + +Throughout the development process, we adhered to best practices and incorporated elements from the broader ecosystem. This ensures our CRM app is not only functional but also scalable and maintainable. + +The group responsible for the CRM example app is the core refine framework team. Feel free to explore the best practices within the ecosystem! + +## Where Can You Use This CRM As A Reference Template? + +Our CRM template isn't limited to just one use case. You can adapt it for various purposes, including: + +- **B2B Applications**: Streamline customer interactions in a business-to-business context. +- **Internal Tools**: Use it as an internal tool to manage employee or departmental tasks and interactions. +- **All CRUD Applications**: The template's versatility means it can serve as the foundation for creating all sorts of CRUD applications. + +## Conclusion + +In this article, we've introduced you to our CRM application built with refine. We've highlighted its key features, the technologies we used, and the advantages of our approach. With this CRM template, you have the power to tailor your customer relationship management system to meet your unique business needs. Whether you're running a B2B operation, need an efficient internal tool, or want a versatile CRUD application, our CRM template has you covered. diff --git a/i18n/zh/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md b/i18n/zh/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md new file mode 100644 index 0000000000..d88b2ca7e2 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/2023-12-15-kubectl-cheat-sheet.md @@ -0,0 +1,397 @@ +--- +title: Kubectl 作弊模式——使用示例 +description: 如果你想要管理部署在Kubernetes的应用,Kubectl是一个非常简单的工具。 +slug: kubectl-cheat-sheat-table +tags: + - kubernetes + - 停靠栏 +authors: + name: Gao Wei + title: Docusaurus 核心团队 + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +image: https://reforme.ams3.cdn.digitaloceanspaces.com/blog/2023-12-15-Kubectl-cheat-sheet/social.png +hide_table_of_contents: false +--- + +## 一. 导言 + +Kubernetes 是一个著名的容器管弦乐队工具,它在现代软件开发中非常受欢迎。 如果您正在使用 Kubernetes ,您必须已经使用 Kubectl ,这是管理您的 Kubernetes 应用程序的命令行工具。 本指南将带你穿过最常用的 Kubectl 命令。 我们不仅将讨论重要的命令, 但我们也将讨论实际的代码例子和执行过程中遇到的常见错误。 它能够做的一些例子包括: + +- 您的 pods 管理 +- 您的部署管理 +- 您的服务管理 +- 还有更多 + +现在,我们可能无法覆盖每一个指挥部。 但可以放心,如果您的应用程序使用 Kubernetes,下面讨论的命令肯定是有价值的。 让我们从基本的 Kubectl 开始,即安装和安装。 + +## 设置和基本命令 + +### 正在安装 kubectl:版本 + +检查 kubectl 安装和版本。 + +**常见错误:** 命令未找到(未安装 kubectl)。 + +拒绝连接到 localhost:8080: Kubernetes 集群未运行或 kubectl 配置错误。 + +### 基本语法 + +The basic syntax of any kubectl command is: `kubectl [command] Type [name] [flags]` +Note that 'TYPE' and 'NAME' are context-dependent and may not be required in that order. + +**常见标志:** + +命令包括获取,描述和创建。 + +类型:pod,服务。 + +名称:可选用于命令所有类型的资源。 + +可选标志,如`--namespace` 。 + +**示例:** `kubectl get pods -n mynamespace` + +此命令列出了所有“动态空间”pods。 + +**常见标志:** + +使用 -n 或 --namespace 标志来指定命名空间。 + +使用 "kubectl 获取 pods -n mynameespace" 与 -o 或 --output for 输出格式,例如 json 或 yaml。 例如: `kubectl get pod mypod json` + +**常见错误:** 无效的命名空间或输出格式可能导致服务器错误,如“找不到”。 + +## 集群管理和背景 + +### 查看集群信息 + +`kubectl 群集-info` + +显示集群主端和服务端点。 + +**常见标志:** + +`--kubeconfig` 此选项指定了 kubeconfig 文件。 + +**常见错误:** 由于网络或连接问题,无法连接到服务器。 + +**示例:** `kubectl cluster-info --kubeconfig=/myconfig` + +### 切换环境 + +切换到另一个上下文. + +`kubectl 配置使用上下文 [context_name]` + +**常见标志:** 大部分时间没有任何特定标志 + +**常见错误:** + +`错误:名称不存在上下文: [context_name]` :如果上下文不存在。 + +**示例:** \`kubectl configuse-context staging-context + +## 使用命名空间 + +Kubernetes 命名空间段并管理资源。 重要的命名空间操作如下。 + +### 命名空间创建 + +这个简单的命令创建了一个 Kubernetes 命名空间。 由于其特定功能,它有很少的变体和标记。 +**示例:** + +使用: `kubectl 创建命名空间dev` + +**常见错误:** + +尝试创建一个现有的命名空间。 +**常见标志:** + +- `--dry-run`显示命名空间而不创建它。 +- "-o [format]" 输出细节为 yaml 或 json 格式。 + +### 命名空间列表 + +此命令显示所有 Kubernetes 命名空间。 + +**示例:** +简单列表: `kubectl get namespaces` +详细列表: `kubectl get namespaces -o wido` + +**常见错误:** +使用错误的标志或格式。 + +**常见标志:** + +- `-o 广泛`: 显示命名空间的详细信息如年龄。 +- "-o json" 或 "-o yaml" 详细信息为 JSON 或 YAML 输出。 +- `--show-labels`: 它显示命名空间标签。 + +### 命名空间删除 + +`kubectl 删除 [namespace_name]` + +这将移除命名空间及其资源。 小心,因为这是一个不可逆转的操作。 + +**示例:** +您可以删除测试命名空间:`运行kubectl 删除命名空间测试` + +**常见错误:** + +- 尝试删除系统或不存在的命名空间。 +- 不迁移或备份命名空间资源。 + + **常见标志:** + +* `--grace-period =[seconds]` 允许在删除之前设置宽限期。 +* 使用 "--force" 来预先删除命名空间。 +* `--cascade` :决定是否删除命名空间资源。 + +## 剂量和部署的管理 + +### 正在创建 Pods + +使用 `kubectl 运行 [pod_name] 创建Pods。 --image=[image_name]` + +**常见标志:** + +- `--env` 配置环境变量。 +- "-l, --labels" 标记 pod。 +- `--dry-run` 模拟制作。 它有助于在部署到生产前测试质量/待命状态。 + +**示例:** +使用 'nginx' 图像创建 'nginx-pod' 'kubectl 运行 nginx-pod --image=nginx\` + +**常见错误:** +当容器图像不存在时发生`错误:图像未找到` 错误。 + +### 获取播客列表 + +查看当前设置的命名空间 `kubectl 获取pods` 中的所有 pods\` + +**常见标志**: + +- `-o 宽` 以显示节点名称等详细信息。 +- `--show-labels` 标签也显示每个 pod 的标签。 + **示例:** + `kubectl get pods -o wido` 将显示所有 pods 及其所有详细信息。 + +**常见错误:** +当命名空间没有 pods 时发生`无资源发现`错误。 + +### 正在删除 Pods + +要删除 pod 的命令是 `kubectl 删除pod [pod_name]` + +**常见标志:** + +- `--grace-period `: 在强行杀死诗人之前暂停。 +- `--force`: 立即强行删除 pod。 + +**示例:** + +`kubectl 删除 nginx-pod` 删除 'nginx-pod'。 + +**常见错误:** +当 pod 不存在时常见的错误是 \`Pod 找不到'。 + +### 创建部署 + +创建一个以其名称和图像 \`kubectl 创建部署 [name] --image=[image] + +**常见标志:** + +- `--replicas` 设定所需复制数量。 +- 运行 `--dry-run` 来模拟部署而不是实际部署。 + +**示例:** +使用 'nginx' 图像来创建 'nginx-deplement' 'kubectl creatment nginx-deplation --image=nginx\` + +**常见错误:** +图像格式错误常常导致`无效图像名称`错误。 + +### 正在部署列表 + +显示命名空间部署`kubectl 获取部署` + +**常见标志:** +\`-o 宽度' 显示额外的详细信息,如重复测验计数。 + +**示例:** + +显示所有部署`kubectl获取部署` + +**常见错误:** +当命名空间没有部署时发生`无资源发现`错误。 + +## **处理服务和节点** + +### 管理服务 + +概述 +`kubectl 获取服务` 有助于用户快速查看所有 Kubernetes 集群服务及其状态。 + +**常见标志**: + +- `-o 广泛` : 为每个服务提供额外的详细信息。 +- `--all-namespaces` 你可以看到所有命名空间中存在的所有服务。 +- \`--watch\`\`\`Monitor's service changes and update display. + +**示例:** +`kubectl 获取服务-o wida` +此命令将显示所有默认命名空间服务细节。 + +**常见错误:** +`Services' 服务名称' 找不到`错误地输入服务名称或查询不存在的服务。 + +### 列表节点 + +命令“kubectl 获取节点”显示所有集群节点的大小和健康评估。 + +**常见标志:** + +- "-o wide " 显示额外的详细信息,例如 IP 地址、 操作系统、 内核版本等。 +- `--selecto` 过滤器节点的标签。 +- `--showlabels` 显示节点标签。 + +**示例:** +`kubectl 获取节点--selector=environment=production` 此命令显示所有生产节点。 + +**常见错误:** +`连接到服务器localhost:8080 refused` 通常是由于错误的 kubectl 配置或无法访问 Kubernetes 集群。 + +## 高级资源管理 + +### Kubectl 标签 + +Kubernetes 标签是 pods 上的键值对。 它们组织和选择天体子集。 命令“kubectl get pods -l ” 通过标签检索 pods。 + +**常见标志:** + +- `--l` 或 `--selector`: 指定标签选择器 +- `--all-namespaces` 搜索所有命名空间 +- `-o' 或 `--output\` 输出格式 (yaml, json) + +**示例:** +`kubectl get pods -l app=myApp` 列出了所有带有等于 myApp 的标签的 pod 。 + +**常见错误**: +标签名称或值常常导致无结果。 确保播客标签正确。 + +### 使用 kubectl 缩放部署 + +扩大部署涉及改变播客复制品的数量(实例)。 `kubectl scale`命令执行此魔法。 + +**常见标志:** + +- `--replicas` 指定所需份数 +- `--current-replicas` 当前复制件计数(用于条件缩放) +- `--timeout:`等待大规模操作完成的时间 + +**示例:** + +`kubectl 规模部署my部署 --replicas=5` 将 my 部署的比例定为 5 倍仿效。 + +**常见错误**: +在缩放不存在或名称不正确的部署时,常常发生`部署未找到`错误。 部署名称必须在当前命名空间中。 + +## **调试和日志** + +### 日志访问 + +Kubernetes pod 日志可以使用 `kubectl logs [pod_name] `获取。 理解正在运行的应用程序和诊断问题需要此命令。 + +**示例:** +`kubectl logmy-app-pod` 将显示名为“my-app-pod”的 pod 日志。 + +**常见错误:** +"服务器错误(NotFound): pods "my-app-pod" 找不到"。当 Kubernetes 集群没有具有这个名称的 pod 时,发生了这个错误。 + +### 定制日志 + +你可以用 `kubectl log-f [pod_name] `串流或“尾”pod 日志。 这有助于实时监测日志输出,在动态环境中尤其如此。 + +**示例:** +"kubectl log-f my-app-pod" logs from pod "my-app-pod" 将被该命令直播。 + +**常见错误:** +"服务器错误(NotFound): pods "my-app-pod"找不到"。 这个错误意味着 Kubernetes 集群没有指定的 pod。 + +## **保密和配置地图** + +### 正在创建密钥 + +Kubernetes 密钥存储和管理密码,OAuth tokens 和 Sh keys。 您可以轻松地创建这些秘密,使用 `kubectl 创建秘密的 [secret_name] --from-literal=[key]=[value]` + +**常见标志:** + +- `--from-literal` 这个标志在命令行上指定了密钥值对。 +- `--from-file` 从文件创建秘密。 在这种情况下,文件名将被视为密钥,其内容将是其值。 +- `--dry-run`显示将发送到集群而不实际发送的对象。 +- +- `--output` 或 \`-o' 设置输出格式(yaml 或 json)。 + +**示例:** +`kubectl 创建秘密通用my-secret --from-literal=password=myStrongPassword` + +此命令创建一个名为我的密钥,一个条目:密码和 myStrongPassword + +**常见错误:** + +创建密钥时不正确或格式错误的密钥对是常见的。 遵循 key=value 格式是必不可少的。 + +### 使用 ConfigMaps + +Kubernetes ConfigMaps 存储按键值对应的非机密数据。 配置文件、命令行参数、环境变量、端口号等可以存储在那里。 格式是 \`kubectl 创建 configmap [name] --from-literal=[key]=[value] + +**常见标志** + +与创建密钥相同(见上文) + +**示例:** + +`kubectl 创建 configap-config --from-literal=app_mode=production` + +创建了一个名叫“app-config”的配置地图,它带有 app_mode 设置为生产。 + +**常见错误:** + +当使用 --from-file\`时,引用不存在的文件或目录是常见错误。 验证文件路径是正确和可访问的。 + +## **有用的提示和涓流** + +### 有效率的别名 + +使用 kubectl 的别名可以通过减少每个命令的按键来加速工作流。 + +**示例:** + +`别名=kubectl` +你经常检查 pod 状态。 别名让您输入`k get pods` 而不是输入整个 kubectl 单词。 + +### Kubectl 自动完成快速命令补全 + +Kubectl 支持命令行自动补全,节省大量时间。 此功能会加速命令、参数和资源名称的补全。 + +**设置自动完成:** + +来源 shell 配置文件中的自动完成脚本。 对于巴希,你可以将源(kubectl 补全棒)添加到你的`.bashrc`中。 将 `source <(kubectl completing zsh)` 添加到你的 `.zshrc` 文件中。 + +设置后,键入类似`kubectl get pod`的命令并按标签键完成此命令以获取 pods\`。 + +### 使用 Kubectl Forward 本地访问服务 + +当使用 `kubectl port-forward`时,您可以访问并与本地机器的 Kubernetes 内部集群服务交互。 + +**示例:** + +使用 `kubectl port-forward svc/my-web-app 5000:8080` 在端口上转发群集服务。 + +服务端口 808080 接收本地机器的 5000 端口的流量,因此您可以在您的浏览器中访问 http\://localhost:5000。 + +## 五. 结论 + +如果你想要管理部署在 Kubernetes 的应用程序, Kubetcl 是一个非常简单的工具。 无论您是新手还是老练的开业者,本指南将帮助您在您的 Kubernetes 旅程的每一步, 是否正在创建一个点或缩小集群。 + +特别注意这篇文章中提到的各种提示和技巧,因为它们将节省大量时间和精力。 我们鼓励你尝试这篇文章中提到的命令并获得你的脏话,这是掌握 Kubectl 的最佳方式。 diff --git a/i18n/zh/docusaurus-plugin-content-blog/authors.yml b/i18n/zh/docusaurus-plugin-content-blog/authors.yml new file mode 100644 index 0000000000..4101d3f25b --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/authors.yml @@ -0,0 +1,15 @@ +endi: + name: Endilie Yacop Sucipto + title: Docusaurus维护者 + url: https://github.com/endiliey + image_url: https://github.com/endiliey.png +yangshun: + name: Yangshun Tay + title: 前端工程师@ Facebook + url: https://github.com/yangshun + image_url: https://github.com/yangshun.png +slorber: + name: Sei Bastien Lorber + title: Docusaurus维护者 + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png diff --git a/i18n/zh/docusaurus-plugin-content-blog/options.json b/i18n/zh/docusaurus-plugin-content-blog/options.json new file mode 100644 index 0000000000..5277ccf744 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-blog/options.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "博客", + "description": "The title for the blog used in SEO" + }, + "description": { + "message": "ILLA资源、前端生态系统和网络开发", + "description": "The description for the blog used in SEO" + }, + "sidebar.title": { + "message": "所有帖子", + "description": "The label for the left sidebar" + } +} diff --git a/i18n/zh/docusaurus-theme-classic/footer.json b/i18n/zh/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000000..5a6f3fb6e2 --- /dev/null +++ b/i18n/zh/docusaurus-theme-classic/footer.json @@ -0,0 +1,34 @@ +{ + "link.title.Community": { + "message": "社区", + "description": "The title of the footer links column with title=Community in the footer" + }, + "link.title.More": { + "message": "更多", + "description": "The title of the footer links column with title=More in the footer" + }, + "link.item.label.Stack Overflow": { + "message": "堆栈溢出", + "description": "The label of footer link with label=Stack Overflow linking to https://stackoverflow.com/questions/tagged/docusaurus" + }, + "link.item.label.Discord": { + "message": "Discord", + "description": "The label of footer link with label=Discord linking to https://discordapp.com/invite/docusaurus" + }, + "link.item.label.Twitter": { + "message": "推特", + "description": "The label of footer link with label=Twitter linking to https://twitter.com/docusaurus" + }, + "link.item.label.Blog": { + "message": "博客", + "description": "The label of footer link with label=Blog linking to /blog" + }, + "link.item.label.GitHub": { + "message": "GitHub", + "description": "The label of footer link with label=GitHub linking to https://github.com/facebook/docusaurus" + }, + "copyright": { + "message": "版权 ©️ 2023 My Project, Inc. 内置Docusaurus。", + "description": "The footer copyright" + } +} diff --git a/i18n/zh/docusaurus-theme-classic/navbar.json b/i18n/zh/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000000..7b14fbc2e8 --- /dev/null +++ b/i18n/zh/docusaurus-theme-classic/navbar.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "ILLA", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "ILLA", + "description": "The alt text of navbar logo" + }, + "item.label.Blog": { + "message": "博客", + "description": "Navbar item with label Blog" + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..f51a32658b --- /dev/null +++ b/package.json @@ -0,0 +1,68 @@ +{ + "name": "illa-website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "crowdin": "crowdin", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc", + "crowdin:sync": "docusaurus write-translations && crowdin upload && crowdin download" + }, + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/preset-classic": "3.0.1", + "@docusaurus/theme-common": "^3.0.1", + "@docusaurus/utils-common": "^3.0.1", + "@headlessui/react": "^1.7.17", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "file-saver": "^2.0.5", + "framer-motion": "^10.16.16", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-share": "^5.0.3", + "react-use": "^17.4.2", + "title-case": "^4.2.0" + }, + "devDependencies": { + "@crowdin/cli": "^3.15.0", + "@docusaurus/module-type-aliases": "3.0.1", + "@docusaurus/theme-classic": "^3.0.1", + "@docusaurus/tsconfig": "3.0.1", + "@docusaurus/types": "3.0.1", + "@tailwindcss/typography": "^0.5.10", + "@types/file-saver": "^2.0.7", + "@types/gtag.js": "^0.0.18", + "@types/node": "^20.10.5", + "@types/react": "^18.2.45", + "@types/react-dom": "^18.2.18", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.32", + "tailwindcss": "^3.4.0", + "typescript": "~5.2.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/plugins/blog-plugin.js b/plugins/blog-plugin.js new file mode 100644 index 0000000000..594834b3fb --- /dev/null +++ b/plugins/blog-plugin.js @@ -0,0 +1,353 @@ +const blogPluginExports = require("@docusaurus/plugin-content-blog"); +const utils = require("@docusaurus/utils"); +const path = require("path"); + +const defaultBlogPlugin = blogPluginExports.default; + +const pluginDataDirRoot = path.join( + ".docusaurus", + "docusaurus-plugin-content-blog", +); +const aliasedSource = (source) => + `~blog/${utils.posixPath(path.relative(pluginDataDirRoot, source))}`; + +function paginateBlogPosts({ + blogPosts, + basePageUrl, + blogTitle, + blogDescription, + postsPerPageOption, +}) { + const totalCount = blogPosts.length; + const postsPerPage = + postsPerPageOption === "ALL" ? totalCount : postsPerPageOption; + + const numberOfPages = Math.ceil(totalCount / postsPerPage); + + const pages = []; + + function permalink(page) { + return page > 0 + ? utils.normalizeUrl([basePageUrl, `page/${page + 1}`]) + : basePageUrl; + } + + for (let page = 0; page < numberOfPages; page += 1) { + pages.push({ + items: blogPosts + .slice(page * postsPerPage, (page + 1) * postsPerPage) + .map((item) => item.id), + metadata: { + permalink: permalink(page), + page: page + 1, + postsPerPage, + totalPages: numberOfPages, + totalCount, + previousPage: page !== 0 ? permalink(page - 1) : undefined, + nextPage: page < numberOfPages - 1 ? permalink(page + 1) : undefined, + blogDescription, + blogTitle, + }, + }); + } + + return pages; +} + +function getMultipleRandomElement(arr, num) { + const shuffled = [...arr].sort(() => 0.5 - Math.random()); + + return shuffled.slice(0, num); +} + +function getReletadPosts(allBlogPosts, metadata) { + const relatedPosts = allBlogPosts.filter( + (post) => + post.metadata.frontMatter.tags?.some((tag) => + metadata.frontMatter.tags?.includes(tag), + ) && post.metadata.title !== metadata.title, + ); + + const randomThreeRelatedPosts = getMultipleRandomElement(relatedPosts, 3); + + const filteredPostInfos = randomThreeRelatedPosts.map((post) => { + return { + title: post.metadata.title, + description: post.metadata.description, + permalink: post.metadata.permalink, + formattedDate: post.metadata.formattedDate, + authors: post.metadata.authors, + readingTime: post.metadata.readingTime, + date: post.metadata.date, + }; + }); + + return filteredPostInfos; +} + +function getAuthorPosts(allBlogPosts, metadata) { + const authorPosts = allBlogPosts.filter( + (post) => + post.metadata.frontMatter.authors === metadata.frontMatter.authors && + post.metadata.title !== metadata.title, + ); + + const randomThreeAuthorPosts = getMultipleRandomElement(authorPosts, 3); + + const filteredPostInfos = randomThreeAuthorPosts.map((post) => { + return { + title: post.metadata.title, + description: post.metadata.description, + permalink: post.metadata.permalink, + formattedDate: post.metadata.formattedDate, + authors: post.metadata.authors, + readingTime: post.metadata.readingTime, + date: post.metadata.date, + }; + }); + + return filteredPostInfos; +} + +async function blogPluginExtended(...pluginArgs) { + const blogPluginInstance = await defaultBlogPlugin(...pluginArgs); + + const { blogTitle, blogDescription, postsPerPage } = pluginArgs[1]; + + return { + // Add all properties of the default blog plugin so existing functionality is preserved + ...blogPluginInstance, + /** + * Override the default `contentLoaded` hook to access blog posts data + */ + contentLoaded: async function (data) { + const { content: blogContents, actions } = data; + const { addRoute, createData } = actions; + const { + blogPosts: allBlogPosts, + blogTags, + blogTagsListPath, + } = blogContents; + + const blogItemsToMetadata = {}; + + function blogPostItemsModule(items) { + return items.map((postId) => { + const blogPostMetadata = blogItemsToMetadata[postId]; + + return { + content: { + __import: true, + path: blogPostMetadata.source, + query: { + truncated: true, + }, + }, + }; + }); + } + + + const featuredBlogPosts = allBlogPosts.filter( + (post) => post.metadata.frontMatter.is_featured === true, + ); + + + const blogPosts = allBlogPosts.filter( + (post) => post.metadata.frontMatter.is_featured !== true, + ); + + const blogListPaginated = paginateBlogPosts({ + blogPosts, + basePageUrl: "/illa-website/blog", + blogTitle, + blogDescription, + postsPerPageOption: postsPerPage, + }); + + // Create routes for blog entries. + await Promise.all( + allBlogPosts.map(async (blogPost) => { + const { id, metadata } = blogPost; + + const relatedPosts = getReletadPosts(allBlogPosts, metadata); + + const authorPosts = getAuthorPosts(allBlogPosts, metadata); + + await createData( + // Note that this created data path must be in sync with + // metadataPath provided to mdx-loader. + `${utils.docuHash(metadata.source)}.json`, + JSON.stringify({ ...metadata, relatedPosts, authorPosts }, null, 2), + ); + + addRoute({ + path: metadata.permalink, + component: "@theme/BlogPostPage", + exact: true, + modules: { + content: metadata.source, + }, + }); + + blogItemsToMetadata[id] = metadata; + }), + ); + + // Create routes for blog's paginated list entries. + await Promise.all( + blogListPaginated.map(async (listPage) => { + const { metadata, items } = listPage; + const { permalink } = metadata; + + const pageMetadataPath = await createData( + `${utils.docuHash(permalink)}.json`, + JSON.stringify(metadata, null, 2), + ); + + const tagsProp = Object.values(blogTags).map((tag) => ({ + label: tag.label, + permalink: tag.permalink, + count: tag.items.length, + })); + + const tagsPropPath = await createData( + `${utils.docuHash(`${blogTagsListPath}-tags`)}.json`, + JSON.stringify(tagsProp, null, 2), + ); + + console.log("permalink", permalink) + + addRoute({ + path: permalink, + component: "@theme/BlogListPage", + exact: true, + modules: { + items: blogPostItemsModule( + permalink === "/illa-website/blog" + ? [...items, ...featuredBlogPosts.map((post) => post.id)] + : items, + ), + metadata: aliasedSource(pageMetadataPath), + tags: aliasedSource(tagsPropPath), + }, + }); + }), + ); + + // const authorsArray = allBlogPosts + // .map((post) => post.metadata.frontMatter.authors) + // .filter((authorName) => authorName !== undefined); + // const uniqueAuthors = [...new Set(authorsArray)]; + + // uniqueAuthors.map(async (author) => { + // const authorPosts = allBlogPosts.filter( + // (post) => post.metadata.frontMatter.authors === author, + // ); + + // const authorListPaginated = paginateBlogPosts({ + // blogPosts: authorPosts, + // basePageUrl: "/blog/author/" + author, + // blogTitle, + // blogDescription, + // postsPerPageOption: "ALL", + // }); + + // authorListPaginated.map((authorListPage) => { + // const { metadata, items } = authorListPage; + // const { permalink } = metadata; + + // addRoute({ + // path: permalink, + // component: "@site/src/components/blog/author-page", + // exact: true, + // modules: { + // items: blogPostItemsModule(items), + // }, + // }); + // }); + // }); + + // Tags. This is the last part so we early-return if there are no tags. + if (Object.keys(blogTags).length === 0) { + return; + } + + async function createTagsListPage() { + const tagsProp = Object.values(blogTags).map((tag) => ({ + label: tag.label, + permalink: tag.permalink, + count: tag.items.length, + })); + + const tagsPropPath = await createData( + `${utils.docuHash(`${blogTagsListPath}-tags`)}.json`, + JSON.stringify(tagsProp, null, 2), + ); + + addRoute({ + path: blogTagsListPath, + component: "@theme/BlogTagsListPage", + exact: true, + modules: { + tags: aliasedSource(tagsPropPath), + }, + }); + } + + async function createTagPostsListPage(tag) { + await Promise.all( + tag.pages.map(async (blogPaginated) => { + const { metadata, items } = blogPaginated; + const tagProp = { + label: tag.label, + permalink: tag.permalink, + allTagsPath: blogTagsListPath, + count: tag.items.length, + }; + const tagPropPath = await createData( + `${utils.docuHash(metadata.permalink)}.json`, + JSON.stringify(tagProp, null, 2), + ); + + const listMetadataPath = await createData( + `${utils.docuHash(metadata.permalink)}-list.json`, + JSON.stringify(metadata, null, 2), + ); + + const tagsProp = Object.values(blogTags).map((tag) => ({ + label: tag.label, + permalink: tag.permalink, + count: tag.items.length, + })); + + const tagsPropPath = await createData( + `${utils.docuHash(`${blogTagsListPath}-tags`)}.json`, + JSON.stringify(tagsProp, null, 2), + ); + + addRoute({ + path: metadata.permalink, + component: "@theme/BlogTagsPostsPage", + exact: true, + modules: { + items: blogPostItemsModule(items), + tag: aliasedSource(tagPropPath), + tags: aliasedSource(tagsPropPath), + listMetadata: aliasedSource(listMetadataPath), + }, + }); + }), + ); + } + + await createTagsListPage(); + await Promise.all(Object.values(blogTags).map(createTagPostsListPage)); + }, + }; +} + +module.exports = { + ...blogPluginExports, + default: blogPluginExtended, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..78abe34430 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8758 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@docusaurus/core': + specifier: 3.0.1 + version: 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/preset-classic': + specifier: 3.0.1 + version: 3.0.1(@algolia/client-search@4.22.0)(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) + '@docusaurus/theme-common': + specifier: ^3.0.1 + version: 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/utils-common': + specifier: ^3.0.1 + version: 3.0.1(@docusaurus/types@3.0.1) + '@headlessui/react': + specifier: ^1.7.17 + version: 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@mdx-js/react': + specifier: ^3.0.0 + version: 3.0.0(@types/react@18.2.45)(react@18.2.0) + clsx: + specifier: ^2.0.0 + version: 2.0.0 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + framer-motion: + specifier: ^10.16.16 + version: 10.16.16(react-dom@18.2.0)(react@18.2.0) + prism-react-renderer: + specifier: ^2.3.0 + version: 2.3.1(react@18.2.0) + react: + specifier: ^18.0.0 + version: 18.2.0 + react-dom: + specifier: ^18.0.0 + version: 18.2.0(react@18.2.0) + react-share: + specifier: ^5.0.3 + version: 5.0.3(react@18.2.0) + react-use: + specifier: ^17.4.2 + version: 17.4.2(react-dom@18.2.0)(react@18.2.0) + title-case: + specifier: ^4.2.0 + version: 4.2.0 + +devDependencies: + '@crowdin/cli': + specifier: ^3.15.0 + version: 3.15.0 + '@docusaurus/module-type-aliases': + specifier: 3.0.1 + version: 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/theme-classic': + specifier: ^3.0.1 + version: 3.0.1(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/tsconfig': + specifier: 3.0.1 + version: 3.0.1 + '@docusaurus/types': + specifier: 3.0.1 + version: 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.4.0) + '@types/file-saver': + specifier: ^2.0.7 + version: 2.0.7 + '@types/gtag.js': + specifier: ^0.0.18 + version: 0.0.18 + '@types/node': + specifier: ^20.10.5 + version: 20.10.5 + '@types/react': + specifier: ^18.2.45 + version: 18.2.45 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.2.18 + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.32) + postcss: + specifier: ^8.4.32 + version: 8.4.32 + tailwindcss: + specifier: ^3.4.0 + version: 3.4.0 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + +packages: + + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0): + resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + dev: false + + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0): + resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + peerDependencies: + search-insights: '>= 1 < 3' + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + dev: false + + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0): + resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) + '@algolia/client-search': 4.22.0 + algoliasearch: 4.22.0 + dev: false + + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0): + resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/client-search': 4.22.0 + algoliasearch: 4.22.0 + dev: false + + /@algolia/cache-browser-local-storage@4.22.0: + resolution: {integrity: sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ==} + dependencies: + '@algolia/cache-common': 4.22.0 + dev: false + + /@algolia/cache-common@4.22.0: + resolution: {integrity: sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA==} + dev: false + + /@algolia/cache-in-memory@4.22.0: + resolution: {integrity: sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA==} + dependencies: + '@algolia/cache-common': 4.22.0 + dev: false + + /@algolia/client-account@4.22.0: + resolution: {integrity: sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA==} + dependencies: + '@algolia/client-common': 4.22.0 + '@algolia/client-search': 4.22.0 + '@algolia/transporter': 4.22.0 + dev: false + + /@algolia/client-analytics@4.22.0: + resolution: {integrity: sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg==} + dependencies: + '@algolia/client-common': 4.22.0 + '@algolia/client-search': 4.22.0 + '@algolia/requester-common': 4.22.0 + '@algolia/transporter': 4.22.0 + dev: false + + /@algolia/client-common@4.22.0: + resolution: {integrity: sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag==} + dependencies: + '@algolia/requester-common': 4.22.0 + '@algolia/transporter': 4.22.0 + dev: false + + /@algolia/client-personalization@4.22.0: + resolution: {integrity: sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow==} + dependencies: + '@algolia/client-common': 4.22.0 + '@algolia/requester-common': 4.22.0 + '@algolia/transporter': 4.22.0 + dev: false + + /@algolia/client-search@4.22.0: + resolution: {integrity: sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q==} + dependencies: + '@algolia/client-common': 4.22.0 + '@algolia/requester-common': 4.22.0 + '@algolia/transporter': 4.22.0 + dev: false + + /@algolia/events@4.0.1: + resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} + dev: false + + /@algolia/logger-common@4.22.0: + resolution: {integrity: sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ==} + dev: false + + /@algolia/logger-console@4.22.0: + resolution: {integrity: sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ==} + dependencies: + '@algolia/logger-common': 4.22.0 + dev: false + + /@algolia/requester-browser-xhr@4.22.0: + resolution: {integrity: sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg==} + dependencies: + '@algolia/requester-common': 4.22.0 + dev: false + + /@algolia/requester-common@4.22.0: + resolution: {integrity: sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ==} + dev: false + + /@algolia/requester-node-http@4.22.0: + resolution: {integrity: sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA==} + dependencies: + '@algolia/requester-common': 4.22.0 + dev: false + + /@algolia/transporter@4.22.0: + resolution: {integrity: sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA==} + dependencies: + '@algolia/cache-common': 4.22.0 + '@algolia/logger-common': 4.22.0 + '@algolia/requester-common': 4.22.0 + dev: false + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.23.6: + resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helpers': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6): + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.6): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + + /@babel/helpers@7.23.6: + resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) + + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.6) + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) + + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6): + resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) + + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) + + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) + + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.6): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.6) + + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/types': 7.23.6 + + /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-runtime@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.6) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) + babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/preset-env@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.6) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-async-generator-functions': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.6) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.6) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.6) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.6) + babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.6) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) + babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.6) + core-js-compat: 3.34.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.6 + esutils: 2.0.3 + + /@babel/preset-react@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.6) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.6) + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6) + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + /@babel/runtime-corejs3@7.23.6: + resolution: {integrity: sha512-Djs/ZTAnpyj0nyg7p1J6oiE/tZ9G2stqAFlLGZynrW+F3k2w2jGK2mLOBxzYIOcZYA89+c3d3wXKpYLcpwcU6w==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.34.0 + regenerator-runtime: 0.14.1 + + /@babel/runtime@7.23.6: + resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + + /@babel/traverse@7.23.6: + resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + optional: true + + /@crowdin/cli@3.15.0: + resolution: {integrity: sha512-oQMfC5S5OkVee+ryB56E1g0cr2iL9HFaYMWSwNRODp1KICWo0B/oRQo3MvStiZ3VW9ZkeydEoOgRnXXxw2amOA==} + hasBin: true + dependencies: + command-exists-promise: 2.0.2 + node-fetch: 2.6.7 + shelljs: 0.8.5 + tar: 4.4.19 + yauzl: 2.10.0 + transitivePeerDependencies: + - encoding + dev: true + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + /@docsearch/css@3.5.2: + resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} + dev: false + + /@docsearch/react@3.5.2(@algolia/client-search@4.22.0)(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): + resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) + '@docsearch/css': 3.5.2 + '@types/react': 18.2.45 + algoliasearch: 4.22.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + dev: false + + /@docusaurus/core@3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ==} + engines: {node: '>=18.0'} + hasBin: true + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-transform-runtime': 7.23.6(@babel/core@7.23.6) + '@babel/preset-env': 7.23.6(@babel/core@7.23.6) + '@babel/preset-react': 7.23.3(@babel/core@7.23.6) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) + '@babel/runtime': 7.23.6 + '@babel/runtime-corejs3': 7.23.6 + '@babel/traverse': 7.23.6 + '@docusaurus/cssnano-preset': 3.0.1 + '@docusaurus/logger': 3.0.1 + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/react-loadable': 5.5.2(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@slorber/static-site-generator-webpack-plugin': 4.0.7 + '@svgr/webpack': 6.5.1 + autoprefixer: 10.4.16(postcss@8.4.32) + babel-loader: 9.1.3(@babel/core@7.23.6)(webpack@5.89.0) + babel-plugin-dynamic-import-node: 2.3.3 + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.5.3 + clean-css: 5.3.3 + cli-table3: 0.6.3 + combine-promises: 1.2.0 + commander: 5.1.0 + copy-webpack-plugin: 11.0.0(webpack@5.89.0) + core-js: 3.34.0 + css-loader: 6.8.1(webpack@5.89.0) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.3)(webpack@5.89.0) + cssnano: 5.1.15(postcss@8.4.32) + del: 6.1.1 + detect-port: 1.5.1 + escape-html: 1.0.3 + eta: 2.2.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.2.0 + html-minifier-terser: 7.2.0 + html-tags: 3.3.1 + html-webpack-plugin: 5.6.0(webpack@5.89.0) + leven: 3.1.0 + lodash: 4.17.21 + mini-css-extract-plugin: 2.7.6(webpack@5.89.0) + postcss: 8.4.32 + postcss-loader: 7.3.3(postcss@8.4.32)(typescript@5.2.2)(webpack@5.89.0) + prompts: 2.4.2 + react: 18.2.0 + react-dev-utils: 12.0.1(typescript@5.2.2)(webpack@5.89.0) + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0) + react-router: 5.3.4(react@18.2.0) + react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0) + react-router-dom: 5.3.4(react@18.2.0) + rtl-detect: 1.1.2 + semver: 7.5.4 + serve-handler: 6.1.5 + shelljs: 0.8.5 + terser-webpack-plugin: 5.3.9(webpack@5.89.0) + tslib: 2.6.2 + update-notifier: 6.0.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0 + webpack-bundle-analyzer: 4.10.1 + webpack-dev-server: 4.15.1(webpack@5.89.0) + webpack-merge: 5.10.0 + webpackbar: 5.0.2(webpack@5.89.0) + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + /@docusaurus/cssnano-preset@3.0.1: + resolution: {integrity: sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ==} + engines: {node: '>=18.0'} + dependencies: + cssnano-preset-advanced: 5.3.10(postcss@8.4.32) + postcss: 8.4.32 + postcss-sort-media-queries: 4.4.1(postcss@8.4.32) + tslib: 2.6.2 + + /@docusaurus/logger@3.0.1: + resolution: {integrity: sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ==} + engines: {node: '>=18.0'} + dependencies: + chalk: 4.1.2 + tslib: 2.6.2 + + /@docusaurus/mdx-loader@3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/parser': 7.23.6 + '@babel/traverse': 7.23.6 + '@docusaurus/logger': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@mdx-js/mdx': 3.0.0 + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.0.1 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.2.0 + image-size: 1.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rehype-raw: 7.0.0 + remark-directive: 3.0.0 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + stringify-object: 3.3.0 + tslib: 2.6.2 + unified: 11.0.4 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + vfile: 6.0.1 + webpack: 5.89.0 + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + /@docusaurus/module-type-aliases@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@docusaurus/react-loadable': 5.5.2(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@types/history': 4.7.11 + '@types/react': 18.2.45 + '@types/react-router-config': 5.0.11 + '@types/react-router-dom': 5.3.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 2.0.4(react-dom@18.2.0)(react@18.2.0) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/plugin-content-blog@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + cheerio: 1.0.0-rc.12 + feed: 4.2.2 + fs-extra: 11.2.0 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + reading-time: 1.5.0 + srcset: 4.0.0 + tslib: 2.6.2 + unist-util-visit: 5.0.0 + utility-types: 3.10.0 + webpack: 5.89.0 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + /@docusaurus/plugin-content-docs@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@types/react-router-config': 5.0.11 + combine-promises: 1.2.0 + fs-extra: 11.2.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + webpack: 5.89.0 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + /@docusaurus/plugin-content-pages@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + fs-extra: 11.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + webpack: 5.89.0 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + /@docusaurus/plugin-debug@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + fs-extra: 11.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-json-view-lite: 1.2.1(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-analytics@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-gtag@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@types/gtag.js': 0.0.12 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-tag-manager@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-sitemap@3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + fs-extra: 11.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + sitemap: 7.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/preset-classic@3.0.1(@algolia/client-search@4.22.0)(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): + resolution: {integrity: sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-blog': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-debug': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-analytics': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-gtag': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-tag-manager': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-sitemap': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-classic': 3.0.1(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-search-algolia': 3.0.1(@algolia/client-search@4.22.0)(@docusaurus/types@3.0.1)(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@algolia/client-search' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/react-loadable@5.5.2(react@18.2.0): + resolution: {integrity: sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==} + peerDependencies: + react: '*' + dependencies: + '@types/react': 18.2.45 + prop-types: 15.8.1 + react: 18.2.0 + + /@docusaurus/theme-classic@3.0.1(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.0.1 + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + '@mdx-js/react': 3.0.0(@types/react@18.2.45)(react@18.2.0) + clsx: 2.0.0 + copy-text-to-clipboard: 3.2.0 + infima: 0.2.0-alpha.43 + lodash: 4.17.21 + nprogress: 0.2.0 + postcss: 8.4.32 + prism-react-renderer: 2.3.1(react@18.2.0) + prismjs: 1.29.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router-dom: 5.3.4(react@18.2.0) + rtlcss: 4.1.1 + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + /@docusaurus/theme-common@3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docusaurus/mdx-loader': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-common': 3.0.1(@docusaurus/types@3.0.1) + '@types/history': 4.7.11 + '@types/react': 18.2.45 + '@types/react-router-config': 5.0.11 + clsx: 2.0.0 + parse-numeric-range: 1.3.0 + prism-react-renderer: 2.3.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + /@docusaurus/theme-search-algolia@3.0.1(@algolia/client-search@4.22.0)(@docusaurus/types@3.0.1)(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): + resolution: {integrity: sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@docsearch/react': 3.5.2(@algolia/client-search@4.22.0)(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) + '@docusaurus/core': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.0.1 + '@docusaurus/plugin-content-docs': 3.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.0.1(@docusaurus/types@3.0.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + '@docusaurus/utils-validation': 3.0.1(@docusaurus/types@3.0.1) + algoliasearch: 4.22.0 + algoliasearch-helper: 3.16.1(algoliasearch@4.22.0) + clsx: 2.0.0 + eta: 2.2.0 + fs-extra: 11.2.0 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/types' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-translations@3.0.1: + resolution: {integrity: sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg==} + engines: {node: '>=18.0'} + dependencies: + fs-extra: 11.2.0 + tslib: 2.6.2 + + /@docusaurus/tsconfig@3.0.1: + resolution: {integrity: sha512-hT2HCdNE3pWTzXV/7cSsowfmaOxXVOTFOXmkqaYjBWjaxjJ3FO0nHbdJ8rF6Da7PvWmIPbUekdP5gep1XCJ7Vg==} + dev: true + + /@docusaurus/types@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.45 + commander: 5.1.0 + joi: 17.11.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) + utility-types: 3.10.0 + webpack: 5.89.0 + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/utils-common@3.0.1(@docusaurus/types@3.0.1): + resolution: {integrity: sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + tslib: 2.6.2 + + /@docusaurus/utils-validation@3.0.1(@docusaurus/types@3.0.1): + resolution: {integrity: sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg==} + engines: {node: '>=18.0'} + dependencies: + '@docusaurus/logger': 3.0.1 + '@docusaurus/utils': 3.0.1(@docusaurus/types@3.0.1) + joi: 17.11.0 + js-yaml: 4.1.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + /@docusaurus/utils@3.0.1(@docusaurus/types@3.0.1): + resolution: {integrity: sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/logger': 3.0.1 + '@docusaurus/types': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@svgr/webpack': 6.5.1 + escape-string-regexp: 4.0.0 + file-loader: 6.2.0(webpack@5.89.0) + fs-extra: 11.2.0 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.21.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + micromatch: 4.0.5 + resolve-pathname: 3.0.0 + shelljs: 0.8.5 + tslib: 2.6.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true + dev: false + optional: true + + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + + /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + dependencies: + client-only: 0.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.10.5 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + + /@mdx-js/mdx@3.0.0: + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdx': 2.0.10 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + /@mdx-js/react@3.0.0(@types/react@18.2.45)(react@18.2.0): + resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + dependencies: + '@types/mdx': 2.0.10 + '@types/react': 18.2.45 + react: 18.2.0 + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + /@polka/url@1.0.0-next.24: + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + + /@sideway/address@4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + + /@sideway/formula@3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + /@sideway/pinpoint@2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + /@slorber/remark-comment@1.0.0: + resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + + /@slorber/static-site-generator-webpack-plugin@4.0.7: + resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} + engines: {node: '>=14'} + dependencies: + eval: 0.1.8 + p-map: 4.0.0 + webpack-sources: 3.2.3 + + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.6): + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.6): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.6): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.6): + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.6): + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.6): + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.6): + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.6): + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + + /@svgr/babel-preset@6.5.1(@babel/core@7.23.6): + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.6) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.6) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.6) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.6) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.6) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.6) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.6) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.6) + + /@svgr/core@6.5.1: + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.6 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.6) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + + /@svgr/hast-util-to-babel-ast@6.5.1: + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.23.6 + entities: 4.5.0 + + /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + dependencies: + '@babel/core': 7.23.6 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.6) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + + /@svgr/webpack@6.5.1: + resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.6 + '@babel/plugin-transform-react-constant-elements': 7.23.3(@babel/core@7.23.6) + '@babel/preset-env': 7.23.6(@babel/core@7.23.6) + '@babel/preset-react': 7.23.3(@babel/core@7.23.6) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + transitivePeerDependencies: + - supports-color + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + + /@tailwindcss/typography@0.5.10(tailwindcss@3.4.0): + resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.0 + dev: true + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.10.5 + + /@types/bonjour@3.5.13: + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + dependencies: + '@types/node': 20.10.5 + + /@types/connect-history-api-fallback@1.5.4: + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + dependencies: + '@types/express-serve-static-core': 4.17.41 + '@types/node': 20.10.5 + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.10.5 + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.0 + '@types/estree': 1.0.5 + + /@types/eslint@8.56.0: + resolution: {integrity: sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + /@types/estree-jsx@1.0.3: + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + dependencies: + '@types/estree': 1.0.5 + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + dependencies: + '@types/node': 20.10.5 + '@types/qs': 6.9.10 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 + '@types/qs': 6.9.10 + '@types/serve-static': 1.15.5 + + /@types/file-saver@2.0.7: + resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} + dev: true + + /@types/gtag.js@0.0.12: + resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} + dev: false + + /@types/gtag.js@0.0.18: + resolution: {integrity: sha512-GJxnIvuXuVhKaHfsOdzGipoOoXq72y3mdcncc9h6i6E7nlz89zBEj2wrLM7bqO5Xk9Lm2B94MwdQsSwRlaPSWw==} + dev: true + + /@types/hast@3.0.3: + resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + dependencies: + '@types/unist': 3.0.2 + + /@types/history@4.7.11: + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + /@types/html-minifier-terser@6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + dependencies: + '@types/node': 20.10.5 + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 3.0.2 + + /@types/mdx@2.0.10: + resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + /@types/node-forge@1.3.10: + resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} + dependencies: + '@types/node': 20.10.5 + + /@types/node@17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + dev: false + + /@types/node@20.10.5: + resolution: {integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==} + dependencies: + undici-types: 5.26.5 + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + /@types/prismjs@1.26.3: + resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + /@types/qs@6.9.10: + resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + /@types/react-dom@18.2.18: + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + dependencies: + '@types/react': 18.2.45 + dev: true + + /@types/react-router-config@5.0.11: + resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.45 + '@types/react-router': 5.1.20 + + /@types/react-router-dom@5.3.3: + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.45 + '@types/react-router': 5.1.20 + + /@types/react-router@5.1.20: + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.2.45 + + /@types/react@18.2.45: + resolution: {integrity: sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + /@types/sax@1.2.7: + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + dependencies: + '@types/node': 20.10.5 + dev: false + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.10.5 + + /@types/serve-index@1.9.4: + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + dependencies: + '@types/express': 4.17.21 + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.10.5 + + /@types/sockjs@0.3.36: + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + dependencies: + '@types/node': 20.10.5 + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.10.5 + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + dev: false + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-import-assertions@1.9.0(acorn@8.11.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.2 + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.1: + resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + engines: {node: '>=0.4.0'} + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /algoliasearch-helper@3.16.1(algoliasearch@4.22.0): + resolution: {integrity: sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + dependencies: + '@algolia/events': 4.0.1 + algoliasearch: 4.22.0 + dev: false + + /algoliasearch@4.22.0: + resolution: {integrity: sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg==} + dependencies: + '@algolia/cache-browser-local-storage': 4.22.0 + '@algolia/cache-common': 4.22.0 + '@algolia/cache-in-memory': 4.22.0 + '@algolia/client-account': 4.22.0 + '@algolia/client-analytics': 4.22.0 + '@algolia/client-common': 4.22.0 + '@algolia/client-personalization': 4.22.0 + '@algolia/client-search': 4.22.0 + '@algolia/logger-common': 4.22.0 + '@algolia/logger-console': 4.22.0 + '@algolia/requester-browser-xhr': 4.22.0 + '@algolia/requester-common': 4.22.0 + '@algolia/requester-node-http': 4.22.0 + '@algolia/transporter': 4.22.0 + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + /autoprefixer@10.4.16(postcss@8.4.32): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001570 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /babel-loader@9.1.3(@babel/core@7.23.6)(webpack@5.89.0): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.23.6 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.89.0 + + /babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.5 + + /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.6): + resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.6 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): + resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) + core-js-compat: 3.34.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6): + resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) + transitivePeerDependencies: + - supports-color + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /bonjour-service@1.1.1: + resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + dependencies: + array-flatten: 2.1.2 + dns-equal: 1.0.0 + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + /boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001570 + electron-to-chromium: 1.4.615 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001570 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + /caniuse-lite@1.0.30001570: + resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + dev: false + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + /combine-promises@1.2.0: + resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} + engines: {node: '>=10'} + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + /command-exists-promise@2.0.2: + resolution: {integrity: sha512-T6PB6vdFrwnHXg/I0kivM3DqaCGZLjjYSOe0a5WgFKcz1sOnmOeIjnhQPXVXX3QjVbLyTJ85lJkX6lUpukTzaA==} + engines: {node: '>=6'} + dev: true + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + /content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /copy-text-to-clipboard@3.2.0: + resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} + engines: {node: '>=12'} + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /copy-webpack-plugin@11.0.0(webpack@5.89.0): + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + dependencies: + fast-glob: 3.3.2 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + webpack: 5.89.0 + + /core-js-compat@3.34.0: + resolution: {integrity: sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==} + dependencies: + browserslist: 4.22.2 + + /core-js-pure@3.34.0: + resolution: {integrity: sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg==} + requiresBuild: true + + /core-js@3.34.0: + resolution: {integrity: sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==} + requiresBuild: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + + /css-declaration-sorter@6.4.1(postcss@8.4.32): + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.32 + + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + dependencies: + hyphenate-style-name: 1.0.4 + dev: false + + /css-loader@6.8.1(webpack@5.89.0): + resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.32) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.32) + postcss-modules-scope: 3.0.0(postcss@8.4.32) + postcss-modules-values: 4.0.0(postcss@8.4.32) + postcss-value-parser: 4.2.0 + semver: 7.5.4 + webpack: 5.89.0 + + /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.3)(webpack@5.89.0): + resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + dependencies: + clean-css: 5.3.3 + cssnano: 5.1.15(postcss@8.4.32) + jest-worker: 29.7.0 + postcss: 8.4.32 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + source-map: 0.6.1 + webpack: 5.89.0 + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /cssnano-preset-advanced@5.3.10(postcss@8.4.32): + resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + autoprefixer: 10.4.16(postcss@8.4.32) + cssnano-preset-default: 5.2.14(postcss@8.4.32) + postcss: 8.4.32 + postcss-discard-unused: 5.1.0(postcss@8.4.32) + postcss-merge-idents: 5.1.1(postcss@8.4.32) + postcss-reduce-idents: 5.2.0(postcss@8.4.32) + postcss-zindex: 5.1.0(postcss@8.4.32) + + /cssnano-preset-default@5.2.14(postcss@8.4.32): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.4.32) + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-calc: 8.2.4(postcss@8.4.32) + postcss-colormin: 5.3.1(postcss@8.4.32) + postcss-convert-values: 5.1.3(postcss@8.4.32) + postcss-discard-comments: 5.1.2(postcss@8.4.32) + postcss-discard-duplicates: 5.1.0(postcss@8.4.32) + postcss-discard-empty: 5.1.1(postcss@8.4.32) + postcss-discard-overridden: 5.1.0(postcss@8.4.32) + postcss-merge-longhand: 5.1.7(postcss@8.4.32) + postcss-merge-rules: 5.1.4(postcss@8.4.32) + postcss-minify-font-values: 5.1.0(postcss@8.4.32) + postcss-minify-gradients: 5.1.1(postcss@8.4.32) + postcss-minify-params: 5.1.4(postcss@8.4.32) + postcss-minify-selectors: 5.2.1(postcss@8.4.32) + postcss-normalize-charset: 5.1.0(postcss@8.4.32) + postcss-normalize-display-values: 5.1.0(postcss@8.4.32) + postcss-normalize-positions: 5.1.1(postcss@8.4.32) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.32) + postcss-normalize-string: 5.1.0(postcss@8.4.32) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.32) + postcss-normalize-unicode: 5.1.1(postcss@8.4.32) + postcss-normalize-url: 5.1.0(postcss@8.4.32) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.32) + postcss-ordered-values: 5.1.3(postcss@8.4.32) + postcss-reduce-initial: 5.1.2(postcss@8.4.32) + postcss-reduce-transforms: 5.1.0(postcss@8.4.32) + postcss-svgo: 5.1.0(postcss@8.4.32) + postcss-unique-selectors: 5.1.1(postcss@8.4.32) + + /cssnano-utils@3.1.0(postcss@8.4.32): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + + /cssnano@5.1.15(postcss@8.4.32): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.32) + lilconfig: 2.1.0 + postcss: 8.4.32 + yaml: 1.10.2 + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + + /del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + /detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + dependencies: + address: 1.2.2 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + + /detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + dependencies: + address: 1.2.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /dns-equal@1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + + /dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /electron-to-chromium@1.4.615: + resolution: {integrity: sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + /emoticon@4.0.1: + resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + dev: false + + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.5 + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.3 + astring: 1.8.6 + source-map: 0.7.4 + + /estree-util-value-to-estree@3.0.1: + resolution: {integrity: sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==} + engines: {node: '>=16.0.0'} + dependencies: + '@types/estree': 1.0.5 + is-plain-obj: 4.1.0 + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/unist': 3.0.2 + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + dependencies: + '@types/node': 20.10.5 + require-like: 0.1.2 + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-loops@1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + dev: false + + /fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + dev: false + + /fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + dependencies: + punycode: 1.4.1 + + /fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + dev: false + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + dependencies: + xml-js: 1.6.11 + + /file-loader@6.2.0(webpack@5.89.0): + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.89.0 + + /file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + dev: false + + /filesize@8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.23.5 + '@types/json-schema': 7.0.15 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.3.1 + fs-extra: 9.1.0 + glob: 7.2.3 + memfs: 3.5.3 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.5.4 + tapable: 1.1.3 + typescript: 5.2.2 + webpack: 5.89.0 + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + /framer-motion@10.16.16(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-je6j91rd7NmUX7L1XHouwJ4v3R+SO4umso2LUcgOct3rHZ0PajZ80ETYZTajzEXEl9DlKyzjyt4AvGQ+lrebOw==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: true + + /fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 4.0.0 + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.3 + + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.3 + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + /history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + dependencies: + '@babel/runtime': 7.23.6 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + value-equal: 1.0.1 + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + /html-entities@2.4.0: + resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.26.0 + + /html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.26.0 + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + /html-webpack-plugin@5.6.0(webpack@5.89.0): + resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.89.0 + + /htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + + /http-proxy-middleware@2.0.6(@types/express@4.17.21): + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.21 + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + transitivePeerDependencies: + - debug + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.3 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + /hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /icss-utils@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.32 + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + /image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + queue: 6.0.2 + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + /infima@0.2.0-alpha.43: + resolution: {integrity: sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==} + engines: {node: '>=12'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + + /inline-style-prefixer@7.0.0: + resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + dependencies: + css-in-js-utils: 3.1.0 + fast-loops: 1.1.3 + dev: false + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /ipaddr.js@2.1.0: + resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + engines: {node: '>= 10'} + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + /is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + /is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + /is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.10.5 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.10.5 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 20.10.5 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + /joi@17.11.0: + resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonp@0.2.1: + resolution: {integrity: sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw==} + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.1 + + /launch-editor@2.6.1: + resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} + dependencies: + picocolors: 1.0.0 + shell-quote: 1.8.1 + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + /loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + /mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + dependencies: + '@types/mdast': 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.5 + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + + /micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + dependencies: + fault: 2.0.1 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.33.0 + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /mini-css-extract-plugin@2.7.6(webpack@5.89.0): + resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + schema-utils: 4.2.0 + webpack: 5.89.0 + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nano-css@5.6.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + css-tree: 1.1.3 + csstype: 3.1.3 + fastest-stable-stringify: 2.0.2 + inline-style-prefixer: 7.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rtl-css-js: 1.16.1 + stacktrace-js: 2.0.2 + stylis: 4.3.0 + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + + /node-emoji@2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + + /path-to-regexp@2.2.1: + resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + dependencies: + find-up: 6.3.0 + + /pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + + /postcss-calc@8.2.4(postcss@8.4.32): + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + + /postcss-colormin@5.3.1(postcss@8.4.32): + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.2 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-convert-values@5.1.3(postcss@8.4.32): + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.2 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-discard-comments@5.1.2(postcss@8.4.32): + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + + /postcss-discard-duplicates@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + + /postcss-discard-empty@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + + /postcss-discard-overridden@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + + /postcss-discard-unused@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + + /postcss-import@15.1.0(postcss@8.4.32): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.32 + dev: true + + /postcss-load-config@4.0.2(postcss@8.4.32): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.32 + yaml: 2.3.4 + dev: true + + /postcss-loader@7.3.3(postcss@8.4.32)(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + dependencies: + cosmiconfig: 8.3.6(typescript@5.2.2) + jiti: 1.21.0 + postcss: 8.4.32 + semver: 7.5.4 + webpack: 5.89.0 + transitivePeerDependencies: + - typescript + + /postcss-merge-idents@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-merge-longhand@5.1.7(postcss@8.4.32): + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.4.32) + + /postcss-merge-rules@5.1.4(postcss@8.4.32): + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.2 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + + /postcss-minify-font-values@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-minify-gradients@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-minify-params@5.1.4(postcss@8.4.32): + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.2 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-minify-selectors@5.2.1(postcss@8.4.32): + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + + /postcss-modules-extract-imports@3.0.0(postcss@8.4.32): + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.32 + + /postcss-modules-local-by-default@4.0.3(postcss@8.4.32): + resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + + /postcss-modules-scope@3.0.0(postcss@8.4.32): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + + /postcss-modules-values@4.0.0(postcss@8.4.32): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 + + /postcss-nested@6.0.1(postcss@8.4.32): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-normalize-charset@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + + /postcss-normalize-display-values@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-normalize-positions@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-normalize-string@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-normalize-unicode@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.2 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-normalize-url@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-normalize-whitespace@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-ordered-values@5.1.3(postcss@8.4.32): + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-reduce-idents@5.2.0(postcss@8.4.32): + resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-reduce-initial@5.1.2(postcss@8.4.32): + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.2 + caniuse-api: 3.0.0 + postcss: 8.4.32 + + /postcss-reduce-transforms@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-sort-media-queries@4.4.1(postcss@8.4.32): + resolution: {integrity: sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.4.16 + dependencies: + postcss: 8.4.32 + sort-css-media-queries: 2.1.0 + + /postcss-svgo@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + /postcss-unique-selectors@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss-zindex@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.32 + + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + /pretty-time@1.1.0: + resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} + engines: {node: '>=4'} + + /prism-react-renderer@2.3.1(react@18.2.0): + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + peerDependencies: + react: '>=16.0.0' + dependencies: + '@types/prismjs': 1.26.3 + clsx: 2.0.0 + react: 18.2.0 + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + dependencies: + escape-goat: 4.0.0 + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + /react-dev-utils@12.0.1(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/code-frame': 7.23.5 + address: 1.2.2 + browserslist: 4.22.2 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.2.2)(webpack@5.89.0) + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.2.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + typescript: 5.2.2 + webpack: 5.89.0 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + /react-helmet-async@1.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.6 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + /react-helmet-async@2.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + dependencies: + invariant: 2.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-json-view-lite@1.2.1(react@18.2.0): + resolution: {integrity: sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0): + resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: '>=4.41.1 || 5.x' + dependencies: + '@babel/runtime': 7.23.6 + react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) + webpack: 5.89.0 + + /react-router-config@5.1.1(react-router@5.3.4)(react@18.2.0): + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + dependencies: + '@babel/runtime': 7.23.6 + react: 18.2.0 + react-router: 5.3.4(react@18.2.0) + + /react-router-dom@5.3.4(react@18.2.0): + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} + peerDependencies: + react: '>=15' + dependencies: + '@babel/runtime': 7.23.6 + history: 4.10.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-router: 5.3.4(react@18.2.0) + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + + /react-router@5.3.4(react@18.2.0): + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + peerDependencies: + react: '>=15' + dependencies: + '@babel/runtime': 7.23.6 + history: 4.10.1 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + path-to-regexp: 1.8.0 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 16.13.1 + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + + /react-share@5.0.3(react@18.2.0): + resolution: {integrity: sha512-8BFkzfd8zNrO6JMP4Dwrt2sTSrRGQ9bNrU3K0riAwRJe4U/Z8/ryjKuhP2jLoHsfxj38MsPuyEQiVlIHVIICvw==} + peerDependencies: + react: ^17 || ^18 + dependencies: + classnames: 2.3.2 + jsonp: 0.2.1 + react: 18.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: '*' + tslib: '*' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react-use@17.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1jPtmWLD8OJJNYCdYLJEH/HM+bPDfJuyGwCYeJFgPmWY8ttwpgZnW5QnzgM55CYUByUiTjHxsGOnEpLl6yQaoQ==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@types/js-cookie': 2.2.7 + '@xobotyi/scrollbar-width': 1.9.5 + copy-to-clipboard: 3.3.3 + fast-deep-equal: 3.1.3 + fast-shallow-equal: 1.0.0 + js-cookie: 2.2.1 + nano-css: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + set-harmonic-interval: 1.0.1 + throttle-debounce: 3.0.1 + ts-easing: 0.2.0 + tslib: 2.6.2 + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.8 + + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.6 + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + dependencies: + '@types/hast': 3.0.3 + hast-util-raw: 9.0.1 + vfile: 6.0.1 + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + /remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + /remark-emoji@4.0.1: + resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/mdast': 4.0.3 + emoticon: 4.0.1 + mdast-util-find-and-replace: 3.0.1 + node-emoji: 2.1.3 + unified: 11.0.4 + + /remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + /remark-mdx@3.0.0: + resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + /remark-rehype@11.0.0: + resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + + /renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + dependencies: + '@babel/runtime': 7.23.6 + dev: false + + /rtl-detect@1.1.2: + resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} + + /rtlcss@4.1.1: + resolution: {integrity: sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + escalade: 3.1.1 + picocolors: 1.0.0 + postcss: 8.4.32 + strip-json-comments: 3.1.1 + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: false + + /search-insights@2.13.0: + resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.10 + node-forge: 1.3.1 + + /semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.5.4 + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + + /serve-handler@6.1.5: + resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + fast-url-parser: 1.1.3 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 2.2.1 + range-parser: 1.2.0 + + /serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + dev: false + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.24 + mrmime: 1.0.1 + totalist: 3.0.1 + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + /sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.3.0 + dev: false + + /skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + dependencies: + unicode-emoji-modifier-base: 1.0.0 + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + /sort-css-media-queries@2.1.0: + resolution: {integrity: sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==} + engines: {node: '>= 6.3.0'} + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + /stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + dependencies: + stackframe: 1.3.4 + dev: false + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false + + /stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + dependencies: + source-map: 0.5.6 + stackframe: 1.3.4 + dev: false + + /stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + dependencies: + error-stack-parser: 2.1.4 + stack-generator: 2.0.10 + stacktrace-gps: 3.1.2 + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /std-env@3.6.0: + resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + + /stylehacks@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.22.2 + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + + /stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + dev: false + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + + /tailwindcss@3.4.0: + resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-import: 15.1.0(postcss@8.4.32) + postcss-js: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.2(postcss@8.4.32) + postcss-nested: 6.0.1(postcss@8.4.32) + postcss-selector-parser: 6.0.13 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + + /tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.89.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.26.0 + webpack: 5.89.0 + + /terser@5.26.0: + resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.2 + commander: 2.20.3 + source-map-support: 0.5.21 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: false + + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + /tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + /title-case@4.2.0: + resolution: {integrity: sha512-rNoF1XCDvb1aSlhFp6f1PhLM9WaP3S768r6EUMdB7ntFX9AwidZIxsc+Vlq4zbwskmkATXvN0T12TCWL/bjmFQ==} + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + + /ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + /unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + + /update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + dependencies: + boxen: 7.1.1 + chalk: 5.3.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.5.4 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.89.0): + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + dependencies: + file-loader: 6.2.0(webpack@5.89.0) + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.89.0 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + /utility-types@3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webpack-bundle-analyzer@4.10.1: + resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.11.2 + acorn-walk: 8.3.1 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + is-plain-object: 5.0.0 + opener: 1.5.2 + picocolors: 1.0.0 + sirv: 2.0.3 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /webpack-dev-middleware@5.3.3(webpack@5.89.0): + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.89.0 + + /webpack-dev-server@4.15.1(webpack@5.89.0): + resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.5 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.10 + ansi-html-community: 0.0.8 + bonjour-service: 1.1.1 + chokidar: 3.5.3 + colorette: 2.0.20 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.18.2 + graceful-fs: 4.2.11 + html-entities: 2.4.0 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.1.0 + launch-editor: 2.6.1 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.89.0 + webpack-dev-middleware: 5.3.3(webpack@5.89.0) + ws: 8.15.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + /webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.89.0: + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.2 + acorn-import-assertions: 1.9.0(acorn@8.11.2) + browserslist: 4.22.2 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.89.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /webpackbar@5.0.2(webpack@5.89.0): + resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} + engines: {node: '>=12'} + peerDependencies: + webpack: 3 || 4 || 5 + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + pretty-time: 1.1.0 + std-env: 3.6.0 + webpack: 5.89.0 + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + + /wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.15.1: + resolution: {integrity: sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + /xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + dependencies: + sax: 1.3.0 + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000000..e2dc47804e --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +} \ No newline at end of file diff --git a/sidebars.ts b/sidebars.ts new file mode 100644 index 0000000000..acc7685acd --- /dev/null +++ b/sidebars.ts @@ -0,0 +1,31 @@ +import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ +const sidebars: SidebarsConfig = { + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + 'intro', + 'hello', + { + type: 'category', + label: 'Tutorial', + items: ['tutorial-basics/create-a-document'], + }, + ], + */ +}; + +export default sidebars; diff --git a/src/ILLATheme/BlogLayout/index.tsx b/src/ILLATheme/BlogLayout/index.tsx new file mode 100644 index 0000000000..2e537d164d --- /dev/null +++ b/src/ILLATheme/BlogLayout/index.tsx @@ -0,0 +1,105 @@ +import React, { useEffect, useState } from 'react'; +import { CommonLayout } from '../CommonLayout'; +import { CommonHeader } from '../CommonHeader'; +// import { BlogFooter } from './blog-footer'; +import clsx from 'clsx'; +import { useMotionValueEvent, useScroll } from 'framer-motion'; +import { BannerSidebar } from '../../components/banner/siderBar'; +import { BannerModal } from '../../components/banner/modal'; +import CommonFooter from '../CommonFooter'; + +type Props = { + showSidebarBanner?: boolean; +} & Record; + +export const ILLABlogLayout = (props: Props) => { + const [shouldShowBanner, setShouldShowBanner] = useState(false); + const { children, toc, showSidebarBanner = true, ...layoutProps } = props; + const { scrollYProgress } = useScroll(); + + useMotionValueEvent(scrollYProgress, 'change', (latest) => { + if (!showSidebarBanner) return; + + if (latest > 0.2) { + setShouldShowBanner(true); + } + + if (latest < 0.2) { + setShouldShowBanner(false); + } + }); + + // const tracker = useScrollTracker(); + + // useEffect(() => { + // if (!showSidebarBanner) return; + + // if (tracker.scrollY > 20) { + // setShouldShowBanner(true); + // } + + // if (tracker.scrollY < 20) { + // setShouldShowBanner(false); + // } + // }, [tracker.scrollY, showSidebarBanner]); + + return ( + + {/* If there's TOC, then we can say that this is a blog post page. */} + {/* Then we can pass `trackProgress` prop to the header. */} + +
+ {showSidebarBanner && ( +
+
+ +
+
+ )} +
+ {children} +
+ {toc && ( +
+ {toc} +
+ )} +
+ + +
+ ); +}; diff --git a/src/ILLATheme/BlogTOC/index.tsx b/src/ILLATheme/BlogTOC/index.tsx new file mode 100644 index 0000000000..a4f7002816 --- /dev/null +++ b/src/ILLATheme/BlogTOC/index.tsx @@ -0,0 +1,139 @@ +import React from 'react'; +import clsx from 'clsx'; +import { useLocation, useHistory } from '@docusaurus/router'; +import { Tags } from '@site/src/components/blog/Tags'; + +export const BlogTOCItem = ({ + id, + value, + level, + activeId, + onIdChange, +}: { + id: string; + value: string; + level: number; + activeId: string; + onIdChange?: (id: string) => void; +}) => { + React.useEffect(() => { + const targetElement = document.getElementById(id); + + if (targetElement) { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + onIdChange(id); + } + }); + }, + { + rootMargin: '0px 0px -80% 0px', + }, + ); + + observer.observe(targetElement); + + return () => { + observer.unobserve(targetElement); + }; + } + }, [id]); + + return ( + + ); +}; + +export const BlogTOC = (props) => { + const history = useHistory(); + const location = useLocation(); + const { toc, hasTOC, activeId, setActiveId } = useTOC(props.toc); + + const onIdChange = (id) => { + if (id !== `${location.hash ?? ''}`.replace('#', '')) { + setActiveId(id); + window.history.replaceState({}, '', `#${id}`); + } + }; + + return ( +
+ +
    + {toc.map((item) => { + return ( +
  • + +
  • + ); + })} +
+
+ ); +}; + +export const useTOC = (toc) => { + const { hash } = useLocation(); + + const baseActiveId = `${hash}`.replace('#', ''); + + const [activeId, setActiveId] = React.useState( + baseActiveId, + ); + + React.useEffect(() => { + setActiveId(baseActiveId); + }, [baseActiveId]); + + const hasTOC = toc?.length > 0; + + return { + toc, + activeId, + setActiveId, + hasTOC, + }; +}; diff --git a/src/ILLATheme/CommonFooter/FooterItem/index.tsx b/src/ILLATheme/CommonFooter/FooterItem/index.tsx new file mode 100644 index 0000000000..2f1b90958b --- /dev/null +++ b/src/ILLATheme/CommonFooter/FooterItem/index.tsx @@ -0,0 +1,80 @@ +import { useState } from 'react'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import style from '../index.module.css'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import Translate from '@docusaurus/Translate'; + +export const FooterItems = ({ items, whiteTheme }) => { + const [showMore, setShowMore] = useState(false); + + const handleShowMore = () => { + setShowMore(!showMore); + sendTagEvent({ + action: 'click', + category: showMore + ? 'homepage_footer_show_less' + : 'homepage_footer_show_more', + }); + }; + + return ( + <> + {items.slice(0, 6).map(({ label, href = '', tagCategory }) => ( + + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: label, + value: href, + }); + }} + > + {label} + + + ))} + {showMore && + items.slice(6).map(({ label, href = '', tagCategory }) => ( + + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: label, + value: href, + }); + }} + > + {label} + + + ))} + + {showMore ? ( + Show less + ) : ( + Show more + )} + + + ); +}; diff --git a/src/ILLATheme/CommonFooter/constants.tsx b/src/ILLATheme/CommonFooter/constants.tsx new file mode 100644 index 0000000000..bc9ab91a07 --- /dev/null +++ b/src/ILLATheme/CommonFooter/constants.tsx @@ -0,0 +1,316 @@ +import DiscordIcon from '@site/static/img/public/discord.svg'; +import GithubIcon from '@site/static/img/public/github.svg'; +import LinkedInIcon from '@site/static/img/public/linkedin.svg'; +import ProductHuntIcon from '@site/static/img/public/productHunt.svg'; +import TwitterIcon from '@site/static/img/public/twitter.svg'; +import { translate } from '@docusaurus/Translate'; +import { IFootContentItem } from './interface'; + +export const Community: IFootContentItem[] = [ + { + icon: , + href: 'https://github.com/illacloud/illa-builder', + tagCategory: 'homepage_footer_github_click', + label: 'GitHub', + }, + { + icon: , + href: 'https://twitter.com/illacloudhq', + tagCategory: 'homepage_footer_twitter_click', + label: 'Twitter', + }, + { + icon: , + href: 'https://discord.com/invite/illacloud', + tagCategory: 'homepage_footer_discord_click', + label: 'Discord', + }, + { + icon: , + href: 'https://www.producthunt.com/posts/illa', + tagCategory: 'homepage_footer_producthunt_click', + label: 'ProductHunt', + }, + { + icon: , + href: 'https://www.linkedin.com/company/illacloud/', + tagCategory: 'homepage_footer_linkedin_click', + label: 'LinkedIn', + }, +]; + +const AboutUs: IFootContentItem[] = [ + { + label: translate({ + message: 'Status', + id: 'footer.status', + }), + href: 'https://status.illacloud.com/', + tagCategory: 'homepage_footer_status_click', + target: 'Status', + }, + { + label: translate({ + message: 'Roadmap', + id: 'footer.roadmap', + }), + href: 'https://github.com/orgs/illacloud/projects/4', + tagCategory: 'homepage_footer_roadmap_click', + target: 'Roadmap', + }, + { + label: translate({ + message: 'Changelog', + id: 'footer.changelog', + }), + href: 'https://github.com/illacloud/illa-builder/releases', + tagCategory: 'homepage_footer_changelog_click', + target: 'Changelog', + }, + { + label: translate({ + message: 'Media Kit', + id: 'footer.media', + }), + href: 'https://illa-cloud-storage.illacloud.com/system-assets/media-kit/illa_media_kit.20230228.zip', + downloadName: 'ILLA Media Kit.zip', + tagCategory: 'homepage_footer_mediakit_click', + }, +]; + +const Product: IFootContentItem[] = [ + { + label: translate({ + message: 'ILLA Drive', + id: 'footer.drive', + }), + href: '/illadrive', + tagCategory: 'homepage_footer_drive_click', + target: 'drive', + }, + { + label: translate({ + message: 'ILLA AI', + id: 'footer.cloud', + }), + href: '/illacloud', + tagCategory: 'homepage_footer_cloud_click', + target: 'cloud', + }, + { + label: translate({ + message: 'Self host', + id: 'footer.selfhost', + }), + href: '/illa-self-host', + tagCategory: 'homepage_footer_self_host_click', + target: 'self_host', + }, +]; + +const Components: IFootContentItem[] = [ + { + label: translate({ + message: 'Table', + id: 'footer.table', + }), + href: '/components/Tables', + tagCategory: 'homepage_footer_table_click', + target: 'footer_table', + }, + { + label: translate({ + message: 'Chart', + id: 'footer.chart', + }), + href: '/components/Chart', + tagCategory: 'homepage_footer_chart_click', + target: 'footer_chart', + }, + { + label: translate({ + message: 'Upload', + id: 'footer.upload', + }), + href: '/components/Upload', + tagCategory: 'homepage_footer_upload_click', + target: 'footer_upload', + }, + { + label: translate({ + message: 'Switch', + id: 'footer.switch', + }), + href: '/components/Switch', + tagCategory: 'homepage_footer_switch_click', + target: 'footer_switch', + }, + { + label: translate({ + message: 'Select', + id: 'footer.select', + }), + href: '/components/Select', + tagCategory: 'homepage_footer_select_click', + target: 'footer_select', + }, + { + label: translate({ + message: 'Radio Group', + id: 'footer.radio_group', + }), + href: '/components/Radio%20group', + tagCategory: 'homepage_footer_radio_group_click', + target: 'footer_radio_group', + }, + { + label: translate({ + message: 'Checkbox Group', + id: 'footer.checkbox_group', + }), + href: '/components/Checkbox%20Group', + tagCategory: 'homepage_footer_checkbox_group_click', + target: 'footer_checkbox_group', + }, + { + label: translate({ + message: 'PDF', + id: 'footer.pdf', + }), + href: '/components/PDF', + tagCategory: 'homepage_footer_pdf_click', + target: 'footer_pdf', + }, + { + label: translate({ + message: 'Video', + id: 'footer.video', + }), + href: '/components/Video', + tagCategory: 'homepage_footer_video_click', + target: 'footer_video', + }, +]; + +const Integrations: IFootContentItem[] = [ + { + label: translate({ + message: 'MySQL', + id: 'footer.mysql', + }), + href: '/integrations/MySQL', + tagCategory: 'homepage_footer_mysql_click', + target: 'footer_mysql', + }, + { + label: translate({ + message: 'PostgreSQL', + id: 'footer.postgre', + }), + href: '/integrations/PostgreSQL', + tagCategory: 'homepage_footer_postgre_click', + target: 'footer_postgre', + }, + { + label: translate({ + message: 'MongoDB', + id: 'footer.mongodb', + }), + href: '/integrations/MongoDB', + tagCategory: 'homepage_footer_mongodb_click', + target: 'footer_mongodb', + }, + { + label: translate({ + message: 'Firebase', + id: 'footer.firebase', + }), + href: '/integrations/Firebase', + tagCategory: 'homepage_footer_firebase_click', + target: 'footer_firebase', + }, + { + label: translate({ + message: 'Elastic Search', + id: 'footer.elasticsearch', + }), + href: '/integrations/Elastic%20Search', + tagCategory: 'homepage_footer_elastic_search_click', + target: 'footer_elastic_search', + }, + { + label: translate({ + message: 'Microsoft SQL Server', + id: 'footer.mssql', + }), + href: '/integrations/Microsoft%20SQL%20Server', + tagCategory: 'homepage_footer_mssql_click', + target: 'footer_mssql', + }, + { + label: translate({ + message: 'Supabase', + id: 'footer.supabase', + }), + href: '/integrations/Supabase%20DB', + tagCategory: 'homepage_footer_supabase', + target: 'footer_supabase', + }, + { + label: translate({ + message: 'DynamoDB', + id: 'footer.dynamo', + }), + href: '/integrations/Amazon%20DynamoDB', + tagCategory: 'homepage_footer_dynamo', + target: 'footer_dynamo', + }, + { + label: translate({ + message: 'Hugging Face Inference API', + id: 'footer.hf', + }), + href: '/integrations/Hugging%20Face%20Inference%20API', + tagCategory: 'homepage_footer_hf_api_click', + target: 'footer_hf', + }, +]; + +export const footerContent = [ + { + title: translate({ + message: 'Components', + id: 'footer.components', + }), + items: Components, + }, + + { + title: translate({ + message: 'Integrations', + id: 'footer.integrations', + }), + items: Integrations, + }, + { + title: translate({ + message: 'Products', + id: 'footer.product', + }), + items: Product, + }, + { + title: translate({ + message: 'Company', + id: 'footer.company', + }), + items: AboutUs, + }, + { + title: translate({ + message: 'Community', + id: 'footer.community', + }), + items: Community, + }, +]; diff --git a/src/ILLATheme/CommonFooter/index.module.css b/src/ILLATheme/CommonFooter/index.module.css new file mode 100644 index 0000000000..42012d2f12 --- /dev/null +++ b/src/ILLATheme/CommonFooter/index.module.css @@ -0,0 +1,36 @@ +.footerContainer { + @apply w-full flex flex-col justify-center pt-[100px] items-center gap-[20px]; + @apply px-[20px] pb-[20px]; + @apply xl:pb-[40px] xl:px-[120px] xl:gap-[40px] xl:pt-[80px]; +} +.footerContentContainer { + @apply w-full; + @apply grid grid-cols-2 gap-y-[40px] justify-between xl:grid-cols-5 xl:gap-x-[40px]; + @apply xl:w-[1200px] xl:flex-nowrap; +} + +.space { + @apply w-full h-[1px]; + @apply xl:w-[1200px]; + background-color: rgba(255, 255, 255, 0.1); +} +.footerBottom { + @apply w-full flex flex-col justify-between items-center gap-[24px] font-[400] text-[12px] leading-[16px] text-white-01; + @apply xl:w-[1200px] xl:flex-row xl:gap-[48px] xl:text-[14px] xl:leading-[22px]; +} +.footerItem { + @apply font-[400] text-[12px] leading-[16px] cursor-pointer xl:text-[14px] xl:leading-[22px]; +} + +@media screen and (max-width: 1280px) { + .mobileFooterContainer { + transform: translateY(0) !important; + } +} + +.localSelectContainer { + :global .dropdown__menu { + top: unset; + bottom: calc(100% - var(--ifm-navbar-item-padding-vertical) + 0.3rem); + } +} diff --git a/src/ILLATheme/CommonFooter/index.tsx b/src/ILLATheme/CommonFooter/index.tsx new file mode 100644 index 0000000000..d8a81bfefc --- /dev/null +++ b/src/ILLATheme/CommonFooter/index.tsx @@ -0,0 +1,224 @@ +import style from './index.module.css'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import ILLA_LOGO from '@site/static/img/logo.svg'; +import WHITE_LOGO from '@site/static/img/whiteLogo.svg'; +import { useTransform, motion, useScroll } from 'framer-motion'; +import { FooterItems } from './FooterItem'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import { saveAs } from 'file-saver'; +// import { useElementFirstShow } from '@/hooks/useElementFirstShow'; +import { useRef, useCallback, FC } from 'react'; +import LocaleDropdownNavbarItem from '@theme/NavbarItem/LocaleDropdownNavbarItem'; +import { footerContent } from './constants'; +import Translate, { translate } from '@docusaurus/Translate'; +import { ICommonFooterProps } from './interface'; + +const CommonFooter: FC = ({ + whiteTheme = false, + scrollStart, + scrollEnd, +}) => { + // const { t } = useTranslation('home'); + const ref = useRef(null); + // const reportShow = useCallback(() => { + // sendTagEvent({ + // action: 'click', + // category: 'homepage_body_code_anywhere_show', + // }); + // }, []); + // useElementFirstShow(ref, reportShow); + + const mergeFooterContent = footerContent; + const { scrollYProgress } = useScroll(); + const translateY = useTransform( + scrollYProgress, + [scrollStart, scrollEnd], + [-150, 0], + ); + + return ( + +
+ {mergeFooterContent.map(({ title, items }) => ( +
+ + {title} + +
+ {items.length > 6 && ( + + )} + {items.length <= 6 && + items.map( + ({ label, href = '', tagCategory, icon, downloadName }) => { + if (downloadName) { + return ( + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: label, + value: href, + }); + saveAs(href, downloadName); + }} + > + {label} + + ); + } else { + return ( + + {icon ? ( + + {icon} + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: label, + value: href, + }); + }} + > + {label} + + + ) : ( + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: label, + value: href, + }); + }} + > + {label} + + )} + + ); + } + }, + )} +
+
+ ))} +
+
+
+
+ {whiteTheme ? : } + + + Build AI Driven Business App + +
+
+
+
+ {whiteTheme ? : } + +
+ + { + sendTagEvent({ + action: 'click', + category: 'homepage_footer_privacy_policy_click', + label: translate({ + id: 'footer.privacy-policy', + message: 'Privacy policy', + }), + }); + }} + > + Privacy policy + + + + { + sendTagEvent({ + action: 'click', + category: 'homepage_footer_terms_of_service_click', + label: translate({ + id: 'footer.terms-of-service', + message: 'Terms of service', + }), + }); + }} + > + + Terms of service + + + +
+
+
+ + ); +}; + +export default CommonFooter; diff --git a/src/ILLATheme/CommonFooter/interface.ts b/src/ILLATheme/CommonFooter/interface.ts new file mode 100644 index 0000000000..f1efc4a1bf --- /dev/null +++ b/src/ILLATheme/CommonFooter/interface.ts @@ -0,0 +1,16 @@ +import { ReactNode } from 'react'; + +export interface IFootContentItem { + label: string; + href: string; + downloadName?: string; + tagCategory: string; + icon?: ReactNode; + target?: string; +} + +export interface ICommonFooterProps { + whiteTheme?: boolean; + scrollStart: number; + scrollEnd: number; +} diff --git a/src/ILLATheme/CommonHeader/Menu/constants.tsx b/src/ILLATheme/CommonHeader/Menu/constants.tsx new file mode 100644 index 0000000000..bb4522ad2f --- /dev/null +++ b/src/ILLATheme/CommonHeader/Menu/constants.tsx @@ -0,0 +1,94 @@ +import { MenuItemType } from './interface'; +import { translate } from '@docusaurus/Translate'; + +export const MENU_ITEMS: MenuItemType[] = [ + { + isPopover: true, + label: translate({ id: 'nav.product', message: 'Products' }), + items: [ + { + label: translate({ + id: 'sub_nav.product.drive', + message: 'ILLA Drive', + }), + category: 'homepage_menu_product_drive_click', + link: '/illadrive', + }, + { + label: translate({ + id: 'sub_nav.product.cloud', + message: 'ILLA AI', + }), + category: 'homepage_menu_product_cloud_click', + link: '/illacloud', + }, + { + label: translate({ + id: 'sub_nav.product.selfhost', + message: 'Self Host', + }), + category: 'homepage_menu_product_selfhost_click', + link: '/illa-self-host', + }, + ], + }, + { + isPopover: true, + label: translate({ id: 'nav.resource', message: 'Resource' }), + items: [ + { + label: translate({ + id: 'sub_nav.resource.integrations', + message: 'Integrations', + }), + category: 'homepage_menu_resource_integration_click', + link: '/integrations', + target: 'integrations', + }, + { + label: translate({ + id: 'sub_nav.resource.components', + message: 'Components', + }), + category: 'homepage_menu_resource_components_click', + link: '/components', + target: 'components', + }, + ], + }, + { + isPopover: false, + label: translate({ + id: 'nav.pricing', + message: 'Pricing', + }), + href: '/pricing', + category: 'homepage_menu_pricing_click', + }, + { + isPopover: false, + label: translate({ + id: 'nav.doc', + message: 'Doc', + }), + href: 'https://docs.illacloud.com', + category: 'homepage_menu_doc_click', + }, + { + isPopover: false, + label: translate({ + id: 'nav.blog', + message: 'Blog', + }), + href: '/blog', + category: 'homepage_menu_blog_click', + }, + { + isPopover: false, + href: 'https://illa.ai', + label: translate({ + id: 'nav.marketplace', + message: 'Marketplace', + }), + }, +]; diff --git a/src/ILLATheme/CommonHeader/Menu/index.tsx b/src/ILLATheme/CommonHeader/Menu/index.tsx new file mode 100644 index 0000000000..c6bdc01196 --- /dev/null +++ b/src/ILLATheme/CommonHeader/Menu/index.tsx @@ -0,0 +1,64 @@ +import React, { Fragment } from 'react'; +import clsx from 'clsx'; +import { MENU_ITEMS } from './constants'; +import { NavbarItemType } from './interface'; +import { NavbarItem } from '../NavBar/navBarItem'; +import { Menu, Transition } from '@headlessui/react'; +import ChevronDownIcon from '@site/static/img/public/arrow.svg'; +import Link from '@docusaurus/Link'; + +export const HeaderMenu: React.FC = () => { + return ( + <> + {MENU_ITEMS.map((item) => { + if (item.isPopover) { + return ( + + + {item.label} + + + + {item.items.map((subItem) => ( + + {({ active }) => ( + + )} + + ))} + + + + ); + } + + return ( + + ); + })} + + ); +}; diff --git a/src/ILLATheme/CommonHeader/Menu/interface.ts b/src/ILLATheme/CommonHeader/Menu/interface.ts new file mode 100644 index 0000000000..e3118c9d14 --- /dev/null +++ b/src/ILLATheme/CommonHeader/Menu/interface.ts @@ -0,0 +1,25 @@ +import { ReactNode } from 'react'; + +export type NavbarPopoverItemType = { + isPopover: true; + label: string; + items: { + label: string; + link: string; + category: string; + target?: string; + }[]; +}; + +export type NavbarItemType = { + isPopover?: false; + label: string; + href?: string; + category?: string; +}; + +export type MenuItemType = NavbarPopoverItemType | NavbarItemType; + +export interface IMenuItemProps { + item: NavbarPopoverItemType['items'][0]; +} diff --git a/src/ILLATheme/CommonHeader/Menu/menuItem.tsx b/src/ILLATheme/CommonHeader/Menu/menuItem.tsx new file mode 100644 index 0000000000..399e2eddf2 --- /dev/null +++ b/src/ILLATheme/CommonHeader/Menu/menuItem.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; +import { IMenuItemProps } from './interface'; + +export const MenuItem: React.FC = ({ item }) => { + return ( + +
+
+
+ {item.label} +
+
+
+ + ); +}; diff --git a/src/ILLATheme/CommonHeader/MobileMenu/constant.ts b/src/ILLATheme/CommonHeader/MobileMenu/constant.ts new file mode 100644 index 0000000000..1ba0c5df37 --- /dev/null +++ b/src/ILLATheme/CommonHeader/MobileMenu/constant.ts @@ -0,0 +1 @@ +export const CONTACT_US_URL = 'https://calendly.com/illa-demo/0295'; diff --git a/src/ILLATheme/CommonHeader/MobileMenu/index.tsx b/src/ILLATheme/CommonHeader/MobileMenu/index.tsx new file mode 100644 index 0000000000..8a819f8ead --- /dev/null +++ b/src/ILLATheme/CommonHeader/MobileMenu/index.tsx @@ -0,0 +1,112 @@ +import clsx from 'clsx'; +import { useEffect, useState } from 'react'; +import Link from '@docusaurus/Link'; +import IllaLogoWhiteIcon from '@site/static/img/whiteLogo.svg'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import { MENU_ITEMS } from '../Menu/constants'; +import LocaleDropdownNavbarItem from '@theme/NavbarItem/LocaleDropdownNavbarItem'; +import CloseWhiteIcon from '@site/static/img/public/close.svg'; +import { CONTACT_US_URL } from './constant'; +import Translate, { translate } from '@docusaurus/Translate'; +import { Disclosure } from '@headlessui/react'; +import { MenuItem } from '../Menu/menuItem'; + +const MobileMenu = ({ menuExpand, closeMenu, onChangeShow }) => { + useEffect(() => { + if (menuExpand) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'visible'; + } + }, [menuExpand]); + + return ( +
+
+ + + + { + closeMenu && closeMenu(); + }} + > + + +
+
+ {MENU_ITEMS.map((item) => { + if (item.isPopover) { + return ( + + + {item.label} + + + {item.items.map((subItem) => ( + + ))} + + + ); + } + return
; + })} +
+ {/* {selectItems.map((options, index) => ( + + ))} + {menuItems.map(({ href, category, title }) => ( + +
{ + sendTagEvent({ + action: 'click', + category, + label: t(title), + }); + }} + > + {t(title)} + + + ))} */} + { + sendTagEvent({ + action: 'click', + category: 'homepage_menu_contact_click', + label: translate({ + id: 'nav.contact', + message: 'Book demo', + }), + }); + closeMenu && closeMenu(); + onChangeShow(); + }} + className="w-full cursor-pointer flex flex-row flex-nowrap items-center h-[32px] gap-[8px] px-3 py-[6px]" + > + Book demo + + +
+ +
+
+ ); +}; + +export default MobileMenu; diff --git a/src/ILLATheme/CommonHeader/NavBar/interface.ts b/src/ILLATheme/CommonHeader/NavBar/interface.ts new file mode 100644 index 0000000000..e28c865391 --- /dev/null +++ b/src/ILLATheme/CommonHeader/NavBar/interface.ts @@ -0,0 +1,5 @@ +import { NavbarItemType } from '../Menu/interface'; + +export interface INavbarItemProps { + item: NavbarItemType; +} diff --git a/src/ILLATheme/CommonHeader/NavBar/navBarItem.tsx b/src/ILLATheme/CommonHeader/NavBar/navBarItem.tsx new file mode 100644 index 0000000000..d640a4a93f --- /dev/null +++ b/src/ILLATheme/CommonHeader/NavBar/navBarItem.tsx @@ -0,0 +1,19 @@ +import React, { FC } from 'react'; +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; + +import { INavbarItemProps } from './interface'; + +export const NavbarItem: FC = ({ item }) => { + return ( + + {item.label} + + ); +}; diff --git a/src/ILLATheme/CommonHeader/index.tsx b/src/ILLATheme/CommonHeader/index.tsx new file mode 100644 index 0000000000..c878e5a8dc --- /dev/null +++ b/src/ILLATheme/CommonHeader/index.tsx @@ -0,0 +1,122 @@ +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; +import { + motion, + useMotionValueEvent, + useScroll, + useTransform, +} from 'framer-motion'; +import React, { useState } from 'react'; +// import { Menu } from './common-header/menu'; +// import { MobileMenuModal } from './common-header/mobile-menu-modal'; +import ILLA_LOGO from '@site/static/img/logo.svg'; +import WHITE_LOGO from '@site/static/img/whiteLogo.svg'; +import MenuIcon from '@site/static/img/public/menu.svg'; +import { HeaderMenu } from './Menu'; +import MobileMenu from './MobileMenu'; + +type Props = { + hasSticky?: boolean; + trackProgress?: boolean; + whiteTheme?: boolean; +}; + +export const CommonHeader = ({ trackProgress, whiteTheme }: Props) => { + const [isModalOpen, setIsModalOpen] = useState(false); + const { scrollYProgress } = useScroll(); + + const [hasBgColor, setHasBgColor] = useState(false); + + const progressPercentage = useTransform( + scrollYProgress, + [0.03, 0.95], + ['0%', '100%'], + ); + + useMotionValueEvent(scrollYProgress, 'change', (latest) => { + if (latest > 0.04 && !hasBgColor) { + setHasBgColor(true); + } else if (latest < 0.004 && hasBgColor) { + setHasBgColor(false); + } + }); + + return ( + <> +
+
+
+ + {whiteTheme ? ( + + ) : ( + + )} + + +
+ +
+ + { + setIsModalOpen(false); + }} + onChangeShow={undefined} + /> +
+
+ {trackProgress && ( +
+ +
+ )} +
+ + ); +}; diff --git a/src/ILLATheme/CommonLayout/index.tsx b/src/ILLATheme/CommonLayout/index.tsx new file mode 100644 index 0000000000..0febfdb85e --- /dev/null +++ b/src/ILLATheme/CommonLayout/index.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import ErrorBoundary from '@docusaurus/ErrorBoundary'; +import { PageMetadata } from '@docusaurus/theme-common'; +import { useKeyboardNavigation } from '@docusaurus/theme-common/internal'; +import ErrorPageContent from '@theme/ErrorPageContent'; +import LayoutProvider from '@theme/Layout/Provider'; +import SkipToContent from '@theme/SkipToContent'; +import { LivePreviewProvider } from '../../components/LivePreviewContext'; +import clsx from 'clsx'; + +export const CommonLayout = (props: any) => { + const { children, title, description } = props; + + useKeyboardNavigation(); + + return ( + + + +
+ }> + {children} + +
+
+ ); +}; diff --git a/src/components/LivePreviewContext/index.tsx b/src/components/LivePreviewContext/index.tsx new file mode 100644 index 0000000000..cf98d9fe9a --- /dev/null +++ b/src/components/LivePreviewContext/index.tsx @@ -0,0 +1,43 @@ +import React, { PropsWithChildren } from 'react'; + +export type LivePreviewContextType = { + shared: string | undefined; + sharedCss: string | undefined; + setShared: React.Dispatch>; + setSharedCss: React.Dispatch>; +}; + +export const LivePreviewContext = React.createContext({ + shared: undefined, + sharedCss: undefined, + setShared: () => undefined, + setSharedCss: () => undefined, +}); + +export const LivePreviewProvider: React.FC> = ({ + children, +}) => { + const [shared, setShared] = React.useState(undefined); + const [sharedCss, setSharedCss] = React.useState( + undefined, + ); + return ( + + {children} + + ); +}; + +export const useLivePreviewContext = (): LivePreviewContextType => { + const context = React.useContext(LivePreviewContext); + + if (!context) { + throw new Error( + 'useLivePreviewContext must be used within a LivePreviewProvider', + ); + } + + return context; +}; diff --git a/src/components/banner/modal.tsx b/src/components/banner/modal.tsx new file mode 100644 index 0000000000..1c03672328 --- /dev/null +++ b/src/components/banner/modal.tsx @@ -0,0 +1,197 @@ +import React, { FC, Fragment, useEffect, useRef, useState } from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import { Dialog, Transition } from '@headlessui/react'; +import useLocalStorage from '@site/src/hooks/localstorage'; +import { useLocation } from '@docusaurus/router'; +import { useMotionValueEvent, useScroll } from 'framer-motion'; + +const SCROLL_TRESHOLD = 0.79; +const SCROLL_MAX = 1; +const MAX_VISIT_COUNT = 9; + +type Props = { + title?: string; + variant?: 'gray' | 'purple'; + image?: { + src?: string; + alt?: string; + href?: string; + }; + button?: { + text: string; + href?: string; + onClick?: () => void; + }; +}; + +export const BannerModal: FC = ({ + title = "refine's app scaffolder offers +720 customizable CRUD app codebase combinations.", + variant = 'purple', + image = { + src: 'https://refine.ams3.cdn.digitaloceanspaces.com/website/static/banners/playground.gif', + alt: 'refine App screenshot', + href: 'https://s.refine.dev/banner-modal?ref=banner-modal', + }, + button = { + text: 'Try online', + href: 'https://s.refine.dev/banner-modal?ref=banner-modal', + onClick: undefined, + }, +}) => { + const { pathname } = useLocation(); + const [isOpen, setIsOpen] = useState(false); + const [visitCount, setVisitCount] = useLocalStorage('banner-modal', null); + const scrollTresholdExceeded = useRef(false); + + const { scrollYProgress } = useScroll(); + + useMotionValueEvent(scrollYProgress, 'change', (latest) => { + if (pathname === '/blog/' || pathname === '/blog') return; + if (scrollTresholdExceeded.current || isOpen) return; + + if (latest > SCROLL_TRESHOLD && latest < SCROLL_MAX) { + scrollTresholdExceeded.current = true; + + if (visitCount === MAX_VISIT_COUNT || visitCount === null) { + setIsOpen(true); + setVisitCount(0); + } else { + setVisitCount(visitCount + 1); + scrollTresholdExceeded.current = true; + } + } + }); + + return ( + + setIsOpen(false)} + > + +
+ + +
+
+ + +
+
+ + {image?.alt + +

+ {title} +

+ {/* +
+ {button.text} +
+ +
*/} +
+ +
+
+
+
+
+
+
+ ); +}; diff --git a/src/components/banner/siderBar.tsx b/src/components/banner/siderBar.tsx new file mode 100644 index 0000000000..fc540f2ddc --- /dev/null +++ b/src/components/banner/siderBar.tsx @@ -0,0 +1,59 @@ +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; +import React from 'react'; + +const text = 'Struggling with internal tools?'; +const description = + 'Explore refine’s limitless possibilities in crafting CRUD apps, CRM solutions, HR dashboards, and more!'; +const image = + 'https://refine.ams3.cdn.digitaloceanspaces.com/website/static/banners/app-crm.png'; + +export const BannerSidebar = ({ shouldShowBanner }) => { + return ( +
+ + {'refine + + +

{text}

+

{description}

+ + {/* +
+ Try online +
+ +
*/} +
+ ); +}; diff --git a/src/components/blog/FeaturedBlogPostItem/index.js b/src/components/blog/FeaturedBlogPostItem/index.js new file mode 100644 index 0000000000..eba90c48e6 --- /dev/null +++ b/src/components/blog/FeaturedBlogPostItem/index.js @@ -0,0 +1,108 @@ +import React from "react"; +import Link from "@docusaurus/Link"; +import { useBlogPost } from "@docusaurus/theme-common/internal"; +import BlogPostItemContainer from "@theme/BlogPostItem/Container"; + +import { Date } from "@site/src/components/blog/common/date"; +import clsx from "clsx"; + +export const FeaturedBlogPostItem = () => { + const { metadata } = useBlogPost(); + const { + permalink, + title, + date, + formattedDate, + frontMatter, + description, + tags, + } = metadata; + + const author = metadata.authors[0]; + + return ( + + +
+ {title} +
+ +
+
+ {tags.map((tag) => ( + + {tag.label} + + ))} +
+
+ +
+ {title} +
+ +
+ {description} +
+
+ +
+ + + +
+
+
+ ); +}; diff --git a/src/components/blog/FeaturedBlogPostItems/index.js b/src/components/blog/FeaturedBlogPostItems/index.js new file mode 100644 index 0000000000..65beb0a531 --- /dev/null +++ b/src/components/blog/FeaturedBlogPostItems/index.js @@ -0,0 +1,48 @@ +import React from "react"; +import { BlogPostProvider } from "@docusaurus/theme-common/internal"; + +import { FeaturedBlogPostItem } from "../FeaturedBlogPostItem"; +import clsx from "clsx"; + +export const FeaturedBlogPostItems = ({ items }) => { + return ( +
+

+ Featured Posts +

+ +
+ {items.map(({ content: BlogPostContent }) => ( + + + + ))} +
+
+ ); +}; diff --git a/src/components/blog/PostPage/index.js b/src/components/blog/PostPage/index.js new file mode 100644 index 0000000000..6161fc1209 --- /dev/null +++ b/src/components/blog/PostPage/index.js @@ -0,0 +1,155 @@ +import React from "react"; +import Link from "@docusaurus/Link"; +import { useBlogPost } from "@docusaurus/theme-common/internal"; +import { blogPostContainerID } from "@docusaurus/utils-common"; +import MDXContent from "@theme/MDXContent"; +import BlogPostItemContainer from "@theme/BlogPostItem/Container"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { + LinkedinShareButton, + RedditShareButton, + TwitterShareButton, + RedditIcon, + LinkedinIcon, +} from "react-share"; +import clsx from "clsx"; + +import { Date } from "@site/src/components/blog/common/date"; +import { ReadingTime } from "@site/src/components/blog/common/reading-time"; + +import DiscordAndGithubBanner from "@site/src/components/blog/discord-and-github-banner" + + +export const BlogPostPageView = ({ children }) => { + const { metadata, isBlogPostPage } = useBlogPost(); + const { + permalink, + title, + date, + formattedDate, + readingTime, + frontMatter, + tags, + description, + authors, + } = metadata; + const author = authors[0]; + + const { + siteConfig: { url }, + } = useDocusaurusContext(); + + return ( + +
+ + ← Back to blog + +
+ Share on + tag.label)} + > + {/* */} + + + + + + + +
+
+
+ {title} +
+
+
+
+
+
+ + {typeof readingTime !== "undefined" && ( + <> + + + + )} +
+
+
+ +
+
+

+ {isBlogPostPage ? ( + title + ) : ( + + {title} + + )} +

+
+ {children} +
+
+
+ ); +}; diff --git a/src/components/blog/PostPaginator/index.js b/src/components/blog/PostPaginator/index.js new file mode 100644 index 0000000000..28af870ba6 --- /dev/null +++ b/src/components/blog/PostPaginator/index.js @@ -0,0 +1,79 @@ +import React from "react"; +import Link from "@docusaurus/Link"; + +import { Date } from "@site/src/components/blog/common/date"; +import clsx from "clsx"; + +export const PostPaginator = ({ posts, title }) => { + if (posts.length < 1) { + return null; + } + + return ( +
+
+

+ {title} +

+
+ {posts.map((post) => ( +
+ + {post.title} + + +

+ {post.description} +

+ +
+ +
+
+ ))} +
+
+
+ ); +}; diff --git a/src/components/blog/Tags/index.js b/src/components/blog/Tags/index.js new file mode 100644 index 0000000000..7e3418a429 --- /dev/null +++ b/src/components/blog/Tags/index.js @@ -0,0 +1,31 @@ +import React from "react"; +import Link from "@docusaurus/Link"; +import { useBlogPost } from "@docusaurus/theme-common/internal"; +import clsx from "clsx"; + +export const Tags = () => { + const { metadata } = useBlogPost(); + + return ( +
+ {metadata.tags.map((tag) => ( + + {tag.label} + + ))} +
+ ); +}; diff --git a/src/components/blog/common/date.js b/src/components/blog/common/date.js new file mode 100644 index 0000000000..0da83f8205 --- /dev/null +++ b/src/components/blog/common/date.js @@ -0,0 +1,9 @@ +import React from "react"; + +export function Date({ date, formattedDate }) { + return ( + + ); +} diff --git a/src/components/blog/common/reading-time.js b/src/components/blog/common/reading-time.js new file mode 100644 index 0000000000..639c021503 --- /dev/null +++ b/src/components/blog/common/reading-time.js @@ -0,0 +1,27 @@ +import React from "react"; +import { usePluralForm } from "@docusaurus/theme-common"; +import { translate } from "@docusaurus/Translate"; + +function useReadingTimePlural() { + const { selectMessage } = usePluralForm(); + return (readingTimeFloat) => { + const readingTime = Math.ceil(readingTimeFloat); + return selectMessage( + readingTime, + translate( + { + id: "theme.blog.post.readingTime.plurals", + description: + 'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)', + message: "One min read|{readingTime} min read", + }, + { readingTime }, + ), + ); + }; +} + +export function ReadingTime({ readingTime }) { + const readingTimePlural = useReadingTimePlural(); + return <>{readingTimePlural(readingTime)}; +} diff --git a/src/components/blog/discord-and-github-banner/index.js b/src/components/blog/discord-and-github-banner/index.js new file mode 100644 index 0000000000..feea75d88e --- /dev/null +++ b/src/components/blog/discord-and-github-banner/index.js @@ -0,0 +1,56 @@ +import React from "react"; +import Link from "@docusaurus/Link"; + +const DiscordAndGithubBanner = () => { + return ( +
+
+
+

+ Start Building apps with ILLA Cloud +

+

+ Build the internal tools you need(Dashboard, Workflow Management, CRM, Support and Billing management...) in minutes. +

+
+
+
+ + + + + + +
+
+ ); +}; + +export default DiscordAndGithubBanner; diff --git a/src/components/common/Banner/Mobile/index.tsx b/src/components/common/Banner/Mobile/index.tsx new file mode 100644 index 0000000000..eb08dd45a3 --- /dev/null +++ b/src/components/common/Banner/Mobile/index.tsx @@ -0,0 +1,60 @@ +import { useTranslation } from 'next-i18next' +import Link from 'next/link' +import Image from 'next/image' +import { sendTagEvent } from '@/utils/gtag' +import { Vector } from '@/img/public/vector' + +const BannerMobile = ({ content, translationName }) => { + const { title, desc, btn1, btn1Link, btn2, btn2Link, mobileImg, imageAlt } = + content + const { t } = useTranslation(translationName) + + return ( +
+
+

+ {t(title)} +

+

+ {t(desc)} +

+
+ + { + sendTagEvent({ + action: 'click_try', + }) + }} + > + {t(btn1)} + + + {btn2 && ( + + { + sendTagEvent({ + action: 'click', + category: 'homepage_body_self_hosted_click', + label: t('self-Hosted'), + }) + }} + > + {t(btn2)} + + + + )} +
+
+
+ {imageAlt} +
+
+ ) +} + +export default BannerMobile diff --git a/src/components/common/Banner/PC/index.module.css b/src/components/common/Banner/PC/index.module.css new file mode 100644 index 0000000000..6e2da511b4 --- /dev/null +++ b/src/components/common/Banner/PC/index.module.css @@ -0,0 +1,9 @@ +.titleContainer { + @apply flex pt-[166px] bg-black text-title grow-0 text-[40px] text-white-01 flex-col items-center font-bold overflow-hidden; +} +.titlePurpleBtn { + @apply h-[48px] w-[400px] bg-tech-purple-01 rounded-[24px] px-[32px] py-[10px] font-normal text-white-01 text-center hover:bg-tech-purple-02 active:bg-tech-purple-n-01; +} +.titleImage { + @apply w-full flex items-center justify-center mt-[56px]; +} diff --git a/src/components/common/Banner/PC/index.tsx b/src/components/common/Banner/PC/index.tsx new file mode 100644 index 0000000000..5c826acda2 --- /dev/null +++ b/src/components/common/Banner/PC/index.tsx @@ -0,0 +1,89 @@ +import { useTranslation } from 'next-i18next' +import Link from 'next/link' +import style from './index.module.css' +import { sendTagEvent } from '@/utils/gtag' +import { Vector } from '@/img/public/vector' +import Image from 'next/image' + +const BannerPC = ({ translationName = 'home', content }) => { + const { t } = useTranslation(translationName) + const { + title, + desc, + btn1, + btn1Link = '', + btn1Category, + btn2, + btn2Link = '', + image, + imageAlt, + btn2Category, + } = content + + return ( + <> + + + ) +} + +export default BannerPC diff --git a/src/components/common/Benefits/index.js b/src/components/common/Benefits/index.js new file mode 100644 index 0000000000..e6c2e0205b --- /dev/null +++ b/src/components/common/Benefits/index.js @@ -0,0 +1,22 @@ +import style from './index.module.css' +import clsx from 'clsx' +import { useTranslation } from 'next-i18next' + +const Benefits = ({ items, translationName }) => { + const { t } = useTranslation(translationName) + return ( +
+ {items.length > 1 && + items.map(({ label, desc }) => ( +
+
+

{t(label)}

+

{t(desc)}

+
+
+ ))} +
+ ) +} + +export default Benefits diff --git a/src/components/common/Benefits/index.module.css b/src/components/common/Benefits/index.module.css new file mode 100644 index 0000000000..74e4cb32f2 --- /dev/null +++ b/src/components/common/Benefits/index.module.css @@ -0,0 +1,11 @@ +.benefitsContent { + @apply flex flex-row justify-between items-start gap-[40px]; +} +.mainLabel { + @apply font-[700] text-[17px] leading-[21px] text-white-01; + @apply xl:text-[32px] xl:leading-[39px]; +} +.mainDesc { + @apply font-[400] text-[12px] leading-[16px] text-white-02; + @apply xl:text-[14px] xl:leading-[22px]; +} diff --git a/src/components/common/CommBottom/index.module.css b/src/components/common/CommBottom/index.module.css new file mode 100644 index 0000000000..c30a3325dc --- /dev/null +++ b/src/components/common/CommBottom/index.module.css @@ -0,0 +1,61 @@ +.commBottomContainer { + @apply flex flex-col justify-center items-center gap-[8px] w-full relative rounded-b-[20px] pt-[60px] pb-[40px] px-[20px]; + @apply xl:rounded-b-[40px] xl:pt-[120px] xl:pb-[80px] xl:px-[120px] xl:h-[410px]; +} +.commBottomBtnBg { + @apply absolute w-full z-[-1] bottom-0 rounded-b-[20px]; +} +.bottomBg { + background: linear-gradient( + 180deg, + rgba(101, 74, 236, 0) 0%, + rgba(101, 74, 236, 0.5) 100% + ); +} +.whiteBottomBg { + background: linear-gradient( + 180deg, + rgba(81, 106, 181, 0) 0%, + rgba(81, 106, 181, 0.08) 100% + ); +} +.commBottomTitle { + @apply font-[700] text-[20px] leading-[24px] text-white-01 text-center; + @apply xl:text-[40px] xl:leading-[48px]; +} +.bottomTitle { + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 0.5) 0%, + #ffffff 50%, + rgba(255, 255, 255, 0.5) 100% + ); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} +.whiteBottomTitle { + background: linear-gradient( + 90deg, + rgba(11, 12, 15, 0.5) 0%, + #0b0c0f 50%, + rgba(11, 12, 15, 0.5) 100% + ); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} +.commBottomDesc { + @apply w-full font-[400] text-[12px] leading-[16px] text-center overflow-ellipsis line-clamp-4; + @apply text-[14px] leading-[22px]; + @apply xl:w-[600px]; +} +.commBottomBtn { + @apply flex flex-row justify-center items-center gap-[10px] font-[500] text-[16px] leading-[28px] rounded-[24px] cursor-pointer px-[32px] py-[10px] w-full; + @apply xl:w-[320px]; +} +.commBottomBtn svg { + width: 16px; +} diff --git a/src/components/common/CommBottom/index.tsx b/src/components/common/CommBottom/index.tsx new file mode 100644 index 0000000000..d33e936d7e --- /dev/null +++ b/src/components/common/CommBottom/index.tsx @@ -0,0 +1,132 @@ +import style from './index.module.css'; +import { useTransform, motion, useScroll } from 'framer-motion'; +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; +import GithubIcon from '@site/static/img/public/github.svg'; +import { useElementFirstShow } from '@site/src/hooks/useElementFirstShow'; +import { useUtmParams } from '@site/src/hooks/useUtmParams'; +import { useRef, useCallback } from 'react'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import Translate from '@docusaurus/Translate'; + +const CommBottom = ({ + scrollStart, + scrollEnd, + uri = '', + whiteTheme = false, +}) => { + const { scrollYProgress } = useScroll(); + const height = useTransform( + scrollYProgress, + [scrollStart, scrollEnd], + [120, 410], + ); + const ref = useRef(null); + const cloudUrl = useUtmParams('https://cloud.illacloud.com'); + + const reportShow = useCallback(() => { + sendTagEvent({ + action: 'click', + category: 'homepage_call_action_show', + }); + }, []); + useElementFirstShow(ref, reportShow); + return ( +
+ +
+
+

+ + Start Building Apps with ILLA Cloud + +

+

+ + Any internal tool you need can be built using ILLA Cloud in 1 + minute. + +

+
+ { + sendTagEvent({ + action: 'click', + category: 'homepage_call_action_try_cloud_click', + }); + sendTagEvent({ + action: 'click_try', + }); + }} + > + + Try Cloud for free + + + { + sendTagEvent({ + action: 'click', + category: 'homepage_call_action_try_cloud_click', + }); + sendTagEvent({ + action: 'click_signin', + }); + }} + > + {whiteTheme ? ( + + ) : ( + + )} + + + sign in with GitHub + + + +
+
+
+ ); +}; + +export default CommBottom; diff --git a/src/components/common/Compare/Mobile/index.js b/src/components/common/Compare/Mobile/index.js new file mode 100644 index 0000000000..cff674e292 --- /dev/null +++ b/src/components/common/Compare/Mobile/index.js @@ -0,0 +1,90 @@ +import style from './index.module.css' +import clsx from 'clsx' +import tableSelect from '@/img/selfHost/tableSelect.svg' +import { useTranslation } from 'next-i18next' +import { useElementFirstShow } from '@/hooks/useElementFirstShow' +import { Fragment, useRef, useCallback } from 'react' +import { sendTagEvent } from '@/utils/gtag' + +const CompareMobile = ({ + compare, + translationScope = 'selfHost', + needReport = true, +}) => { + const { t } = useTranslation(translationScope) + const ref = useRef(null) + const reportShow = useCallback(() => { + needReport && + sendTagEvent({ + action: 'click', + category: 'selfhost_table_try_this_show', + }) + }, [needReport]) + useElementFirstShow(ref, needReport ? reportShow : undefined) + + return ( +
+
+
+ {t(compare.tableHeader[0].label)} +
+ {compare.tableHeader.slice(1).map(({ label }) => ( + +
+
{t(label)}
+ + ))} +
+
+ {compare.items.map(({ label, desc, texts, icons }) => ( +
+
+

{t(label)}

+ {t(desc)} +
+
+ {icons + ? icons.map((icon, index) => ( +
+ {icon && ( + table select + )} +
+ )) + : texts.map((text, index) => ( +
+ + {t(text)} + +
+ ))} +
+
+ ))} +
+
+ ) +} + +export default CompareMobile diff --git a/src/components/common/Compare/Mobile/index.module.css b/src/components/common/Compare/Mobile/index.module.css new file mode 100644 index 0000000000..c51bfff7ad --- /dev/null +++ b/src/components/common/Compare/Mobile/index.module.css @@ -0,0 +1,29 @@ +.mobileCompareContainer { + @apply w-full flex flex-col items-center justify-center gap-[32px]; +} +.mobileTableContentContainer { + @apply flex flex-col items-start border-[1px] border-[#292929] rounded-[8px] w-full; +} +.mobileTableHeader { + @apply w-full flex flex-row items-center justify-center p-[1px] gap-[4px] border-[1px] border-white-08 rounded-[8px]; + background: linear-gradient(180deg, #19111f 0%, #0f101f 100%); + @apply sticky top-0; +} +.mobileTableHeaderItem { + @apply w-1/2 flex flex-row items-center justify-center py-[13px] px-[12px] rounded-[3px] font-[500] text-[16px] leading-[22px] text-white-01; +} +.mobileTableHeaderItem:last-of-type { + filter: drop-shadow(0px 4px 8px rgba(26, 34, 51, 0.04)); +} +.mobileTableItemLabel { + @apply box-border flex flex-col items-start p-[20px] gap-[8px] bg-white/[0.04]; +} +.mobileTableItemLabelTitle { + @apply font-[600] text-[18px] leading-[24px]; +} +.mobileTableItemLabelDesc { + @apply font-[400] text-[14px] leading-[20px] text-white-03; +} +.mobileTableItemSelect { + @apply w-1/2 h-[60px] bg-white/[0.04] border-t-[1px] border-[#292929] box-border flex items-center justify-center; +} diff --git a/src/components/common/Compare/PC/index.js b/src/components/common/Compare/PC/index.js new file mode 100644 index 0000000000..460221f9a8 --- /dev/null +++ b/src/components/common/Compare/PC/index.js @@ -0,0 +1,96 @@ +import style from './index.module.css' +import clsx from 'clsx' +import Link from 'next/link' +import tableHeaderBg from '@/img/selfHost/tableHeaderBg.svg' +import tableSelect from '@/img/selfHost/tableSelect.svg' +import { Fragment } from 'react' +import { useTranslation } from 'next-i18next' +import { useElementFirstShow } from '@/hooks/useElementFirstShow' +import { useRef, useCallback } from 'react' +import { sendTagEvent } from '@/utils/gtag' + +const ComparePC = ({ + compare, + translationScope = 'selfHost', + needReport = true, + colNum = 3, +}) => { + const { t } = useTranslation(translationScope) + const ref = useRef(null) + const reportShow = useCallback(() => { + needReport && + sendTagEvent({ + action: 'click', + category: 'selfhost_table_try_this_show', + }) + }, [needReport]) + useElementFirstShow(ref, reportShow) + return ( +
+ table header + {compare.tableHeader.map(({ label, btnText, link }) => ( +
+

+ {t(label)} +

+ + {t(btnText)} + +
+ ))} + {compare.items.map(({ label, desc, texts, icons }, index) => ( + +
+

{t(label)}

+ + {t(desc)} + +
+ {icons + ? icons.map((val, i) => ( +
+ {val && ( + table select + )} +
+ )) + : texts.map((val, i) => ( +
+ + {t(val)} + +
+ ))} +
+ ))} +
+ ) +} + +export default ComparePC diff --git a/src/components/common/Compare/PC/index.module.css b/src/components/common/Compare/PC/index.module.css new file mode 100644 index 0000000000..84de031677 --- /dev/null +++ b/src/components/common/Compare/PC/index.module.css @@ -0,0 +1,21 @@ +.compareContainer { + @apply grid border-[1px] border-[#292929] bg-[#141414] rounded-[16px] text-white-01 w-full; +} +.tableHeader { + @apply flex flex-col items-center justify-center py-[40px] gap-[24px] bg-[#141414]; +} +.tableHeaderBg { + @apply w-[400px] rounded-l-[16px]; +} +.tableSticky { + @apply sticky top-[80px] z-[1]; +} +.tableBtn { + @apply py-[7px] px-[16px] rounded-[8px] font-[500] text-[16px] leading-[26px] bg-tech-purple-01 hover:bg-tech-purple-02 active:bg-tech-purple-n-01 cursor-pointer; +} +.tableContent { + @apply box-border flex flex-col items-start py-[24px] px-[32px] gap-[8px] min-h-[120px] border-t-[1px] border-[#292929]; +} +.tableSelect { + @apply flex justify-center items-center border-t-[1px] border-[#292929]; +} diff --git a/src/components/common/Compare/index.js b/src/components/common/Compare/index.js new file mode 100644 index 0000000000..0fc3a098a0 --- /dev/null +++ b/src/components/common/Compare/index.js @@ -0,0 +1,14 @@ +import LayoutAutoChange from '@/layout/LayoutAutoChange' +import ComparePC from './PC' +import CompareMobile from './Mobile' + +const Compare = (props) => { + return ( + } + mobile={} + /> + ) +} + +export default Compare diff --git a/src/components/common/Compare/index.module.css b/src/components/common/Compare/index.module.css new file mode 100644 index 0000000000..7a24984ae8 --- /dev/null +++ b/src/components/common/Compare/index.module.css @@ -0,0 +1,50 @@ +.compareContainer { + @apply hidden xl:grid border-[1px] border-[#292929] bg-[#141414] rounded-[16px] text-white-01 w-full; +} +.tableHeader { + @apply flex flex-col items-center justify-center py-[40px] gap-[24px] bg-[#141414]; +} +.tableHeaderBg { + @apply w-[400px] rounded-l-[16px]; +} +.tableSticky { + @apply sticky top-[80px] z-[1]; +} +.tableBtn { + @apply py-[7px] px-[16px] rounded-[8px] font-[500] text-[16px] leading-[26px] bg-tech-purple-01 hover:bg-tech-purple-02 active:bg-tech-purple-n-01 cursor-pointer; +} +.tableContent { + @apply box-border flex flex-col items-start py-[24px] px-[32px] gap-[8px] min-h-[120px] border-t-[1px] border-[#292929]; +} +.tableSelect { + @apply flex justify-center items-center border-t-[1px] border-[#292929]; +} +.mobileCompareContainer { + @apply w-full xl:hidden flex flex-col items-center justify-center gap-[32px]; +} +.mobileTableContentContainer { + @apply flex flex-col items-start border-[1px] border-[#292929] rounded-[8px] w-full; +} +.mobileTableHeader { + @apply w-full flex flex-row items-center justify-center p-[1px] gap-[4px] border-[1px] border-white-08 rounded-[8px]; + background: linear-gradient(180deg, #19111f 0%, #0f101f 100%); + @apply sticky top-0; +} +.mobileTableHeaderItem { + @apply w-1/2 flex flex-row items-center justify-center py-[13px] px-[12px] rounded-[3px] font-[500] text-[16px] leading-[22px] text-white-01; +} +.mobileTableHeaderItem:last-of-type { + filter: drop-shadow(0px 4px 8px rgba(26, 34, 51, 0.04)); +} +.mobileTableItemLabel { + @apply box-border flex flex-col items-start p-[20px] gap-[8px] bg-white/[0.04]; +} +.mobileTableItemLabelTitle { + @apply font-[600] text-[18px] leading-[24px]; +} +.mobileTableItemLabelDesc { + @apply font-[400] text-[14px] leading-[20px] text-white-03; +} +.mobileTableItemSelect { + @apply w-1/2 h-[60px] bg-white/[0.04] border-t-[1px] border-[#292929] box-border flex items-center justify-center; +} diff --git a/src/components/common/Footer/FooterItem/index.js b/src/components/common/Footer/FooterItem/index.js new file mode 100644 index 0000000000..fb9d9f667d --- /dev/null +++ b/src/components/common/Footer/FooterItem/index.js @@ -0,0 +1,77 @@ +import { useTranslation } from 'next-i18next' +import Link from 'next/link' +import { useState } from 'react' +import { sendTagEvent } from '@/utils/gtag' +import style from '../index.module.css' +import clsx from 'clsx' + +export const FooterItems = ({ items, whiteTheme }) => { + const { t } = useTranslation('home') + const [showMore, setShowMore] = useState(false) + + const handleShowMore = () => { + setShowMore(!showMore) + sendTagEvent({ + action: 'click', + category: showMore + ? 'homepage_footer_show_less' + : 'homepage_footer_show_more', + }) + } + + return ( + <> + {items.slice(0, 6).map(({ label, href = '', tagCategory }) => ( + + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: t(label), + value: href, + }) + }} + > + {t(label)} + + + ))} + {showMore && + items.slice(6).map(({ label, href = '', tagCategory }) => ( + + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: t(label), + value: href, + }) + }} + > + {t(label)} + + + ))} + + {showMore ? t('footer.less') : t('footer.more')} + + + ) +} diff --git a/src/components/common/Footer/LanguageSelect/index.js b/src/components/common/Footer/LanguageSelect/index.js new file mode 100644 index 0000000000..3540238532 --- /dev/null +++ b/src/components/common/Footer/LanguageSelect/index.js @@ -0,0 +1,91 @@ +import Link from 'next/link' +import { useRef, useState } from 'react' +import { useRouter } from 'next/router' +import { useClickAway } from 'react-use' +import { SelectIcon, SelectIconBlack } from '@/img/home/svg' +import clsx from 'clsx' +import { sendTagEvent } from '@/utils/gtag' +import { generateLanguageOptions } from '@/constants/language' +import { useTranslation } from 'next-i18next' + +const LanguageSelect = ({ buttonColorChange = true }) => { + const [expandPanel, setExpandPanel] = useState(false) + const { t } = useTranslation('common') + + const ref = useRef(null) + + const router = useRouter() + useClickAway(ref, () => { + setExpandPanel(false) + }) + + return ( +
+
{ + sendTagEvent({ + action: 'click', + category: 'homepage_menu_language_click', + label: t(`language.${router.locale || 'en-US'}`), + }) + setExpandPanel(() => !expandPanel) + }} + > + {t(`language.${router.locale || 'en-US'}`)} + {buttonColorChange ? : } +
+
+ {generateLanguageOptions(t).map((option) => ( + +
{ + sendTagEvent({ + action: 'click', + category: option.tagCategory, + label: option.label, + }) + }} + > + {option.label} +
+ + ))} +
+
+ ) +} + +export default LanguageSelect diff --git a/src/components/common/Footer/index.js b/src/components/common/Footer/index.js new file mode 100644 index 0000000000..d2c34eca29 --- /dev/null +++ b/src/components/common/Footer/index.js @@ -0,0 +1,212 @@ +import style from './index.module.css' +import clsx from 'clsx' +import { useTranslation } from 'next-i18next' +import { footerContent } from '@/constants/concat' +import Link from 'next/link' +import ILLA_LOGO from '@/img/home3/logo.svg' +import WHITE_LOGO from '@/img/home3/whiteLogo.svg' +import LanguageSelect from './LanguageSelect' +import Language from '@/img/home3/language.svg' +import WhiteLanguage from '@/img/home/language.svg' +import { useViewportScroll, useTransform, motion } from 'framer-motion' +import { FooterItems } from './FooterItem' +import { sendTagEvent } from '@/utils/gtag' +import { saveAs } from 'file-saver' +import { useElementFirstShow } from '@/hooks/useElementFirstShow' +import { useRef, useCallback } from 'react' + +const Footer = ({ whiteTheme = false, scrollStart, scrollEnd }) => { + const { t } = useTranslation('home') + const content = t('footer.footerList', { + returnObjects: true, + }) + const ref = useRef(null) + const reportShow = useCallback(() => { + sendTagEvent({ + action: 'click', + category: 'homepage_body_code_anywhere_show', + }) + }, []) + useElementFirstShow(ref, reportShow) + + const mergeFooterContent = [...content, ...footerContent] + const { scrollYProgress } = useViewportScroll() + const translateY = useTransform( + scrollYProgress, + [scrollStart, scrollEnd], + [-150, 0], + ) + + return ( + +
+ {mergeFooterContent.map(({ title, items }) => ( +
+ + {t(title)} + +
+ {items.length > 6 && ( + + )} + {items.length <= 6 && + items.map( + ({ + label, + href = '', + tagCategory, + icon, + downloadName, + blackIcon, + }) => { + if (downloadName) { + return ( + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: t(label), + value: href, + }) + saveAs(href, downloadName) + }} + > + {t(label)} + + ) + } else { + return ( + + {icon ? ( + + {whiteTheme ? blackIcon : icon} + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: t(label), + value: href, + }) + }} + > + {t(label)} + + + ) : ( + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label: t(label), + value: href, + }) + }} + > + {t(label)} + + )} + + ) + } + }, + )} +
+
+ ))} +
+
+
+
+ ILLA_LOGO + + {t('slogan-1')} + +
+
+
+
+ language + +
+ + { + sendTagEvent({ + action: 'click', + category: 'homepage_footer_privacy_policy_click', + label: t('footer.privacy-policy'), + }) + }} + > + {t('footer.privacy-policy')} + + + + { + sendTagEvent({ + action: 'click', + category: 'homepage_footer_terms_of_service_click', + label: t('footer.terms-of-service'), + }) + }} + > + {t('footer.terms-of-service')} + + +
+
+
+ + ) +} + +export default Footer diff --git a/src/components/common/Footer/index.module.css b/src/components/common/Footer/index.module.css new file mode 100644 index 0000000000..e28aabdc1f --- /dev/null +++ b/src/components/common/Footer/index.module.css @@ -0,0 +1,30 @@ +.footerContainer { + @apply w-full flex flex-col justify-center pt-[100px] items-center gap-[20px]; + @apply px-[20px] pb-[20px]; + @apply xl:pb-[40px] xl:px-[120px] xl:gap-[40px] xl:pt-[80px]; + /* transform: translateY(-10%) */ +} +.footerContentContainer { + @apply w-full; + @apply grid grid-cols-2 gap-y-[40px] justify-between xl:grid-cols-5 xl:gap-x-[40px]; + @apply xl:w-[1200px] xl:flex-nowrap; +} + +.space { + @apply w-full h-[1px]; + @apply xl:w-[1200px]; + background-color: rgba(255, 255, 255, 0.1); +} +.footerBottom { + @apply w-full flex flex-col justify-between items-center gap-[24px] font-[400] text-[12px] leading-[16px] text-white-01; + @apply xl:w-[1200px] xl:flex-row xl:gap-[48px] xl:text-[14px] xl:leading-[22px]; +} +.footerItem { + @apply font-[400] text-[12px] leading-[16px] cursor-pointer xl:text-[14px] xl:leading-[22px]; +} + +@media screen and (max-width: 1280px) { + .mobileFooterContainer { + transform: translateY(0) !important; + } +} diff --git a/src/components/common/LottieItem/index.js b/src/components/common/LottieItem/index.js new file mode 100644 index 0000000000..b1cfaab5e3 --- /dev/null +++ b/src/components/common/LottieItem/index.js @@ -0,0 +1,54 @@ +import { useRef, useEffect, useCallback } from 'react' +import lottie from 'lottie-web' + +const LottieItem = ({ json }) => { + const lottieRef = useRef(null) + const animationRef = useRef(null) + const loadAnimation = useCallback(() => { + animationRef.current = lottie.loadAnimation({ + container: lottieRef.current, + animationData: json, + renderer: 'svg', + loop: false, + autoplay: true, + }) + }, [json]) + + useEffect(() => { + let target = lottieRef.current + const observer = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) { + loadAnimation() + } else { + if (animationRef.current) { + animationRef.current.destroy() + animationRef.current = null + } + } + }) + if (target) { + observer.observe(target) + } + return () => { + if (target) { + observer.unobserve(target) + } + if (animationRef.current) { + animationRef.current.destroy() + animationRef.current = null + } + } + }, [loadAnimation]) + + useEffect(() => { + return () => { + if (animationRef.current) { + animationRef.current.destroy() + animationRef.current = null + } + } + }, []) + return
+} + +export default LottieItem diff --git a/src/components/common/Nav/Components/MenuSelect/Mobile/index.js b/src/components/common/Nav/Components/MenuSelect/Mobile/index.js new file mode 100644 index 0000000000..2b0d4f4338 --- /dev/null +++ b/src/components/common/Nav/Components/MenuSelect/Mobile/index.js @@ -0,0 +1,56 @@ +import { SelectIcon } from '@/img/home/svg' +import { useState } from 'react' +import Link from 'next/link' +import { sendTagEvent } from '@/utils/gtag' +import { useTranslation } from 'next-i18next' +import { MobileSelectItemHeight } from '@/constants/defaultVal' + +const MenuSelectMobile = ({ options, closeMenu }) => { + const { t } = useTranslation('home') + const [expend, setExpend] = useState(false) + const { title, values, category } = options + + return ( + <> + { + sendTagEvent({ + action: 'click', + category, + label: t(title), + }) + setExpend(() => !expend) + }} + className="w-full cursor-pointer flex flex-row flex-nowrap items-center h-[40px] gap-[8px]" + > + {t(title)} + + + + ) +} +export default MenuSelectMobile diff --git a/src/components/common/Nav/Components/MenuSelect/PC/index.js b/src/components/common/Nav/Components/MenuSelect/PC/index.js new file mode 100644 index 0000000000..4b97a7c920 --- /dev/null +++ b/src/components/common/Nav/Components/MenuSelect/PC/index.js @@ -0,0 +1,91 @@ +import { useRef, useState } from 'react' +import { useClickAway } from 'react-use' +import { useTranslation } from 'next-i18next' +import { SelectIcon, SelectIconBlack } from '@/img/home/svg' +import clsx from 'clsx' +import { sendTagEvent } from '@/utils/gtag' +import Link from 'next/link' +import { useRouter } from 'next/router' +import { SelectItemHeight } from '@/constants/defaultVal' + +const MenuSelectPC = ({ buttonColorChange = true, options }) => { + const { t } = useTranslation('home') + const [expandPanel, setExpandPanel] = useState(false) + const router = useRouter() + const { title, category, values } = options + const ref = useRef(null) + + useClickAway(ref, () => { + setExpandPanel(false) + }) + + return ( +
+
{ + sendTagEvent({ + action: 'click', + category, + label: t(title), + }) + setExpandPanel(() => !expandPanel) + }} + > + {t(title)} + {buttonColorChange ? : } +
+
+ {values.map((option) => ( + +
{ + sendTagEvent({ + action: 'click', + category: option.category, + label: t(option.title), + value: option.href, + }) + setExpandPanel(() => !expandPanel) + }} + role="link" + > + {t(option.title)} +
+ + ))} +
+
+ ) +} + +export default MenuSelectPC diff --git a/src/components/common/Nav/Components/MenuSelect/index.js b/src/components/common/Nav/Components/MenuSelect/index.js new file mode 100644 index 0000000000..97e19c0973 --- /dev/null +++ b/src/components/common/Nav/Components/MenuSelect/index.js @@ -0,0 +1,14 @@ +import LayoutAutoChange from '@/layout/LayoutAutoChange' +import MenuSelectPC from './PC' +import MenuSelectMobile from './Mobile' + +const MenuSelect = (props) => { + return ( + } + mobile={} + /> + ) +} + +export default MenuSelect diff --git a/src/components/common/Nav/Components/MobileMenu/index.js b/src/components/common/Nav/Components/MobileMenu/index.js new file mode 100644 index 0000000000..0180e37041 --- /dev/null +++ b/src/components/common/Nav/Components/MobileMenu/index.js @@ -0,0 +1,133 @@ +import clsx from 'clsx' +import { CloseWhiteIcon, SelectIcon } from '@/img/home/svg' +import { useEffect, useState } from 'react' +import Link from 'next/link' +import { useRouter } from 'next/router' +import { useTranslation } from 'next-i18next' +import { IllaLogoWhiteIcon } from '@/img/public/illa-logo-white' +import { sendTagEvent } from '@/utils/gtag' +import { generateLanguageOptions } from '@/constants/language' +import { selectItems, menuItems, CONTACT_US_URL } from '@/constants/navContents' +import MenuSelect from '@/components/common/Nav/Components/MenuSelect' + +const Menu = ({ menuExpand, closeMenu, onChangeShow }) => { + const [languageListExpand, setLanguageListExpand] = useState(false) + const { t } = useTranslation('home') + const { t: publicT } = useTranslation('common') + const router = useRouter() + + useEffect(() => { + if (menuExpand) { + document.body.style.overflow = 'hidden' + } else { + document.body.style.overflow = 'visible' + } + }, [menuExpand]) + + return ( +
+
+ + + + + + { + closeMenu && closeMenu() + }} + > + + +
+ {selectItems.map((options, index) => ( + + ))} + {menuItems.map(({ href, category, title }) => ( + + { + sendTagEvent({ + action: 'click', + category, + label: t(title), + }) + }} + > + {t(title)} + + + ))} + { + sendTagEvent({ + action: 'click', + category: 'homepage_menu_contact_click', + label: t('nav.contact'), + }) + closeMenu && closeMenu() + onChangeShow() + }} + className="w-full cursor-pointer flex flex-row flex-nowrap items-center h-[40px] gap-[8px]" + > + {t('nav.contact')} + + + { + sendTagEvent({ + action: 'click', + category: 'homepage_menu_language_mob_click', + label: publicT(`language.${router.locale || 'en-US'}`), + }) + setLanguageListExpand(() => !languageListExpand) + }} + className="w-full flex flex-row cursor-pointer flex-nowrap items-center h-[40px] gap-[8px] " + > + {publicT(`language.${router.locale || 'en-US'}`)} + +
+ {generateLanguageOptions(publicT).map( + ({ value, label, tagCategory }) => ( + + { + sendTagEvent({ + action: 'click', + category: tagCategory, + label, + }) + }} + > + {publicT(`language.${value}`)} + + + ), + )} +
+
+ ) +} + +export default Menu diff --git a/src/components/common/Nav/Mobile/index.js b/src/components/common/Nav/Mobile/index.js new file mode 100644 index 0000000000..ef8c3c6540 --- /dev/null +++ b/src/components/common/Nav/Mobile/index.js @@ -0,0 +1,55 @@ +import { IllaLogoWhiteIcon } from '@/img/public/illa-logo-white' +import Link from 'next/link' +import { IllaLogo } from '@/img/public/illa-logo' +import { CloseIcon, MenuIcon, MenuWhiteIcon } from '@/img/home/svg' +import { useState } from 'react' +import Menu from '@/components/common/Nav/Components/MobileMenu' +import { sendTagEvent } from '@/utils/gtag' + +const NavMobile = (props) => { + const { whiteTheme = false } = props + const [menuExpand, setMenuExpand] = useState(false) + + return ( + <> +
+ + + {whiteTheme ? : } + + + { + sendTagEvent({ + action: 'click', + category: 'homepage_menu_unfold_mob_click', + value: 'unfold', + }) + setMenuExpand(() => !menuExpand) + }} + > + {menuExpand ? ( + + ) : whiteTheme ? ( + + ) : ( + + )} + +
+ { + sendTagEvent({ + action: 'click', + category: 'homepage_menu_fold_mob_click', + value: 'fold', + }) + setMenuExpand(false) + }} + /> + + ) +} + +export default NavMobile diff --git a/src/components/common/Nav/PC/index.js b/src/components/common/Nav/PC/index.js new file mode 100644 index 0000000000..f843cfc687 --- /dev/null +++ b/src/components/common/Nav/PC/index.js @@ -0,0 +1,137 @@ +import { IllaLogoWhiteIcon } from '@/img/public/illa-logo-white' +import Link from 'next/link' +import { useTranslation } from 'next-i18next' +import clsx from 'clsx' +import MenuSelect from '@/components/common/Nav/Components/MenuSelect' +import { IllaLogo } from '@/img/public/illa-logo' +import { sendTagEvent } from '@/utils/gtag' +import { selectItems, menuItems, CONTACT_US_URL } from '@/constants/navContents' +import { useUtmParams } from '@/hooks/useUtmParams' +import style from './index.module.css' +import { useViewportScroll } from 'framer-motion' +import { useState } from 'react' + +const NavPC = (props) => { + const { whiteTheme = false, customStyle } = props + const { t } = useTranslation('home') + const [fixed, setFixed] = useState(false) + + const { scrollYProgress } = useViewportScroll() + + scrollYProgress.onChange((y) => { + if (y > 0.004 && !fixed) { + setFixed(true) + } else if (y < 0.004 && fixed) { + setFixed(false) + } + }) + + const cloudUrl = useUtmParams('https://cloud.illacloud.com') + return ( +
+ {/* logo */} +
+ + + {whiteTheme ? : } + + +
+ {selectItems.map((values, index) => ( + + ))} + {menuItems.map(({ href, category, title }) => ( + + { + sendTagEvent({ + action: 'click', + category, + label: t(title), + }) + }} + role="link" + > + {t(title)} + + + ))} +
+
+ {/* button */} + +
+ ) +} + +export default NavPC diff --git a/src/components/common/Nav/PC/index.module.css b/src/components/common/Nav/PC/index.module.css new file mode 100644 index 0000000000..f5f20ffb06 --- /dev/null +++ b/src/components/common/Nav/PC/index.module.css @@ -0,0 +1,36 @@ +.navContainerStyle { + @apply flex w-full fixed top-0 z-50 bg-transparent px-[40px] py-[16px] flex items-center justify-between text-[16px] leading-[24px] font-[500]; +} + +.navWhiteThemeFixedStyle { + @apply bg-[rgba(255,255,255,0.75)] backdrop-blur-[50px]; +} + +.navBlackThemeFixedStyle { + @apply bg-[rgba(0,0,0,0.75)]; +} + +.menuContainerStyle { + @apply flex items-center w-full justify-center gap-[8px] rounded-[24px] drop-shadow-[0_2px_16px_rgba(0,0,0,0.2)]; +} + +.navButtonContainerStyle { + @apply flex items-center gap-[16px] rounded-[24px] drop-shadow-[0_2px_16px_rgba(0,0,0,0.2)]; +} + +.navBaseButtonStyle { + @apply h-[40px] border-0 rounded-[8px] px-[16px] py-[8px] cursor-pointer flex items-center justify-center; +} + +.navSignUpButtonContainerStyle { + @apply p-[1px] rounded-[20px] overflow-hidden; + background: linear-gradient(90deg, #622bff 0%, #0be2ff 100%); +} +.navSignUpButtonStyle { + @apply h-[38px] bg-black px-[24px] py-[8px] rounded-[20px] cursor-pointer flex items-center justify-center text-white-01; +} + +.navSignUpWhiteStyle { + background: linear-gradient(90deg, #583dff 0%, #0bb6ff 100%); + backdrop-filter: blur(5px); +} diff --git a/src/components/common/Nav/index.js b/src/components/common/Nav/index.js new file mode 100644 index 0000000000..9d5ccae791 --- /dev/null +++ b/src/components/common/Nav/index.js @@ -0,0 +1,14 @@ +import LayoutAutoChange from '@/layout/LayoutAutoChange' +import NavPC from './PC' +import NavMobile from './Mobile' + +const Nav = (props) => { + return ( + } + mobile={} + /> + ) +} + +export default Nav diff --git a/src/components/common/Partner/PartnerLine/index.js b/src/components/common/Partner/PartnerLine/index.js new file mode 100644 index 0000000000..5156164280 --- /dev/null +++ b/src/components/common/Partner/PartnerLine/index.js @@ -0,0 +1,43 @@ +import { motion } from 'framer-motion' +import partnerLine from '@/img/home3/partnerLine.svg' + +const PartnerLine = ({ width }) => ( + <> + {width !== undefined ? ( + + + + + + + + + + ) : ( + + )} + +) + +export default PartnerLine diff --git a/src/components/common/Partner/index.js b/src/components/common/Partner/index.js new file mode 100644 index 0000000000..2014dfa72c --- /dev/null +++ b/src/components/common/Partner/index.js @@ -0,0 +1,77 @@ +import style from './index.module.css' +import Link from 'next/link' +import { useTranslation } from 'next-i18next' +import { sendTagEvent } from '@/utils/gtag' +import PartnerLine from './PartnerLine' +import { useViewportScroll, useTransform } from 'framer-motion' +import { Vector } from '@/img/public/vector' + +const Partner = ({ onChangeShow }) => { + const { t } = useTranslation('home') + const { scrollYProgress } = useViewportScroll() + const width = useTransform(scrollYProgress, [0.836, 0.865], [-75, 0]) + const content = t('partner-new.partnerList', { + returnObjects: true, + }) + if (Array.isArray(content)) { + content.sort(({ sort: a }, { sort: b }) => a - b) + } + + return ( +
+

+ {t('partner-new.title')} +

+ {Array.isArray(content) && content.length > 0 && ( +
+ {content.map(({ name, logo, link = '', tagCategory }) => ( + +
{ + sendTagEvent({ + action: 'click', + category: tagCategory, + value: link, + }) + }} + > +
+
+ {name} +
+ + {name} + +
+
+ + ))} +
+ )} +
+ { + sendTagEvent({ + action: 'click', + category: 'homepage_partner_apply_click', + }) + onChangeShow && onChangeShow() + }} + > + {t('becomePartner')} + + +
+ +
+
+ +
+
+
+ ) +} + +export default Partner diff --git a/src/components/common/Partner/index.module.css b/src/components/common/Partner/index.module.css new file mode 100644 index 0000000000..505aca6402 --- /dev/null +++ b/src/components/common/Partner/index.module.css @@ -0,0 +1,41 @@ +.partnerList { + @apply w-full flex flex-row items-start gap-[8px] overflow-x-scroll mt-[-10px] py-[10px]; + @apply xl:gap-[16px]; + scrollbar-width: none; + -ms-overflow-style: none; +} +.partnerList::-webkit-scrollbar { + @apply hidden; +} +.partnerItemContainer { + @apply flex flex-col items-center justify-center xl:w-[280px] w-[124px] rounded-[8px] py-[24px] shrink-0 cursor-pointer; + @apply xl:rounded-[16px] xl:py-[48px]; + background: url('/img/partnerBg.svg') no-repeat; + background-size: 100% auto; + transition: all 0.2s; + will-change: transform; +} +.partnerItemContainer:first-of-type { + @apply ml-[40px] xl:ml-[120px]; +} +.partnerItemContainer:last-of-type { + @apply mr-[40px] xl:mr-[120px]; +} +.partnerItemContainer:hover { + opacity: 0.8; + transform: scale(1.05); +} +.partnerItem { + @apply flex flex-col items-center gap-[32px] w-full h-full; +} +.partnerline { + animation: progress 3s linear forwards; +} +@keyframes progress { + 0% { + stroke-dashoffset: 75; + } + 100% { + stroke-dashoffset: 0; + } +} diff --git a/src/components/common/Player/index.js b/src/components/common/Player/index.js new file mode 100644 index 0000000000..58bc57ea72 --- /dev/null +++ b/src/components/common/Player/index.js @@ -0,0 +1,45 @@ +import clsx from 'clsx' +import { CloseWhiteIcon } from '@/img/home/svg' +import { forwardRef } from 'react' +import * as ReactDOM from 'react-dom' + +const Player = forwardRef(({ menuExpand, closeMenu, link }, ref) => { + return ( +
+
+ { + closeMenu && closeMenu() + }} + > + + + +
+
+ ) +}) + +export const Modal = ({ isOpen, onClose, link }) => { + if (!isOpen) return null + return ReactDOM.createPortal( +
+ +
, + document.body, + ) +} diff --git a/src/components/common/ProductContentTitle/index.js b/src/components/common/ProductContentTitle/index.js new file mode 100644 index 0000000000..4c2624757f --- /dev/null +++ b/src/components/common/ProductContentTitle/index.js @@ -0,0 +1,7 @@ +import style from './index.module.css' + +const ProductContentTitle = ({ title }) => { + return

{title}

+} + +export default ProductContentTitle diff --git a/src/components/common/ProductContentTitle/index.module.css b/src/components/common/ProductContentTitle/index.module.css new file mode 100644 index 0000000000..d48d706046 --- /dev/null +++ b/src/components/common/ProductContentTitle/index.module.css @@ -0,0 +1,9 @@ +.mainContentTitle { + @apply font-[700] text-[24px] leading-[26px] text-white-01 text-center; + @apply xl:text-[48px] xl:leading-[58px]; + background: linear-gradient(90deg, #a874ff 8.9%, #e65fff 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} diff --git a/src/components/common/Publicize/index.module.css b/src/components/common/Publicize/index.module.css new file mode 100644 index 0000000000..019ee578a9 --- /dev/null +++ b/src/components/common/Publicize/index.module.css @@ -0,0 +1,22 @@ +.publicize { + @apply hidden xl:block bg-white/[0.04] rounded-[20px] cursor-pointer mx-auto; + @apply text-white min-w-[400px] h-[40px] overflow-hidden px-[25px]; + @apply text-[14px] leading-[22px] font-[400] relative; + @apply border-[1px] border-solid border-white/[0.12]; + backdrop-filter: blur(5px); +} +.publicizeStyle { + @apply object-none object-center w-[402px] h-[124px] absolute top-[50%] left-[50%] z-[0] opacity-[0.16]; + @apply xl:w-[579px] xl:h-[179px] flex flex-row items-center justify-between; + filter: blur(23px); + transform: translate(-50%, -50%); + background: linear-gradient( + 90deg, + #ea984c 0%, + #5c9ac6 45.31%, + #687100 91.49% + ); +} +.publicIntru { + @apply flex items-center gap-[11px]; +} diff --git a/src/components/common/Publicize/index.tsx b/src/components/common/Publicize/index.tsx new file mode 100644 index 0000000000..d8c5e381d6 --- /dev/null +++ b/src/components/common/Publicize/index.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import style from './index.module.css'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import Link from '@docusaurus/Link'; +import GithubIcon from '@site/static/img/public/github.svg'; +import Translate from '@docusaurus/Translate'; + +export const DefaultStars = 6500; + +const Publicize = ({ stars }) => { + return ( + +
{ + sendTagEvent({ + action: 'click', + category: 'homepage_body_github_banner_click', + label: 'github_banner', + }); + }} + > + + + + + + + + + Github + + + {stars || DefaultStars} + + + Stars + + + + + + Star us 👉 + + +
+ + ); +}; + +export default Publicize; diff --git a/src/components/common/Template/index.js b/src/components/common/Template/index.js new file mode 100644 index 0000000000..3b20bfb9ea --- /dev/null +++ b/src/components/common/Template/index.js @@ -0,0 +1,54 @@ +import { useTranslation } from 'next-i18next' +import style from './index.module.css' +import ProductContentTitle from '@/components/common/ProductContentTitle' +import { LearnMore } from '@/components/LandingPage/LearnMore' +import { sendTagEvent } from '@/utils/gtag' + +const Template = () => { + const { t } = useTranslation('landingPageDetails') + const templateContent = t('second-page.classify', { returnObjects: true })[1] + const { label, itemList } = templateContent + const onClick = (target) => { + sendTagEvent({ + action: 'click', + category: `learn_more_${target}_show`, + }) + } + return ( +
+ +
+ {itemList.length > 0 && + itemList.map( + ( + { itemImage, itemName, itemDesc, itemLink, btnText, target }, + index, + ) => ( +
+ +
+

+ {itemName} +

+

+ {itemDesc} +

+ onClick(target)} + showReport={index === 0 ? 'learn_more_show' : undefined} + /> +
+
+ ), + )} +
+
+ ) +} + +export default Template diff --git a/src/components/common/Template/index.module.css b/src/components/common/Template/index.module.css new file mode 100644 index 0000000000..49658b5a9a --- /dev/null +++ b/src/components/common/Template/index.module.css @@ -0,0 +1,14 @@ +.mainContent { + @apply w-full flex flex-col justify-center items-center gap-[32px]; + @apply xl:gap-[64px]; +} + +.templateContent { + @apply xl:flex flex-row items-start xl:gap-[48px] grid grid-cols-2 gap-x-[12px] gap-y-[32px] w-full; + grid-auto-rows: max-content; +} +@media screen and (min-width: 1536px) { + .mobileFooterContainer { + transform: translateY(0) !important; + } +} diff --git a/src/components/home/Banner/Mobile/index.module.css b/src/components/home/Banner/Mobile/index.module.css new file mode 100644 index 0000000000..ea73cd1a8d --- /dev/null +++ b/src/components/home/Banner/Mobile/index.module.css @@ -0,0 +1,20 @@ +.bannerContainer { + @apply w-full px-[20px] h-full flex flex-col items-center justify-center gap-[24px] relative overflow-hidden landing-md:hidden; +} + +.sloganStyle { + @apply text-white-01 text-[36px] text-center font-[700] leading-[40px] mt-[64px]; +} + +.descStyle { + @apply text-white-01 text-[14px] text-center leading-[17px]; +} + +.tryBtnStyle { + @apply w-full bg-tech-purple-01 py-[12px] px-[16px] rounded-[24px] text-white-01 text-[16px] font-normal text-center; +} + +.bgStyle { + @apply absolute top-[20px] z-[-1] h-[300px] object-right object-cover; + transform: scale(1.5); +} diff --git a/src/components/home/Banner/Mobile/index.tsx b/src/components/home/Banner/Mobile/index.tsx new file mode 100644 index 0000000000..92078e01c9 --- /dev/null +++ b/src/components/home/Banner/Mobile/index.tsx @@ -0,0 +1,124 @@ +import Link from '@docusaurus/Link'; +import { FC, useEffect, useState } from 'react'; +import LinearGithubIcon from '@site/static/img/public/linearGithub.svg'; +import LinearDiscordIcon from '@site/static/img/public/linearDiscord.svg'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import { useUtmParams } from '@site/src/hooks/useUtmParams'; +import style from './index.module.css'; +import BannerBg from '@site/static/img/home3/bannerBg.svg'; +import Translate, { translate } from '@docusaurus/Translate'; +import { IBannerPCProps } from '../interface'; + +const BannerMobile: FC = (props) => { + const [menuExpand] = useState(false); + const { setPlayMaskShow, githubStarts } = props; + const cloudUrl = useUtmParams('https://cloud.illacloud.com'); + + useEffect(() => { + document.body.style.overflow = menuExpand ? 'hidden' : 'auto'; + }, [menuExpand]); + + return ( +
+ +

+ Build AI Driven Business App +

+ + + Empower your team with AI Agent and advanced low-code tools to create + business apps + + + + { + sendTagEvent({ + action: 'click_try', + }); + sendTagEvent({ + action: 'click', + category: 'homepage_body_try_cloud_free_click', + label: translate({ + id: 'illa-Cloud', + message: 'Get start', + }), + value: 'https://cloud.illacloud.com/', + }); + }} + > + Get start + + +
+ { + sendTagEvent({ + action: 'click', + category: 'homepage_body_github_mob_click', + label: `${githubStarts} ${translate({ + id: 'starts', + message: 'Starts', + })}`, + value: 'https://github.com/illacloud/illa-builder', + }); + }} + > + +
+ + {`${(githubStarts / 1000).toFixed(1)}k`}{' '} + Starts + +
+ + { + sendTagEvent({ + action: 'click', + category: 'homepage_body_discord_mob_click', + label: translate({ + id: 'join-community', + message: 'Join Discord', + }), + value: 'https://discord.com/invite/illacloud', + }); + }} + > + +
+ + Join Discord + +
+ +
+
{ + sendTagEvent({ + action: 'click', + category: 'homepage_body_video_click', + }); + setPlayMaskShow && setPlayMaskShow(true); + }} + > + Screenshot of ILLA Cloud app editor +
+
+ ); +}; + +export default BannerMobile; diff --git a/src/components/home/Banner/PC/index.module.css b/src/components/home/Banner/PC/index.module.css new file mode 100644 index 0000000000..5520b77650 --- /dev/null +++ b/src/components/home/Banner/PC/index.module.css @@ -0,0 +1,35 @@ +.bannerContainerStyle { + @apply landing-md:flex pt-[80px] text-title grow-0 text-[40px] text-white-01 flex-col items-center font-bold relative hidden; +} + +.canvasContainerStyle { + @apply w-full h-screen overflow-hidden absolute z-[-1]; +} + +.bgStyle { + @apply absolute top-[0px] z-[0] w-full max-h-[382px] object-top object-none; +} + +.bannerContentContainer { + @apply w-full flex justify-center pt-[24px] flex-col items-center gap-[186px]; +} + +.bannerTextContainerStyle { + @apply relative z-[2] w-full max-w-[1200px] flex justify-center flex-col items-center gap-[24px]; +} + +.sloganStyle { + @apply max-w-[1200px] text-center text-[56px] leading-[88px] font-[800]; +} + +.descStyle { + @apply max-w-[800px] font-normal text-[14px] leading-[22px] px-[20px] sm:px-0 text-center; +} + +.buttonContainerStyle { + @apply flex items-center flex-col content-between gap-[24px] text-[16px] leading-[28px] font-[500]; +} + +.bannerImageStyle { + @apply w-full flex items-center justify-center pt-[64px]; +} diff --git a/src/components/home/Banner/PC/index.tsx b/src/components/home/Banner/PC/index.tsx new file mode 100644 index 0000000000..758c016f0c --- /dev/null +++ b/src/components/home/Banner/PC/index.tsx @@ -0,0 +1,102 @@ +import { FC, useRef, useState } from 'react'; +import Link from '@docusaurus/Link'; +import { useMotionValueEvent, useScroll } from 'framer-motion'; +import Publicize from '@site/src/components/common/Publicize'; +import { useUtmParams } from '@site/src/hooks/useUtmParams'; +import clsx from 'clsx'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import { usePaintBg } from '../hooks/usePaintBg'; +import style from './index.module.css'; +import Translate, { translate } from '@docusaurus/Translate'; +import { IBannerPCProps } from '../interface'; +// import bannerBg from '@site/static/img/home3/bannerBg.mp4'; + +const BannerPC: FC = (props) => { + const { setPlayMaskShow, githubStarts } = props; + + const [canClick, setCanClcik] = useState(true); + const cloudUrl = useUtmParams('https://cloud.illacloud.com'); + const canvasRef = useRef(null); + const containerRef = useRef(null); + usePaintBg(canvasRef, containerRef); + + const { scrollYProgress } = useScroll(); + + useMotionValueEvent(scrollYProgress, 'change', (leatest) => { + if (leatest >= 0.038) { + setCanClcik(false); + } else { + setCanClcik(true); + } + }); + + return ( +
+
+ +
+ {/* */} + + +
+ Screenshot of ILLA Cloud app editor { + sendTagEvent({ + action: 'click', + category: 'homepage_body_video_click', + }); + setPlayMaskShow && setPlayMaskShow(true); + }} + /> +
+
+ ); +}; +export default BannerPC; diff --git a/src/components/home/Banner/hooks/useGithubStars.ts b/src/components/home/Banner/hooks/useGithubStars.ts new file mode 100644 index 0000000000..959626c4c8 --- /dev/null +++ b/src/components/home/Banner/hooks/useGithubStars.ts @@ -0,0 +1,35 @@ +import { useCallback, useEffect, useState } from 'react'; +import { DefaultStars } from '../../../common/Publicize'; + +export const useGetGithubStars = (): [boolean, number] => { + const [isLoading, setIsLoading] = useState(true); + + const [stars, setStars] = useState(DefaultStars); + + const getStars = useCallback(async (signal: AbortSignal) => { + try { + const res = await fetch( + 'https://api.github.com/repos/illacloud/illa-builder', + { signal }, + ); + const resJSON = await res.json(); + return resJSON?.stargazers_count || DefaultStars; + } catch { + return DefaultStars; + } + }, []); + + useEffect(() => { + const abortController = new AbortController(); + setIsLoading(true); + getStars(abortController.signal).then((stars) => { + setStars(stars); + setIsLoading(false); + }); + return () => { + abortController.abort(); + }; + }, []); + + return [isLoading, stars]; +}; diff --git a/src/components/home/Banner/hooks/usePaintBg.js b/src/components/home/Banner/hooks/usePaintBg.js new file mode 100644 index 0000000000..93d4c601c4 --- /dev/null +++ b/src/components/home/Banner/hooks/usePaintBg.js @@ -0,0 +1,58 @@ +import { useCallback, useEffect, useRef } from 'react' + +export const usePaintBg = (canvasRef, containerRef) => { + const requestId = useRef(null) + const init = useCallback(() => { + const canvas = canvasRef.current + const ctx = canvas.getContext('2d') + const interval = 56 + + canvas.width = window.innerWidth + canvas.height = window.innerHeight + + const drawGrid = () => { + ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)' + + for (let y = 0; y <= canvas.height; y += interval) { + ctx.beginPath() + ctx.moveTo(0, y) + ctx.lineTo(canvas.width, y) + ctx.stroke() + } + + for (let x = 0; x <= canvas.width; x += interval) { + ctx.beginPath() + ctx.moveTo(x, 0) + ctx.lineTo(x, canvas.height) + ctx.stroke() + } + } + + const animate = () => { + ctx.clearRect(0, 0, canvas.width, canvas.height) + drawGrid() + } + requestId.current = animate() + }, [canvasRef]) + + useEffect(() => { + const item = containerRef.current + const observer = new ResizeObserver(() => { + requestId.current && cancelAnimationFrame(requestId.current) + init() + }) + observer.observe(item) + init() + return () => { + if (observer) { + observer.unobserve(item) + } + } + }, [containerRef, init]) + + useEffect(() => { + return () => { + requestId.current && cancelAnimationFrame(requestId.current) + } + }, []) +} diff --git a/src/components/home/Banner/interface.ts b/src/components/home/Banner/interface.ts new file mode 100644 index 0000000000..29de7efdf0 --- /dev/null +++ b/src/components/home/Banner/interface.ts @@ -0,0 +1,4 @@ +export interface IBannerPCProps { + setPlayMaskShow: (show: boolean) => void; + githubStarts: number; +} diff --git a/src/components/home/Content/AllContent/index.module.css b/src/components/home/Content/AllContent/index.module.css new file mode 100644 index 0000000000..7660cb0a00 --- /dev/null +++ b/src/components/home/Content/AllContent/index.module.css @@ -0,0 +1,8 @@ +.allContentContainer { + @apply flex flex-col justify-center gap-[32px] items-center w-full text-center; + @apply xl:gap-[64px]; +} +.allContentTitle { + @apply font-[700] text-[20px] leading-[24px] text-center; + @apply xl:text-[40px] xl:leading-[48px]; +} diff --git a/src/components/home/Content/AllContent/index.tsx b/src/components/home/Content/AllContent/index.tsx new file mode 100644 index 0000000000..148a4a020b --- /dev/null +++ b/src/components/home/Content/AllContent/index.tsx @@ -0,0 +1,18 @@ +import style from './index.module.css'; +import Translate from '@docusaurus/Translate'; +const AllContent = () => { + return ( +
+

+ + ILLA Cloud integrates everything + +

+
+ {/* Todo: src 需要看一下 */} + +
+
+ ); +}; +export default AllContent; diff --git a/src/components/home/Content/CardContent/CardContentItem/index.module.css b/src/components/home/Content/CardContent/CardContentItem/index.module.css new file mode 100644 index 0000000000..1a394123f9 --- /dev/null +++ b/src/components/home/Content/CardContent/CardContentItem/index.module.css @@ -0,0 +1,27 @@ +.borderStyle { + @apply p-[1px] rounded-[8px]; + @apply xl:rounded-[16px]; + background: linear-gradient(0deg, #000 0%, #242424 100%); +} +.cardIContentItemContainerStyle { + @apply flex p-[16px] items-start gap-[20px] bg-[#141414] rounded-[8px]; + @apply xl:p-[40px] xl:rounded-[16px] xl:gap-[40px]; +} + +.imgStyle { + @apply w-full xl:w-[528px] xl:flex-none; +} +.textContainerStyle { + @apply flex flex-col items-start gap-[16px] xl:gap-[32px]; +} +.textTitleStye { + @apply text-white-01 font-[700] leading-[22px] text-[18px] xl:text-[36px] xl:leading-[44px]; +} + +.textTitleNumStyle { + @apply font-[400] text-[20px] xl:text-[40px] font-eurostile; +} + +.textDescStyle { + @apply text-white-02 font-[400] text-[12px] xl:text-[14px] leading-[16px] xl:leading-[22px]; +} diff --git a/src/components/home/Content/CardContent/CardContentItem/index.tsx b/src/components/home/Content/CardContent/CardContentItem/index.tsx new file mode 100644 index 0000000000..f535e949f9 --- /dev/null +++ b/src/components/home/Content/CardContent/CardContentItem/index.tsx @@ -0,0 +1,39 @@ +import style from './index.module.css'; +import LearnMore from '../../LearnMore'; +import clsx from 'clsx'; +import { useUtmParams } from '@site/src/hooks/useUtmParams'; + +const CardContentItem = ({ + imageSrc, + stepNum, + title, + desc, + moreTitle, + moreHref, + reverse, +}) => { + const utmUrl = useUtmParams(moreHref); + + return ( +
+
+ +
+

+ {stepNum}. +
+ {title} +

+ {desc} + +
+
+
+ ); +}; +export default CardContentItem; diff --git a/src/components/home/Content/CardContent/index.module.css b/src/components/home/Content/CardContent/index.module.css new file mode 100644 index 0000000000..d771266438 --- /dev/null +++ b/src/components/home/Content/CardContent/index.module.css @@ -0,0 +1,22 @@ +.cardContentContainerStyle { + @apply w-full flex flex-col gap-[20px] items-center; + @apply xl:gap-[64px]; +} + +.headerContainerStyle { + @apply flex flex-col items-center gap-[16px]; +} +.textTitleStye { + @apply text-white-01 font-[700] text-[20px]; + @apply xl:text-[40px]; +} + +.textTitleNumStyle { + @apply font-[400] text-[24px] font-eurostile; + @apply xl:text-[48px]; +} + +.textDescStyle { + @apply max-w-full font-[400] text-[12px] leading-[16px] text-center; + @apply xl:text-[14px] xl:leading-[22px] xl:max-w-[488px]; +} diff --git a/src/components/home/Content/CardContent/index.tsx b/src/components/home/Content/CardContent/index.tsx new file mode 100644 index 0000000000..ac47a1ede9 --- /dev/null +++ b/src/components/home/Content/CardContent/index.tsx @@ -0,0 +1,115 @@ +import style from './index.module.css'; +import CardContentItem from './CardContentItem'; +import Translate, { translate } from '@docusaurus/Translate'; + +const CARD_CONTENT = { + title: translate({ + id: 'how_to_use.title.3_steps_to_customize', + message: 'steps to customize your AI tools', + }), + desc: translate({ + id: 'how_to_use.description.build_tools_through', + message: + 'Build tools through drag-and-drop components, customize your AI Agent, connect to your data sources, and make AI a smart tool tailored to your needs and data, making your work more intelligent.', + }), + items: [ + { + imageSrc: 'https://cdn.illacloud.com/official-website/img/home/step1.svg', + mobileImageSrc: + 'https://cdn.illacloud.com/official-website/img/mobile/homepage/step1.png', + title: translate({ + id: 'how_to_use.step1_title.create_ai_agent_for', + message: 'Create AI Agent for a specific purpose', + }), + desc: translate({ + id: 'how_to_use.step1_description.you_can_create_an_ai', + message: + 'You can create an AI Agent for a specific purpose and make it more helpful at specific tasks, at work, or in your daily life. ', + }), + moreTitle: translate({ + id: 'how_to_use.step1_button.ai_agent_marketplace', + message: 'AI Agent Marketplace', + }), + moreHref: 'https://illa.ai', + }, + { + imageSrc: 'https://cdn.illacloud.com/official-website/img/home/step2.svg', + mobileImageSrc: + 'https://cdn.illacloud.com/official-website/img/mobile/homepage/step2.png', + title: translate({ + id: 'how_to_use.step2_title.build_the_frontend_p', + message: 'Build the frontend page in a few minutes', + }), + desc: translate({ + id: 'how_to_use.step2_description.by_dragging_and_drop', + message: + 'By dragging and dropping components, you can quickly build the interface of the tool and implement any functionality you desire.', + }), + moreTitle: translate({ + id: 'how_to_use.step2_button.illa_app_marketplace', + message: 'ILLA App Marketplace', + }), + moreHref: 'https://illa.ai/app', + reverse: true, + }, + { + imageSrc: 'https://cdn.illacloud.com/official-website/img/home/step3.svg', + mobileImageSrc: + 'https://cdn.illacloud.com/official-website/img/mobile/homepage/step3.png', + title: translate({ + id: 'how_to_use.step3_title.connect_to_your_data', + message: 'Connect to your data sources and AI Agents', + }), + desc: translate({ + id: 'how_to_use.step3_description.enable_data_integrat', + message: + 'Enable data integration and automation. AI Agent will perform specific tasks based on your requirements and data.', + }), + moreTitle: translate({ + id: 'how_to_use.step3_button.supported_data_sourc', + message: 'Supported data sources', + }), + moreHref: 'https://www.illacloud.com/integrations', + }, + ], +}; + +const CardContent = () => { + return ( +
+
+

+ + {CARD_CONTENT.title} +

+ {CARD_CONTENT.desc} +
+ {CARD_CONTENT.items.map( + ( + { + imageSrc, + mobileImageSrc, + title, + desc, + moreHref, + moreTitle, + reverse, + }, + i, + ) => ( + + ), + )} +
+ ); +}; +export default CardContent; diff --git a/src/components/home/Content/Comments/index.module.css b/src/components/home/Content/Comments/index.module.css new file mode 100644 index 0000000000..e03546d61a --- /dev/null +++ b/src/components/home/Content/Comments/index.module.css @@ -0,0 +1,54 @@ +.commentsContainerStyle { + @apply flex flex-col items-center gap-[24px]; + @apply xl:gap-[48px]; +} + +.commentsTitleStyle { + @apply text-center text-[20px] font-[700] leading-[28px]; + @apply xl:text-[40px] xl:leading-[56px]; +} + +.commentsItemsContainerStyle { + @apply w-full columns-2 gap-[8px]; + @apply xl:columns-3 xl:gap-[16px]; +} + +.borderStyle { + @apply w-full p-[1px] rounded-[8px] break-inside-avoid; + background: linear-gradient(0deg, #000 0%, #242424 100%); +} + +.commentsItemStyle { + @apply flex p-[24px] flex-col gap-[8px] bg-[#141414] rounded-[8px]; +} + +.commentContentStyle { + @apply flex flex-col gap-[8px] items-start; +} + +.contentTextStyle { + @apply text-white-03 text-[12px] font-[500] leading-[16px]; +} + +.reverseQuoteStyle { + @apply self-end; + transform: rotate(180deg); +} + +.userInfoContainerStyle img { + @apply flex-none w-[20px] h-[20px] xl:w-[32px] xl:h-[32px] rounded-[50%]; +} + +.commentUserNameStyle { + @apply text-white-01 text-[12px] font-[500] leading-[20px]; +} + +.commentUserCompanyStyle { + @apply text-white-03 text-[10px] font-[400] leading-[16px]; +} + +.mobileGap::after { + display: block; + content: ''; + padding-bottom: 8px; +} diff --git a/src/components/home/Content/Comments/index.tsx b/src/components/home/Content/Comments/index.tsx new file mode 100644 index 0000000000..cc5c5c97f7 --- /dev/null +++ b/src/components/home/Content/Comments/index.tsx @@ -0,0 +1,135 @@ +import style from './index.module.css'; +import QuoteIcon from '@site/static/img/home3/quote.svg'; +import clsx from 'clsx'; +import { translate } from '@docusaurus/Translate'; + +const COMMENT_CONTENT = { + title: translate({ + id: 'testimonial.title.user_testimonials', + message: 'User Testimonials', + }), + items: [ + { + content: translate({ + id: 'testimonial.testimonial1_content.illa_cloud_has_been', + message: + 'ILLA Cloud has been a game-changer for me. It helps me generate highly efficient content in less time. The customized AI Agent and App perfectly cater to my business needs.', + }), + userName: translate({ + id: 'testimonial.testimonial1_username.christopher', + message: 'Christopher', + }), + company: translate({ + id: 'testimonial.testimonial1_usertitle.seo_specialist', + message: 'SEO Specialist', + }), + }, + { + content: translate({ + id: 'testimonial.testimonial2_content.i_think_i_become_a_b', + message: + "I think I become a BlogMaster now! This tool has revolutionized my content generation process, saving me valuable time. Whether it's generating blog ideas or structuring articles, the AI Agents have been a tremendous asset to me and my team.", + }), + userName: translate({ + id: 'testimonial.testimonial2_username.lucas', + message: 'Lucas', + }), + company: translate({ + id: 'testimonial.testimonial2_usertitle.content_strategist', + message: 'Content Strategist', + }), + }, + { + content: translate({ + id: 'testimonial.testimonial3_content.it_empowers_me_to_pr', + message: + "It empowers me to provide exceptional customer support with minimal effort. The pre-built AI Agent and App, along with the ability to customize them for our specific needs, have significantly enhanced our team's effectiveness.", + }), + userName: translate({ + id: 'testimonial.testimonial3_username.harper', + message: 'Harper', + }), + company: translate({ + id: 'testimonial.testimonial3_usertitle.customer_service_man', + message: 'Customer Service Manager', + }), + }, + { + content: translate({ + id: 'testimonial.testimonial4_content.ai_agent_low_code', + message: + 'AI Agent & low-code has transformed my email writing process. It streamlines the creation of impactful emails, enabling me to craft engaging and persuasive messages effortlessly. ILLA Cloud has elevated our email communication to new heights.', + }), + userName: translate({ + id: 'testimonial.testimonial4_username.abigail', + message: 'Abigail', + }), + company: translate({ + id: 'testimonial.testimonial4_usertitle.communication_specia', + message: 'Communication Specialist', + }), + }, + { + content: translate({ + id: 'testimonial.testimonial5_content.i_need_to_oversee_va', + message: + 'I need to oversee various aspects of my company. ILLA Cloud provides me with a comprehensive solution. It not only saves me time and effort in development and design but also allows me to manage and monitor my business better. ', + }), + userName: translate({ + id: 'testimonial.testimonial5_username.matthew', + message: 'Matthew', + }), + company: translate({ + id: 'testimonial.testimonial5_usertitle.business_founder', + message: 'Business Founder', + }), + }, + { + content: translate({ + id: 'testimonial.testimonial6_content.using_illa_cloud_to', + message: + 'Using ILLA Cloud to build a management dashboard has been incredibly easy. After just one day of work, we were able to accomplish tasks such as monitoring project progress and allocating resources within this dashboard.', + }), + userName: translate({ + id: 'testimonial.testimonial6_username.samuel', + message: 'Samuel', + }), + company: translate({ + id: 'testimonial.testimonial6_usertitle.website_administrato', + message: 'Website Administrator', + }), + }, + ], +}; + +const Comments = () => { + return ( +
+

{COMMENT_CONTENT.title}

+
+ {COMMENT_CONTENT.items.map(({ content, userName, company }, index) => ( +
+
+
+ + {content} + +
+ + {userName} + {company} + +
+
+ ))} +
+
+ ); +}; +export default Comments; diff --git a/src/components/home/Content/LearnMore/index.module.css b/src/components/home/Content/LearnMore/index.module.css new file mode 100644 index 0000000000..1e51702187 --- /dev/null +++ b/src/components/home/Content/LearnMore/index.module.css @@ -0,0 +1,7 @@ +.swipeMore { + height: auto; + grid-row: 3; + grid-column: 1; + @apply flex flex-row items-center gap-[8px] font-[500] text-[14px] leading-[17px] text-[#6E52FF] cursor-pointer; + @apply xl:text-[16px] xl:leading-[19px]; +} diff --git a/src/components/home/Content/LearnMore/index.tsx b/src/components/home/Content/LearnMore/index.tsx new file mode 100644 index 0000000000..7edbdc8f7e --- /dev/null +++ b/src/components/home/Content/LearnMore/index.tsx @@ -0,0 +1,44 @@ +import style from './index.module.css'; +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; +import { sendTagEvent } from '@site/src/utils/gtag'; +import VectorIcon from '@site/static/img/public/vector.svg'; +import { FC } from 'react'; +import { ILearnMoreProps } from './interface'; + +const LearnMore: FC = ({ + href, + title, + category, + leftPadding = false, +}) => { + return ( + { + sendTagEvent({ + action: 'click', + category, + label: title, + }); + }} + > + { + sendTagEvent({ + action: 'click', + category, + label: title, + }); + }} + > + {title} + + + + ); +}; + +export default LearnMore; diff --git a/src/components/home/Content/LearnMore/interface.ts b/src/components/home/Content/LearnMore/interface.ts new file mode 100644 index 0000000000..4f157b8fde --- /dev/null +++ b/src/components/home/Content/LearnMore/interface.ts @@ -0,0 +1,6 @@ +export interface ILearnMoreProps { + href: string; + title: string; + category?: string; + leftPadding?: boolean; +} diff --git a/src/components/home/Content/LogoWall/index.module.css b/src/components/home/Content/LogoWall/index.module.css new file mode 100644 index 0000000000..bc282e8a83 --- /dev/null +++ b/src/components/home/Content/LogoWall/index.module.css @@ -0,0 +1,16 @@ +.wallContainerStyle { + @apply w-full max-w-[976px] flex flex-col items-center gap-[16px] px-[12px]; + @apply xl:gap-[32px] xl:px-[64px]; +} + +.logoTitleStyle { + @apply w-full text-center font-[700] text-[20px] text-white-01 leading-[28px]; +} +.logoContainerStyle { + @apply flex justify-center items-center w-full flex-wrap gap-x-[20px] gap-y-[12px]; + @apply xl:gap-x-[48px] xl:gap-y-[32px]; +} + +.logoStyle { + @apply h-[20px] xl:h-[40px]; +} diff --git a/src/components/home/Content/LogoWall/index.tsx b/src/components/home/Content/LogoWall/index.tsx new file mode 100644 index 0000000000..1247d751ae --- /dev/null +++ b/src/components/home/Content/LogoWall/index.tsx @@ -0,0 +1,33 @@ +import style from './index.module.css'; +import Translate from '@docusaurus/Translate'; + +const LOGO_WALL = [ + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo11.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo1.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo2.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo3.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo4.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo5.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo6.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo7.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo8.svg', + 'https://cdn.illacloud.com/official-website/img/logo-wall/logo9.svg', + // 'https://cdn.illacloud.com/official-website/img/logo-wall/logo10.svg', +]; + +function LogoWall() { + return ( +
+ + Trusted by thousands of teams + +
+ {LOGO_WALL.map((item) => ( + + ))} +
+
+ ); +} + +export default LogoWall; diff --git a/src/components/home/Content/MoreTemplate/index.module.css b/src/components/home/Content/MoreTemplate/index.module.css new file mode 100644 index 0000000000..fca357b2df --- /dev/null +++ b/src/components/home/Content/MoreTemplate/index.module.css @@ -0,0 +1,41 @@ +.templateContainerStyle { + @apply w-full flex flex-col gap-[24px]; + @apply xl:gap-[48px]; +} + +.templateHeadContainerStyle { + @apply flex flex-col items-center gap-[8px]; + @apply xl:gap-[16px]; +} + +.templateHeadContainerStyle h1 { + @apply text-center text-white-01 font-[700] text-[20px] leading-[28px]; + @apply xl:text-[40px] xl:leading-[56px]; +} +.templateItemContainerStyle { + @apply w-screen flex flex-nowrap gap-[24px] px-[20px] overflow-x-auto; + @apply xl:grid xl:grid-cols-3 xl:w-full xl:px-0; +} + +.templateItemStyle { + @apply w-[224px] flex flex-none flex-col items-start gap-[24px] rounded-[16px] text-white-01 h-full; + @apply xl:w-full xl:flex-auto; +} + +.templateTextStyle { + @apply flex flex-col items-start gap-[8px]; +} + +.templateTextTitleStyle { + @apply font-[600] text-[16px] leading-[24px]; +} + +.templateTextDescStyle { + @apply font-[400] text-[12px] leading-[16px] overflow-ellipsis line-clamp-2; +} + +@media screen and (max-width: 1280px) { + .templateItemContainerStyle { + transform: translateX(-20px); + } +} diff --git a/src/components/home/Content/MoreTemplate/index.tsx b/src/components/home/Content/MoreTemplate/index.tsx new file mode 100644 index 0000000000..34d9a26615 --- /dev/null +++ b/src/components/home/Content/MoreTemplate/index.tsx @@ -0,0 +1,128 @@ +import style from './index.module.css'; +import LearnMore from '../LearnMore'; +import { useUtmParams } from '@site/src/hooks/useUtmParams'; +import { translate } from '@docusaurus/Translate'; + +const MORE_TEMPLATE_CONTENT = { + title: translate({ + id: 'template.title.quickly_start_from_a', + message: 'Quickly start from a template', + }), + href: 'https://illa.ai', + moreTitle: translate({ + id: 'template.button.explore_more_templat', + message: 'Explore more templates', + }), + items: [ + { + templateTitle: translate({ + id: 'template.template1_title.car_rental_admin_pan', + message: 'Car rental admin panel', + }), + templateDesc: translate({ + id: 'template.template1_description.build_for_car_rental', + message: + 'Build for car rental companies to identify and track trends in vehicle usage, costs, and servicing', + }), + templateSrc: + 'https://cdn.illacloud.com/official-website/img/home/ChatGPT%20Plugin.svg', + mobileTemplateSrc: + 'https://cdn.illacloud.com/official-website/img/mobile/homepage/ChatGPT%20Plugin.png', + templateMoreTitle: translate({ + id: 'template.template1_button.learn_more', + message: 'Learn more', + }), + templateMoreHref: 'https://illa.ai/app/ILAcx4p1C7GP/detail', + }, + { + templateTitle: translate({ + id: 'template.template2_title.cms_with_content_gen', + message: 'CMS with content generation', + }), + templateDesc: translate({ + id: 'template.template2_description.build_for_business_o', + message: + 'Build for business operations teams to create and manage content more efficiently', + }), + templateSrc: + 'https://cdn.illacloud.com/official-website/img/home/Builder%20for%20Developers.svg', + mobileTemplateSrc: + 'https://cdn.illacloud.com/official-website/img/mobile/homepage/Builder%20for%20Developers.png', + templateMoreTitle: translate({ + id: 'template.template2_button.learn_more', + message: 'Learn more', + }), + templateMoreHref: 'https://illa.ai/app/ILAcx4p1C7J0/detail', + }, + { + templateTitle: translate({ + id: 'template.template3_title.applicant_tracking', + message: 'Applicant tracking', + }), + templateDesc: translate({ + id: 'template.template3_description.build_for_the_human', + message: + 'Build for the human resources team to collect resumes and track progress', + }), + templateSrc: + 'https://cdn.illacloud.com/official-website/img/home/Integrate%20with%20Any%20data%20source.svg', + mobileTemplateSrc: + 'https://cdn.illacloud.com/official-website/img/mobile/homepage/Integrate%20with%20Any%20data%20source.png', + templateMoreTitle: translate({ + id: 'template.template3_button.learn_more', + message: 'Learn more', + }), + templateMoreHref: 'https://illa.ai/app/ILAcx4p1C7GO/detail', + }, + ], +}; + +const MoeTemplateItem = ({ content, isMobile }) => { + const { + templateDesc, + templateMoreHref, + templateMoreTitle, + templateSrc, + templateTitle, + mobileTemplateSrc, + } = content; + const utmTemplateDetailUrl = useUtmParams(templateMoreHref); + return ( +
+ +
+

{templateTitle}

+

{templateDesc}

+ +
+
+ ); +}; + +const MoreTemplate = () => { + const utmMoreUrl = useUtmParams(MORE_TEMPLATE_CONTENT.href); + + return ( +
+
+

{MORE_TEMPLATE_CONTENT.title}

+ +
+
+ {MORE_TEMPLATE_CONTENT.items.map((content) => ( + + ))} +
+
+ ); +}; + +export default MoreTemplate; diff --git a/src/components/home/Content/Ways/Switch/Mobile/index.module.css b/src/components/home/Content/Ways/Switch/Mobile/index.module.css new file mode 100644 index 0000000000..7026b7d3b1 --- /dev/null +++ b/src/components/home/Content/Ways/Switch/Mobile/index.module.css @@ -0,0 +1,16 @@ +.switchContainerStyle { + @apply flex flex-col w-full gap-[24px]; +} + +.baseSwitchItemStyle { + @apply flex w-full p-[12px] justify-center items-center gap-[15px] rounded-[24px] cursor-pointer; + @apply text-white-01 text-[14px] font-[500] leading-[17px]; +} +.activeItemStyle { + @apply bg-tech-purple-01; +} + +.notActionItemStyle { + @apply bg-white/[0.1]; + box-shadow: 0px 6px 12px 0px rgba(26, 34, 51, 0.04); +} diff --git a/src/components/home/Content/Ways/Switch/Mobile/index.tsx b/src/components/home/Content/Ways/Switch/Mobile/index.tsx new file mode 100644 index 0000000000..e80b950498 --- /dev/null +++ b/src/components/home/Content/Ways/Switch/Mobile/index.tsx @@ -0,0 +1,34 @@ +import style from './index.module.css'; +import clsx from 'clsx'; +import { Fragment } from 'react'; + +const SwitchItem = ({ text, isActive, onClick }) => { + return ( + + {text} + + ); +}; + +const SwitchMobile = ({ activeIndex, onClick, options }) => { + return ( +
+ {options.map((item, i) => ( + + onClick(i)} + /> + + ))} +
+ ); +}; +export default SwitchMobile; diff --git a/src/components/home/Content/Ways/Switch/PC/index.module.css b/src/components/home/Content/Ways/Switch/PC/index.module.css new file mode 100644 index 0000000000..19ca7394f0 --- /dev/null +++ b/src/components/home/Content/Ways/Switch/PC/index.module.css @@ -0,0 +1,24 @@ +.borderStyle { + @apply p-[1px] bg-white/[0.08] rounded-[32px]; +} + +.switchContainerStyle { + @apply p-[2px] flex items-center rounded-[32px] gap-[2px]; + background: linear-gradient(180deg, #0f0f10 0%, #202021 100%); + backdrop-filter: blur(13.370903968811035px); +} + +.baseSwitchItemStyle { + @apply flex w-[308px] px-[18px] py-[20px] justify-center items-center gap-[15px] rounded-[32px] cursor-pointer; + @apply text-white-01 text-[16px] font-[500] leading-[24px]; +} +.activeItemStyle { + @apply bg-tech-purple-01; +} +.notActiveStyle { + box-shadow: 0px 3px 6px 0px rgba(26, 34, 51, 0.04); +} + +.lineStyle { + @apply w-[1.5px] h-[18px] rounded-[1.5px]; +} diff --git a/src/components/home/Content/Ways/Switch/PC/index.tsx b/src/components/home/Content/Ways/Switch/PC/index.tsx new file mode 100644 index 0000000000..a013c52c48 --- /dev/null +++ b/src/components/home/Content/Ways/Switch/PC/index.tsx @@ -0,0 +1,46 @@ +import style from './index.module.css'; +import clsx from 'clsx'; +import { Fragment } from 'react'; + +const SwitchItem = ({ text, isActive, onClick }) => { + return ( + + {text} + + ); +}; + +const SwitchPC = ({ activeIndex, onClick, options }) => { + return ( +
+
+ {options.map((item, i) => ( + + onClick(i)} + /> + {i !== options.length - 1 && ( +
+ )} + + ))} +
+
+ ); +}; +export default SwitchPC; diff --git a/src/components/home/Content/Ways/Switch/index.tsx b/src/components/home/Content/Ways/Switch/index.tsx new file mode 100644 index 0000000000..04d958f58b --- /dev/null +++ b/src/components/home/Content/Ways/Switch/index.tsx @@ -0,0 +1,13 @@ +import LayoutAutoChange from '@/layout/LayoutAutoChange'; +import SwitchPC from './PC'; +import SwitchMobile from './Mobile'; + +const Switch = (props) => { + return ( + } + mobile={} + /> + ); +}; +export default Switch; diff --git a/src/components/home/Content/Ways/SwitchContent/AIContent/constant.ts b/src/components/home/Content/Ways/SwitchContent/AIContent/constant.ts new file mode 100644 index 0000000000..03b67cd1e0 --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/AIContent/constant.ts @@ -0,0 +1,56 @@ +export const AI_AGENT_CONTENT = [ + [ + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E8%87%AA%E5%8A%A8%E5%8C%96.png', + desc: 'Collect messages on ILLA Builder automatically', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E6%90%9C%E7%B4%A2.png', + desc: 'Search for products, orders in ILLA Builder', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E7%94%9F%E6%88%90.png', + desc: 'AI Agent generates a reply based on all information', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E5%8F%91%E9%80%81.png', + desc: 'Check the content and send with 1 click', + }, + ], + [ + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E8%87%AA%E5%8A%A8%E5%8C%96.png', + desc: 'ILLA flow collects resumes automatically', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/dashboard.png', + desc: 'ILLA Builder provides solutions of CMS', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E7%94%9F%E6%88%90.png', + desc: 'AI Agent screen resumes for suitability', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E8%87%AA%E5%8A%A8%E5%8C%96.png', + desc: 'AI Agent composes emails and sends them', + }, + ], + [ + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E7%94%9F%E6%88%90.png', + desc: 'Generating images in Builder', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E8%87%AA%E5%8A%A8%E5%8C%96.png', + desc: 'Flow saves the images to Drive automatically', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E6%90%9C%E7%B4%A2.png', + desc: 'View and manage images in Builder', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E5%88%86%E4%BA%AB.png', + desc: 'Distribution through API, email, etc in Builder', + }, + ], +]; diff --git a/src/components/home/Content/Ways/SwitchContent/AIContent/index.module.css b/src/components/home/Content/Ways/SwitchContent/AIContent/index.module.css new file mode 100644 index 0000000000..715274074a --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/AIContent/index.module.css @@ -0,0 +1,28 @@ +.borderContainerStyle { + @apply w-full p-[1px] rounded-[4px]; + @apply xl:rounded-[8px]; + background: linear-gradient(90deg, #000 0%, #242424 100%); +} +.aiContentContainerStyle { + @apply flex h-full p-[16px] flex-col items-center gap-[8px] rounded-[4px]; + @apply xl:p-[40px] xl:gap-[16px] xl:rounded-[8px]; + background: linear-gradient(90deg, #000 0%, #141414 100%); +} + +.titleStyle { + @apply text-white-01 text-center text-[14px] font-[500] overflow-ellipsis line-clamp-1; +} + +.contentItemContainerStyle { + @apply h-full w-full flex flex-col gap-[14px] items-center justify-center; + @apply xl:min-h-[325px] xl:min-w-[488px] xl:gap-[22px]; +} + +@media screen and (max-width: 1280px) { + .borderContainerStyle { + background: linear-gradient(0deg, #242424 0%, #000 100%); + } + .aiContentContainerStyle { + background: linear-gradient(0deg, #141414 0%, #000 100%); + } +} diff --git a/src/components/home/Content/Ways/SwitchContent/AIContent/index.tsx b/src/components/home/Content/Ways/SwitchContent/AIContent/index.tsx new file mode 100644 index 0000000000..f8f4bad96b --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/AIContent/index.tsx @@ -0,0 +1,29 @@ +import style from './index.module.css'; +import ContentItem from '../ContentItem'; +import { AI_AGENT_CONTENT } from './constant'; +import Translate from '@docusaurus/Translate'; + +const AIContent = ({ activeIndex }) => { + const aiContent = AI_AGENT_CONTENT; + return ( +
+
+ + ILLA Cloud + +
+ {Array.isArray(aiContent[activeIndex]) && + aiContent[activeIndex].map(({ icon, desc }, i) => ( + + ))} +
+
+
+ ); +}; +export default AIContent; diff --git a/src/components/home/Content/Ways/SwitchContent/ContentItem/index.module.css b/src/components/home/Content/Ways/SwitchContent/ContentItem/index.module.css new file mode 100644 index 0000000000..d9f6fb80ca --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/ContentItem/index.module.css @@ -0,0 +1,29 @@ +.contentItemContainerStyle { + @apply relative; +} +.borderContainerStyle { + @apply p-[1px] rounded-[12px]; + @apply xl:rounded-[20px]; + background: linear-gradient(180deg, #1f1f1f 0%, #000 100%); +} +.ItemContainerStyle { + @apply flex py-[5px] px-[18px] items-center gap-[8px] rounded-[12px] bg-[#141414]; + @apply xl:py-[9px] xl:px-[32px] xl:rounded-[20px]; + @apply text-white-01 text-[12px] font-[500] leading-[17px]; + @apply xl:text-[14px] xl:leading-[22px]; +} + +.ItemIconStyle { + @apply w-[14px] h-[14px]; + @apply xl:w-[24px] xl:h-[24px]; +} +.joinItemStyle { + @apply w-[16px] h-[29px] absolute z-[1]; + top: calc(100% - 5px); + left: 50%; + transform: translateX(-50%); +} + +.joinItemIconStyle { + @apply w-[12px] xl:w-[16px] xl:h-[29px]; +} diff --git a/src/components/home/Content/Ways/SwitchContent/ContentItem/index.tsx b/src/components/home/Content/Ways/SwitchContent/ContentItem/index.tsx new file mode 100644 index 0000000000..6c989970e3 --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/ContentItem/index.tsx @@ -0,0 +1,25 @@ +import style from './index.module.css'; +import JoinItemIcon from '@site/static/img/home3/joinItem.svg'; + +const JoinItem = () => { + return ( + + + + ); +}; + +const ContentItem = ({ iconSrc, text, isLast }) => { + return ( +
+
+
+ + {text} +
+
+ {!isLast && } +
+ ); +}; +export default ContentItem; diff --git a/src/components/home/Content/Ways/SwitchContent/HumanContent/constant.ts b/src/components/home/Content/Ways/SwitchContent/HumanContent/constant.ts new file mode 100644 index 0000000000..fc02f6aa11 --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/HumanContent/constant.ts @@ -0,0 +1,56 @@ +export const HUMAN_CONTENT = [ + [ + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E6%B6%88%E6%81%AF.png', + desc: 'Check user messages on comms softwares', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E6%90%9C%E7%B4%A2.png', + desc: "Search for information of products, users' orders", + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E5%86%99.png', + desc: 'Write a reply based on information and reply templates', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E5%8F%91%E9%80%81.png', + desc: 'Send reply', + }, + ], + [ + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E4%B8%8B%E8%BD%BD%E7%AE%80%E5%8E%86.png', + desc: 'Collect resumes from different channels', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E8%B7%9F%E8%B8%AA%E8%BF%9B%E5%BA%A6.png', + desc: 'Manage resumes and tracking progress', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E6%90%9C%E7%B4%A2.png', + desc: 'Screen resumes for suitability', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E9%A2%84%E7%BA%A6%E9%9D%A2%E8%AF%95.png', + desc: 'Send interview invitations', + }, + ], + [ + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E9%9C%80%E6%B1%82.png', + desc: 'Submitting requirements', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E7%94%BB%E5%9B%BE.png', + desc: 'Designer creates/designs', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E4%B8%8A%E4%BC%A0.png', + desc: 'Uploading to cloud storage', + }, + { + icon: 'https://cdn.illacloud.com/official-website/img/home/solutions-icon/%E5%88%86%E4%BA%AB.png', + desc: 'Copying the link and distributing', + }, + ], +]; diff --git a/src/components/home/Content/Ways/SwitchContent/HumanContent/index.module.css b/src/components/home/Content/Ways/SwitchContent/HumanContent/index.module.css new file mode 100644 index 0000000000..1491f2ea87 --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/HumanContent/index.module.css @@ -0,0 +1,28 @@ +.borderContainerStyle { + @apply w-full p-[1px] rounded-[4px]; + @apply xl:rounded-[8px]; + background: linear-gradient(90deg, #242424 0%, #000 100%); +} +.humanContentContainerStyle { + @apply flex h-full p-[16px] flex-col items-center gap-[8px] rounded-[4px]; + @apply xl:p-[40px] xl:gap-[16px] xl:rounded-[8px]; + background: linear-gradient(90deg, #141414 0%, #000 100%); +} + +.titleStyle { + @apply text-white-01 text-center text-[14px] font-[500] overflow-ellipsis line-clamp-1; +} + +.contentItemContainerStyle { + @apply h-full w-full flex flex-col gap-[14px] items-center justify-center; + @apply xl:min-h-[325px] xl:min-w-[488px] xl:gap-[22px]; +} + +@media screen and (max-width: 1280px) { + .borderContainerStyle { + background: linear-gradient(0deg, #000 0%, #242424 100%); + } + .humanContentContainerStyle { + background: linear-gradient(0deg, #000 0%, #141414 100%); + } +} diff --git a/src/components/home/Content/Ways/SwitchContent/HumanContent/index.tsx b/src/components/home/Content/Ways/SwitchContent/HumanContent/index.tsx new file mode 100644 index 0000000000..22cf0c14ff --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/HumanContent/index.tsx @@ -0,0 +1,30 @@ +import style from './index.module.css'; +import ContentItem from '../ContentItem'; +import { HUMAN_CONTENT } from './constant'; +import Translate from '@docusaurus/Translate'; + +const HumanContent = ({ activeIndex }) => { + return ( +
+
+ + + Human work + + +
+ {Array.isArray(HUMAN_CONTENT[activeIndex]) && + HUMAN_CONTENT[activeIndex].map(({ icon, desc }, i) => ( + + ))} +
+
+
+ ); +}; +export default HumanContent; diff --git a/src/components/home/Content/Ways/SwitchContent/index.module.css b/src/components/home/Content/Ways/SwitchContent/index.module.css new file mode 100644 index 0000000000..eba52319e0 --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/index.module.css @@ -0,0 +1,8 @@ +.switchContentStyle { + @apply w-full grid grid-cols-1; + @apply xl:grid xl:grid-flow-col; +} + +.vsStyle { + @apply w-[40px] xl:w-[64px] m-auto; +} diff --git a/src/components/home/Content/Ways/SwitchContent/index.tsx b/src/components/home/Content/Ways/SwitchContent/index.tsx new file mode 100644 index 0000000000..088375df9d --- /dev/null +++ b/src/components/home/Content/Ways/SwitchContent/index.tsx @@ -0,0 +1,15 @@ +import AIContent from './AIContent'; +import HumanContent from './HumanContent'; +import style from './index.module.css'; +import VSIcon from '@site/static/img/home3/vs.svg'; +const SwitchContent = ({ activeIndex }) => { + return ( +
+ + + +
+ ); +}; + +export default SwitchContent; diff --git a/src/components/home/Content/Ways/index.module.css b/src/components/home/Content/Ways/index.module.css new file mode 100644 index 0000000000..ebbb2413c9 --- /dev/null +++ b/src/components/home/Content/Ways/index.module.css @@ -0,0 +1,8 @@ +.waysContainerStyle { + @apply w-full flex flex-col items-center gap-[32px]; + @apply xl:gap-[64px]; +} +.waysTitleStyle { + @apply w-full text-white-01 text-[20px] font-[700] text-center; + @apply xl:text-[40px] xl:max-w-[1040px]; +} diff --git a/src/components/home/Content/Ways/index.tsx b/src/components/home/Content/Ways/index.tsx new file mode 100644 index 0000000000..834b9a4580 --- /dev/null +++ b/src/components/home/Content/Ways/index.tsx @@ -0,0 +1,33 @@ +import style from './index.module.css'; +import SwitchContent from './SwitchContent'; +import { useState } from 'react'; +import Translate from '@docusaurus/Translate'; +import SwitchPC from './Switch/PC'; + +const options = [ + 'solutions.option1.customer_comms', + 'solutions.option2.applicant_tracking', + 'solutions.option3.image_content_manage', +]; + +const Ways = () => { + const [activeIndex, setActiveIndex] = useState(0); + return ( +
+

+ + How ILLA AI Improves Work Practices + +

+ setActiveIndex(i)} + activeIndex={activeIndex} + options={options} + /> + {/* setActiveIndex(i)} activeIndex={activeIndex} /> */} + +
+ ); +}; + +export default Ways; diff --git a/src/components/home/Content/index.module.css b/src/components/home/Content/index.module.css new file mode 100644 index 0000000000..43ba9e677b --- /dev/null +++ b/src/components/home/Content/index.module.css @@ -0,0 +1,12 @@ +.contentContainer { + @apply w-full bg-black pt-[40px] w-full flex items-center flex-col relative z-[31] overflow-x-hidden; + @apply xl:pt-[200px] xl:overflow-visible; +} +.content { + @apply w-full px-[20px] text-white-01 flex flex-col gap-[100px] items-center relative; + @apply xl:p-0 xl:w-[1200px] xl:gap-[200px]; +} + +.commBottomContainerStyle { + @apply mt-[100px] xl:mt-[200px] flex items-center text-white-01 w-full; +} diff --git a/src/components/home/Content/index.tsx b/src/components/home/Content/index.tsx new file mode 100644 index 0000000000..fcd13257e5 --- /dev/null +++ b/src/components/home/Content/index.tsx @@ -0,0 +1,28 @@ +import style from './index.module.css'; +import AllContent from './AllContent'; +import Ways from './Ways'; +import CardContent from './CardContent'; +import MoreTemplate from './MoreTemplate'; +import CommBottom from '@site/src/components/common/CommBottom'; +import LogoWall from '@site/src/components/home/Content/LogoWall'; +import Comments from './Comments'; + +const NewContent = () => { + return ( +
+
+ + + + + + +
+
+ +
+
+ ); +}; + +export default NewContent; diff --git a/src/components/home/Form/BecomePartner.js b/src/components/home/Form/BecomePartner.js new file mode 100644 index 0000000000..d3197ae272 --- /dev/null +++ b/src/components/home/Form/BecomePartner.js @@ -0,0 +1,147 @@ +import { useState } from 'react' +import { useForm } from 'react-hook-form' +import { RemoveScroll } from 'react-remove-scroll' +import { useTranslation } from 'next-i18next' +import clsx from 'clsx' +import style from './index.module.css' +import { Toast } from '@/components/home/Toast' +import { partnerFormContent } from '@/constants/content' + +const BecomePartner = ({ visible, onChangeShow }) => { + const { t } = useTranslation('home') + const { + handleSubmit, + register, + reset, + formState: { isValid }, + } = useForm({ + mode: 'onSubmit', + }) + + const [disabled, setDisabled] = useState(true) + + const onSubmit = async (val) => { + if (!disabled) return + setDisabled(false) + await fetch( + 'https://lark.illasoft.com/lark/partner', + { + method: 'POST', + body: JSON.stringify(val), + headers: { + 'Content-Type': 'application/json', + }, + }, + ) + .then(async (res) => { + const resJSON = await res.json() + if (resJSON.message) { + onChangeShow() + reset() + Toast.info('😀 success', 2) + } else throw new Error() + }) + .catch(() => { + Toast.info('😣 fail', 2) + }) + .finally(() => { + setDisabled(true) + }) + } + + + if (!visible) return null + + return ( +
+ +
+
+
+ closeIcon +

+ {t('partnerFrom.title')} + closeIcon +

+
+
+ {t('partnerFrom.form.name.label')} +
+ + +
+
+ {partnerFormContent.map(({ label, name, required, pattern, placeholder }) => ( +
+
+ {required && ( + + + + )} + {t(label)} +
+
+ +
+
+ ))} +
+ +
+
+
+
+
+ ) +} + +export default BecomePartner diff --git a/src/components/home/Form/BookDemo.js b/src/components/home/Form/BookDemo.js new file mode 100644 index 0000000000..7728c20deb --- /dev/null +++ b/src/components/home/Form/BookDemo.js @@ -0,0 +1,152 @@ +import { useState } from 'react' +import { useForm } from 'react-hook-form' +import { RemoveScroll } from 'react-remove-scroll' +import { useTranslation } from 'next-i18next' +import clsx from 'clsx' +import style from './index.module.css' +import { Toast } from '@/components/home/Toast' +import { bookFormContent } from '@/constants/content' + +export const BookDemo = ({ visible, onChangeShow }) => { + const { t } = useTranslation('home') + const { + handleSubmit, + register, + reset, + formState: { isValid }, + } = useForm({ + mode: 'onSubmit', + }) + + const [disabled, setDisabled] = useState(true) + + const onSubmit = async (val) => { + if (!disabled) return + setDisabled(false) + await fetch( + 'https://lark.illasoft.com/lark/bookForm', + { + method: 'POST', + body: JSON.stringify(val), + headers: { + 'Content-Type': 'application/json', + }, + }, + ) + .then(async (res) => { + const resJSON = await res.json() + if (resJSON.message) { + onChangeShow() + reset() + Toast.info('😀 success', 2) + } else throw new Error() + }) + .catch(() => { + Toast.info('😣 fail', 2) + }) + .finally(() => { + setDisabled(true) + }) + } + + if (!visible) return null + + return ( +
+ +
+
+ book a demo +
+
+
+ closeIcon +

+ {t('bookFrom.title')} + closeIcon +

+
+
+
+ {t('partnerFrom.form.name.label')} +
+ + +
+
+ {bookFormContent.map(({ label, name, required, pattern, placeholder }) => ( +
+
+ {required && ( + + + + )} + {t(label)} +
+
+ +
+
+ ))} +
+ +
+
+
+
+
+
+ ) +} diff --git a/src/components/home/Form/index.module.css b/src/components/home/Form/index.module.css new file mode 100644 index 0000000000..9053fafdf8 --- /dev/null +++ b/src/components/home/Form/index.module.css @@ -0,0 +1,59 @@ +.inputItem { + @apply flex flex-col items-start justify-center gap-[16px] py-[8px] px-[16px]; + @apply xl:py-[8px] xl:pl-[16px] xl:pr-[24px] xl:justify-end xl:items-center xl:flex-row xl:p-0; +} +.colInputItem { + @apply flex flex-col items-start justify-center gap-[16px] py-[8px] px-[16px] leading-[22px] font-[500]; + @apply xl:gap-[8px] xl:px-[32px]; +} +.bookInput div div { + box-sizing: border-box !important; + height: 32px !important; + @apply py-[5px] px-[16px]; +} +.input { + border: 1px solid #e5e6eb; + @apply py-[13px] px-[16px] bg-[#1F1F1F] rounded-[4px] h-[48px] box-border outline-none border-0; + @apply xl:py-[5px] xl:bg-white xl:rounded-[8px] xl:h-[32px] xl:border-[1px]; +} +.input::placeholder { + @apply font-[400] text-[14px] leading-[22px] text-[#999999]; +} +.button { + @apply box-border flex flex-row items-center justify-center text-white h-[48px] py-[14px] px-[16px] font-[500] text-[16px] leading-[20px] rounded-[4px]; + @apply bg-tech-purple-01 rounded-[4px] hover:bg-tech-purple-02 focus:bg-tech-purple-n-01; + @apply xl:py-[5px] xl:px-[16px] xl:font-[400] xl:text-[14px] xl:leading-[22px] xl:h-[32px] xl:rounded-[8px]; +} +.button:disabled { + @apply bg-tech-purple-03; +} +.partner { + @apply fixed top-0 bottom-0 w-full z-50; + background-color: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(4px); +} +.partnerContainer { + @apply flex flex-col items-center text-white w-full h-screen bg-black z-[51] overflow-y-auto; + @apply xl:text-garyBlue-02 xl:w-[464px] xl:h-[538px] xl:absolute xl:rounded-[8px] xl:bg-white xl:top-0 xl:bottom-0 xl:right-0 xl:left-0 xl:m-auto; +} +.partnerTitle { + @apply h-[64px] font-[700] text-[24px] leading-[26px] flex items-center justify-between py-[17.5px] px-[20px]; + @apply xl:h-[68px] xl:font-[500] xl:text-[20px] xl:leading-[28px] xl:text-center xl:justify-center xl:py-0 xl:px-0; +} +.book { + @apply fixed top-0 bottom-0 w-full z-50; + background-color: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(4px); +} +.bookContainer { + @apply flex flex-col justify-center items-start text-white w-full h-screen bg-black z-[51] overflow-y-scroll; + @apply xl:text-garyBlue-02 flex-row xl:w-[744px] xl:h-[710px] xl:absolute xl:rounded-[16px] xl:overflow-hidden xl:bg-white xl:top-0 xl:bottom-0 xl:right-0 xl:left-0 xl:m-auto lg:items-center; +} +.bookTitle { + @apply h-[64px] font-[700] text-[24px] leading-[26px] flex items-center justify-between py-[17.5px] px-[20px]; + @apply xl:h-[68px] xl:font-[500] xl:text-[20px] xl:leading-[28px] xl:text-center xl:justify-center xl:py-0 xl:pl-[32px]; +} +.mdSubmit { + @apply w-full flex justify-center items-center py-[36px] px-0 gap-[4px] mb-[150px]; + @apply xl:p-[24px] xl:gap-[8px] xl:mb-0; +} diff --git a/src/components/home/Toast/index.js b/src/components/home/Toast/index.js new file mode 100644 index 0000000000..8be7a5b17e --- /dev/null +++ b/src/components/home/Toast/index.js @@ -0,0 +1,24 @@ +import * as ReactDOM from 'react-dom' +import styles from './style.module.css' + +const ToastItem = (props) => { + return ( +
+
{props?.value}
+
+ ) +} + +export class Toast { + static info(value, duration) { + const containerDiv = document.createElement('div') + document.body.appendChild(containerDiv) + ReactDOM.render( + , + containerDiv, + ) + setTimeout(() => { + document.body.removeChild(containerDiv) + }, duration * 1000) + } +} diff --git a/src/components/home/Toast/style.module.css b/src/components/home/Toast/style.module.css new file mode 100644 index 0000000000..df4ffbcad1 --- /dev/null +++ b/src/components/home/Toast/style.module.css @@ -0,0 +1,21 @@ +.container { + @apply top-[40px]; + @apply sm:top-[80px]; + position: fixed; + z-index: 1000; + width: 100%; + text-align: center; +} + +.text { + display: inline-block; + padding: 9px 16px; + background-color: white; + font-weight: 400; + font-size: 14px; + line-height: 22px; + color: #1f1f1f; + border-radius: 8px; + border: 1px solid #ebebeb; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.08); +} diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 0000000000..1cacf67db4 --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,36 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ + +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --ifm-color-primary: #654aec; + --ifm-color-primary-dark: #4d2ee9; + --ifm-color-primary-darker: #4120e8; + --ifm-color-primary-darkest: #3215c4; + --ifm-color-primary-light: #7d66ef; + --ifm-color-primary-lighter: #8974f0; + --ifm-color-primary-lightest: #846ef0; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #9580ff; + --ifm-color-primary-dark: #755aff; + --ifm-color-primary-darker: #6547ff; + --ifm-color-primary-darkest: #350dff; + --ifm-color-primary-light: #b5a6ff; + --ifm-color-primary-lighter: #c5b9ff; + --ifm-color-primary-lightest: #f5f3ff; + --ifm-background-color: #0a0a0a; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} diff --git a/src/hooks/isMobile.ts b/src/hooks/isMobile.ts new file mode 100644 index 0000000000..0f5cf48392 --- /dev/null +++ b/src/hooks/isMobile.ts @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react'; + +const getIsMobile = () => + typeof window !== 'undefined' ? window.innerWidth <= 768 : false; + +export default function useIsMobile() { + const [isMobile, setIsMobile] = useState(getIsMobile()); + + useEffect(() => { + const onResize = () => { + setIsMobile(getIsMobile()); + }; + + if (typeof window !== 'undefined') { + window.addEventListener('resize', onResize); + } + + return () => { + if (typeof window !== 'undefined') { + window.removeEventListener('resize', onResize); + } + }; + }, []); + + return isMobile; +} diff --git a/src/hooks/localstorage.ts b/src/hooks/localstorage.ts new file mode 100644 index 0000000000..8cd814853b --- /dev/null +++ b/src/hooks/localstorage.ts @@ -0,0 +1,45 @@ +import { useState } from 'react'; + +const useLocalStorage = (key: string, initialValue: T) => { + // State to store our value + // Pass initial state function to useState so logic is only executed once + const [storedValue, setStoredValue] = useState(() => { + if (typeof window === 'undefined') { + return initialValue; + } + try { + // Get from local storage by key + const item = + typeof window !== 'undefined' + ? window.localStorage.getItem(key) + : undefined; + // Parse stored json or if none return initialValue + return item ? JSON.parse(item) : initialValue; + } catch (error) { + // If error also return initialValue + console.log(error); + return initialValue; + } + }); + // Return a wrapped version of useState's setter function that ... + // ... persists the new value to localStorage. + const setValue = (value: T | ((val: T) => T)) => { + try { + // Allow value to be a function so we have same API as useState + const valueToStore = + value instanceof Function ? value(storedValue) : value; + // Save state + setStoredValue(valueToStore); + // Save to local storage + if (typeof window !== 'undefined') { + window.localStorage.setItem(key, JSON.stringify(valueToStore)); + } + } catch (error) { + // A more advanced implementation would handle the error case + console.log(error); + } + }; + return [storedValue, setValue] as const; +}; + +export default useLocalStorage; diff --git a/src/hooks/useElementFirstShow.ts b/src/hooks/useElementFirstShow.ts new file mode 100644 index 0000000000..cc7b2ccdfd --- /dev/null +++ b/src/hooks/useElementFirstShow.ts @@ -0,0 +1,25 @@ +import {useRef, useEffect} from 'react' + +export const useElementFirstShow = (el, callback) => { + const firstShow = useRef(true) + + useEffect(() => { + let target = el.current + const observer = new IntersectionObserver((entries) => { + if(entries[0].isIntersecting && firstShow.current) { + firstShow.current = false + callback && callback() + observer.unobserve(target) + } + }) + if(target) { + observer.observe(target) + } + return () => { + if(target) { + observer.unobserve(target) + } + firstShow.current = true + } + }, [callback, el]) +} \ No newline at end of file diff --git a/src/hooks/usePlatform.ts b/src/hooks/usePlatform.ts new file mode 100644 index 0000000000..c95faae2fe --- /dev/null +++ b/src/hooks/usePlatform.ts @@ -0,0 +1,11 @@ +import { useState, useEffect } from 'react' + +export const usePlatform = () => { + const [isInMobile, setIsInMobile] = useState(false) + useEffect(() => { + const userAgent = typeof window.navigator === 'undefined' ? '' : window.navigator.userAgent; + const mobileRegex = /Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i; + setIsInMobile(mobileRegex.test(userAgent)) + }, []) + return isInMobile +} \ No newline at end of file diff --git a/src/hooks/useUtmParams.ts b/src/hooks/useUtmParams.ts new file mode 100644 index 0000000000..d90cda0047 --- /dev/null +++ b/src/hooks/useUtmParams.ts @@ -0,0 +1,22 @@ +import useIsBrowser from '@docusaurus/useIsBrowser'; + +export const useUtmParams = (url: string) => { + const isBrowser = useIsBrowser(); + const location = isBrowser ? window.location.href : 'fetching location...'; + + if (isBrowser) { + const currentURL = new URL(location); + const searchParams = currentURL.searchParams; + const utm_source = searchParams.get('utm_source'); + const utm_medium = searchParams.get('utm_medium'); + const utm_campaign = searchParams.get('utm_campaign'); + const targetURL = new URL(url); + + utm_source && targetURL.searchParams.append('utm_source', utm_source); + utm_medium && targetURL.searchParams.append('utm_medium', utm_medium); + utm_campaign && targetURL.searchParams.append('utm_campaign', utm_campaign); + return targetURL.toString(); + } else { + return url; + } +}; diff --git a/src/pages/components/Chart/index.tsx b/src/pages/components/Chart/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/components/Chart/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/components/Radio group/index.tsx b/src/pages/components/Radio group/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/components/Radio group/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/components/Select/index.tsx b/src/pages/components/Select/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/components/Select/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/components/Switch/index.tsx b/src/pages/components/Switch/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/components/Switch/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/components/Tables/index.tsx b/src/pages/components/Tables/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/components/Tables/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/components/Upload/index.tsx b/src/pages/components/Upload/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/components/Upload/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/illa-self-host/index.tsx b/src/pages/illa-self-host/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/illa-self-host/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/illacloud/index.tsx b/src/pages/illacloud/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/illacloud/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/illadrive/index.tsx b/src/pages/illadrive/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/illadrive/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/index.module.css b/src/pages/index.module.css new file mode 100644 index 0000000000..9f71a5da77 --- /dev/null +++ b/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000000..ba617ee1e8 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,50 @@ +import Head from '@docusaurus/Head'; + +import { CommonLayout } from '../ILLATheme/CommonLayout'; +import { CommonHeader } from '../ILLATheme/CommonHeader'; +import CommonFooter from '../ILLATheme/CommonFooter'; +import { useState } from 'react'; +import { useRaf } from 'react-use'; +import NewContent from '../components/home/Content'; +import BannerPC from '../components/home/Banner/PC'; +import BannerMobile from '../components/home/Banner/Mobile'; +import { useGetGithubStars } from '../components/home/Banner/hooks/useGithubStars'; + +export default function Home(): JSX.Element { + const title = 'ILLA'; + const [playMaskShow, setPlayMaskShow] = useState(false); + const step = useRaf(1000, 0); + + const [, githubStarts] = useGetGithubStars(); + + return ( + <> + + + {title} + + + +
+ + + + + + {/* setPlayMaskShow(false)} + link="https://cdn.illacloud.com/official-website/img/home/video.mp4" + /> */} + +
+
+ + ); +} diff --git a/src/pages/integrations/Elastic Search/index.tsx b/src/pages/integrations/Elastic Search/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/integrations/Elastic Search/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/integrations/Firebase/index.tsx b/src/pages/integrations/Firebase/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/integrations/Firebase/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/integrations/Microsoft SQL Server/index.tsx b/src/pages/integrations/Microsoft SQL Server/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/integrations/Microsoft SQL Server/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/integrations/MongoDB/index.tsx b/src/pages/integrations/MongoDB/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/integrations/MongoDB/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/integrations/MySQL/index.tsx b/src/pages/integrations/MySQL/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/integrations/MySQL/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/integrations/PostgreSQL/index.tsx b/src/pages/integrations/PostgreSQL/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/integrations/PostgreSQL/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md new file mode 100644 index 0000000000..9756c5b668 --- /dev/null +++ b/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/src/pages/pricing/index.tsx b/src/pages/pricing/index.tsx new file mode 100644 index 0000000000..5e22b4aea0 --- /dev/null +++ b/src/pages/pricing/index.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react'; + +export default function () { + return
Pricing
; +} diff --git a/src/theme/BlogLayout/index.js b/src/theme/BlogLayout/index.js new file mode 100644 index 0000000000..617603d721 --- /dev/null +++ b/src/theme/BlogLayout/index.js @@ -0,0 +1 @@ +export { ILLABlogLayout as default } from "@site/src/ILLATheme/BlogLayout"; diff --git a/src/theme/BlogListPage/index.js b/src/theme/BlogListPage/index.js new file mode 100644 index 0000000000..c8ea793fcb --- /dev/null +++ b/src/theme/BlogListPage/index.js @@ -0,0 +1,93 @@ +import React from 'react'; +import clsx from 'clsx'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import { + PageMetadata, + HtmlClassNameProvider, + ThemeClassNames, +} from '@docusaurus/theme-common'; +import BlogLayout from '@theme/BlogLayout'; +import BlogListPaginator from '@theme/BlogListPaginator'; +import SearchMetadata from '@theme/SearchMetadata'; +import BlogPostItems from '@theme/BlogPostItems'; +import { FeaturedBlogPostItems } from "../../components/blog/FeaturedBlogPostItems"; + +function BlogListPageMetadata(props) { + const { metadata } = props; + const { + siteConfig: { title: siteTitle }, + } = useDocusaurusContext(); + const { blogDescription, blogTitle, permalink } = metadata; + const isBlogOnlyMode = permalink === '/'; + const title = isBlogOnlyMode ? siteTitle : blogTitle; + return ( + <> + + + + ); +} +function BlogListPageContent(props) { + const { metadata, items, tags } = props; + + const isFirstPage = metadata.page === 1; + + const featuredPosts = items.filter( + (post) => post.content.metadata.frontMatter.is_featured === true, + ); + + const paginatedPosts = items.filter( + (post) => post.content.metadata.frontMatter.is_featured !== true, + ); + + return ( + + {isFirstPage && } +
+
+
+ +
+ +
+
+ ); +} +export default function BlogListPage(props) { + return ( + + + + + ); +} diff --git a/src/theme/BlogListPaginator/index.js b/src/theme/BlogListPaginator/index.js new file mode 100644 index 0000000000..6aea4b49b9 --- /dev/null +++ b/src/theme/BlogListPaginator/index.js @@ -0,0 +1,42 @@ +import React from 'react'; +import Translate, {translate} from '@docusaurus/Translate'; +import PaginatorNavLink from '@theme/PaginatorNavLink'; +export default function BlogListPaginator(props) { + const {metadata} = props; + const {previousPage, nextPage} = metadata; + return ( + + ); +} diff --git a/src/theme/BlogPostItem/Container/index.js b/src/theme/BlogPostItem/Container/index.js new file mode 100644 index 0000000000..910de24b25 --- /dev/null +++ b/src/theme/BlogPostItem/Container/index.js @@ -0,0 +1,29 @@ +import React from 'react'; +import {useBaseUrlUtils} from '@docusaurus/useBaseUrl'; +import {useBlogPost} from '@docusaurus/theme-common/internal'; +export default function BlogPostItemContainer({children, className}) { + const { + frontMatter, + assets, + metadata: {description}, + } = useBlogPost(); + const {withBaseUrl} = useBaseUrlUtils(); + const image = assets.image ?? frontMatter.image; + const keywords = frontMatter.keywords ?? []; + return ( +
+ {description && } + {image && ( + + )} + {keywords.length > 0 && ( + + )} + {children} +
+ ); +} diff --git a/src/theme/BlogPostItem/Content/index.js b/src/theme/BlogPostItem/Content/index.js new file mode 100644 index 0000000000..d8ee78b90c --- /dev/null +++ b/src/theme/BlogPostItem/Content/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import clsx from 'clsx'; +import {blogPostContainerID} from '@docusaurus/utils-common'; +import {useBlogPost} from '@docusaurus/theme-common/internal'; +import MDXContent from '@theme/MDXContent'; +export default function BlogPostItemContent({children, className}) { + const {isBlogPostPage} = useBlogPost(); + return ( +
+ {children} +
+ ); +} diff --git a/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js b/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js new file mode 100644 index 0000000000..9b93d2549a --- /dev/null +++ b/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js @@ -0,0 +1,32 @@ +import React from 'react'; +import Translate, {translate} from '@docusaurus/Translate'; +import Link from '@docusaurus/Link'; +function ReadMoreLabel() { + return ( + + + Read More + + + ); +} +export default function BlogPostItemFooterReadMoreLink(props) { + const {blogPostTitle, ...linkProps} = props; + return ( + + + + ); +} diff --git a/src/theme/BlogPostItem/Footer/index.js b/src/theme/BlogPostItem/Footer/index.js new file mode 100644 index 0000000000..ec312aa2be --- /dev/null +++ b/src/theme/BlogPostItem/Footer/index.js @@ -0,0 +1,46 @@ +import React from 'react'; +import clsx from 'clsx'; +import {useBlogPost} from '@docusaurus/theme-common/internal'; +import EditThisPage from '@theme/EditThisPage'; +import TagsListInline from '@theme/TagsListInline'; +import ReadMoreLink from '@theme/BlogPostItem/Footer/ReadMoreLink'; +import styles from './styles.module.css'; +export default function BlogPostItemFooter() { + const {metadata, isBlogPostPage} = useBlogPost(); + const {tags, title, editUrl, hasTruncateMarker} = metadata; + // A post is truncated if it's in the "list view" and it has a truncate marker + const truncatedPost = !isBlogPostPage && hasTruncateMarker; + const tagsExists = tags.length > 0; + const renderFooter = tagsExists || truncatedPost || editUrl; + if (!renderFooter) { + return null; + } + return ( +
+ {tagsExists && ( +
+ +
+ )} + + {isBlogPostPage && editUrl && ( +
+ +
+ )} + + {truncatedPost && ( +
+ +
+ )} +
+ ); +} diff --git a/src/theme/BlogPostItem/Footer/styles.module.css b/src/theme/BlogPostItem/Footer/styles.module.css new file mode 100644 index 0000000000..fc51241831 --- /dev/null +++ b/src/theme/BlogPostItem/Footer/styles.module.css @@ -0,0 +1,3 @@ +.blogPostFooterDetailsFull { + flex-direction: column; +} diff --git a/src/theme/BlogPostItem/Header/Author/index.js b/src/theme/BlogPostItem/Header/Author/index.js new file mode 100644 index 0000000000..cdcd9536be --- /dev/null +++ b/src/theme/BlogPostItem/Header/Author/index.js @@ -0,0 +1,46 @@ +import React from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +function MaybeLink(props) { + if (props.href) { + return ; + } + return <>{props.children}; +} +export default function BlogPostItemHeaderAuthor({author, className}) { + const {name, title, url, imageURL, email} = author; + const link = url || (email && `mailto:${email}`) || undefined; + return ( +
+ {imageURL && ( + + {name} + + )} + + {name && ( + + )} +
+ ); +} diff --git a/src/theme/BlogPostItem/Header/Authors/index.js b/src/theme/BlogPostItem/Header/Authors/index.js new file mode 100644 index 0000000000..c29d4f3db4 --- /dev/null +++ b/src/theme/BlogPostItem/Header/Authors/index.js @@ -0,0 +1,42 @@ +import React from 'react'; +import clsx from 'clsx'; +import {useBlogPost} from '@docusaurus/theme-common/internal'; +import BlogPostItemHeaderAuthor from '@theme/BlogPostItem/Header/Author'; +import styles from './styles.module.css'; +// Component responsible for the authors layout +export default function BlogPostItemHeaderAuthors({className}) { + const { + metadata: {authors}, + assets, + } = useBlogPost(); + const authorsCount = authors.length; + if (authorsCount === 0) { + return null; + } + const imageOnly = authors.every(({name}) => !name); + return ( +
+ {authors.map((author, idx) => ( +
+ +
+ ))} +
+ ); +} diff --git a/src/theme/BlogPostItem/Header/Authors/styles.module.css b/src/theme/BlogPostItem/Header/Authors/styles.module.css new file mode 100644 index 0000000000..c5aac4d9af --- /dev/null +++ b/src/theme/BlogPostItem/Header/Authors/styles.module.css @@ -0,0 +1,14 @@ +.authorCol { + max-width: inherit !important; + flex-grow: 1 !important; +} + +.imageOnlyAuthorRow { + display: flex; + flex-flow: row wrap; +} + +.imageOnlyAuthorCol { + margin-left: 0.3rem; + margin-right: 0.3rem; +} diff --git a/src/theme/BlogPostItem/Header/Info/index.js b/src/theme/BlogPostItem/Header/Info/index.js new file mode 100644 index 0000000000..a1ad784905 --- /dev/null +++ b/src/theme/BlogPostItem/Header/Info/index.js @@ -0,0 +1,54 @@ +import React from 'react'; +import clsx from 'clsx'; +import {translate} from '@docusaurus/Translate'; +import {usePluralForm} from '@docusaurus/theme-common'; +import {useBlogPost} from '@docusaurus/theme-common/internal'; +import styles from './styles.module.css'; +// Very simple pluralization: probably good enough for now +function useReadingTimePlural() { + const {selectMessage} = usePluralForm(); + return (readingTimeFloat) => { + const readingTime = Math.ceil(readingTimeFloat); + return selectMessage( + readingTime, + translate( + { + id: 'theme.blog.post.readingTime.plurals', + description: + 'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)', + message: 'One min read|{readingTime} min read', + }, + {readingTime}, + ), + ); + }; +} +function ReadingTime({readingTime}) { + const readingTimePlural = useReadingTimePlural(); + return <>{readingTimePlural(readingTime)}; +} +function Date({date, formattedDate}) { + return ( + + ); +} +function Spacer() { + return <>{' · '}; +} +export default function BlogPostItemHeaderInfo({className}) { + const {metadata} = useBlogPost(); + const {date, formattedDate, readingTime} = metadata; + return ( +
+ + {typeof readingTime !== 'undefined' && ( + <> + + + + )} +
+ ); +} diff --git a/src/theme/BlogPostItem/Header/Info/styles.module.css b/src/theme/BlogPostItem/Header/Info/styles.module.css new file mode 100644 index 0000000000..27d569e089 --- /dev/null +++ b/src/theme/BlogPostItem/Header/Info/styles.module.css @@ -0,0 +1,3 @@ +.container { + font-size: 0.9rem; +} diff --git a/src/theme/BlogPostItem/Header/Title/index.js b/src/theme/BlogPostItem/Header/Title/index.js new file mode 100644 index 0000000000..d939260ab6 --- /dev/null +++ b/src/theme/BlogPostItem/Header/Title/index.js @@ -0,0 +1,21 @@ +import React from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import {useBlogPost} from '@docusaurus/theme-common/internal'; +import styles from './styles.module.css'; +export default function BlogPostItemHeaderTitle({className}) { + const {metadata, isBlogPostPage} = useBlogPost(); + const {permalink, title} = metadata; + const TitleHeading = isBlogPostPage ? 'h1' : 'h2'; + return ( + + {isBlogPostPage ? ( + title + ) : ( + + {title} + + )} + + ); +} diff --git a/src/theme/BlogPostItem/Header/Title/styles.module.css b/src/theme/BlogPostItem/Header/Title/styles.module.css new file mode 100644 index 0000000000..04a8d6adcb --- /dev/null +++ b/src/theme/BlogPostItem/Header/Title/styles.module.css @@ -0,0 +1,12 @@ +.title { + font-size: 3rem; +} + +/** + Blog post title should be smaller on smaller devices +**/ +@media (max-width: 576px) { + .title { + font-size: 2rem; + } +} diff --git a/src/theme/BlogPostItem/Header/index.js b/src/theme/BlogPostItem/Header/index.js new file mode 100644 index 0000000000..7d80febbe6 --- /dev/null +++ b/src/theme/BlogPostItem/Header/index.js @@ -0,0 +1,11 @@ +import React from 'react'; +import BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title'; +import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info'; +export default function BlogPostItemHeader() { + return ( +
+ + +
+ ); +} diff --git a/src/theme/BlogPostItem/index.js b/src/theme/BlogPostItem/index.js new file mode 100644 index 0000000000..3c26f45b1a --- /dev/null +++ b/src/theme/BlogPostItem/index.js @@ -0,0 +1,109 @@ +import React from "react"; +import Link from "@docusaurus/Link"; +import { useBlogPost } from "@docusaurus/theme-common/internal"; +import BlogPostItemContainer from "@theme/BlogPostItem/Container"; + +import { Date } from "@site/src/components/blog/common/date"; +import clsx from "clsx"; + +export default function BlogPostItem({ className }) { + const { metadata } = useBlogPost(); + const { + permalink, + title, + date, + formattedDate, + frontMatter, + description, + tags, + } = metadata; + + const author = metadata.authors[0]; + + return ( + +
+ +
+ {title} +
+ +
+
+
+ {tags.map((tag) => ( + + {tag.label} + + ))} +
+
+ +
+ {title} +
+ +
+ {description} +
+
+ +
+ + + +
+
+
+ ); +} diff --git a/src/theme/BlogPostItems/index.js b/src/theme/BlogPostItems/index.js new file mode 100644 index 0000000000..493fcb5685 --- /dev/null +++ b/src/theme/BlogPostItems/index.js @@ -0,0 +1,95 @@ +import React from "react"; +import { BlogPostProvider } from "@docusaurus/theme-common/internal"; +import TagsList from "@theme/TagsList"; + +import BlogPostItem from "@theme/BlogPostItem"; +import clsx from "clsx"; + +export default function BlogPostItems({ + items, + tags, + component: BlogPostItemComponent = BlogPostItem, + isAuthorPage, + isTagsPage, +}) { + return ( +
+ {!isAuthorPage && !isTagsPage && ( + <> +
+

+ All Posts +

+

+ refine technical blog - a resource for + refine, front-end ecosystem, and web development. + Here, we publish insightful articles that demystify + complex concepts, explore new trends, and provide + helpful tips to enhance your coding journey. +

+
+ + + )} + +
+ {items.map(({ content: BlogPostContent }) => ( + + + + + + ))} +
+
+ ); +} diff --git a/src/theme/BlogPostPage/Metadata/index.js b/src/theme/BlogPostPage/Metadata/index.js new file mode 100644 index 0000000000..35c6d60777 --- /dev/null +++ b/src/theme/BlogPostPage/Metadata/index.js @@ -0,0 +1,35 @@ +import React from 'react'; +import {PageMetadata} from '@docusaurus/theme-common'; +import {useBlogPost} from '@docusaurus/theme-common/internal'; +export default function BlogPostPageMetadata() { + const {assets, metadata} = useBlogPost(); + const {title, description, date, tags, authors, frontMatter} = metadata; + const {keywords} = frontMatter; + const image = assets.image ?? frontMatter.image; + return ( + + + + {/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */} + {authors.some((author) => author.url) && ( + author.url) + .filter(Boolean) + .join(',')} + /> + )} + {tags.length > 0 && ( + tag.label).join(',')} + /> + )} + + ); +} diff --git a/src/theme/BlogPostPage/index.js b/src/theme/BlogPostPage/index.js new file mode 100644 index 0000000000..37055eaac5 --- /dev/null +++ b/src/theme/BlogPostPage/index.js @@ -0,0 +1,42 @@ +import React from 'react'; +import clsx from 'clsx'; +import { HtmlClassNameProvider, ThemeClassNames } from '@docusaurus/theme-common'; +import { BlogPostProvider, useBlogPost } from '@docusaurus/theme-common/internal'; +import BlogLayout from '@theme/BlogLayout'; +import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata'; +import { BlogTOC } from "../../ILLATheme/BlogTOC" +import { BlogPostPageView } from "../../components/blog/PostPage"; +import { PostPaginator } from "../../components/blog/PostPaginator"; + + +function BlogPostPageContent({ children }) { + const { metadata, toc } = useBlogPost(); + const { relatedPosts } = metadata; + + return ( + + }> + {children} + + + ); +} +export default function BlogPostPage(props) { + const BlogPostContent = props.content; + return ( + + + + + + + + + ); +} diff --git a/src/theme/NavbarItem/DropdownNavbarItem/index.js b/src/theme/NavbarItem/DropdownNavbarItem/index.js new file mode 100644 index 0000000000..9e50743a97 --- /dev/null +++ b/src/theme/NavbarItem/DropdownNavbarItem/index.js @@ -0,0 +1,143 @@ +import React, {useState, useRef, useEffect} from 'react'; +import clsx from 'clsx'; +import { + isRegexpStringMatch, + useCollapsible, + Collapsible, +} from '@docusaurus/theme-common'; +import {isSamePath, useLocalPathname} from '@docusaurus/theme-common/internal'; +import NavbarNavLink from '@theme/NavbarItem/NavbarNavLink'; +import NavbarItem from '@theme/NavbarItem'; +import styles from './styles.module.css'; +function isItemActive(item, localPathname) { + if (isSamePath(item.to, localPathname)) { + return true; + } + if (isRegexpStringMatch(item.activeBaseRegex, localPathname)) { + return true; + } + if (item.activeBasePath && localPathname.startsWith(item.activeBasePath)) { + return true; + } + return false; +} +function containsActiveItems(items, localPathname) { + return items.some((item) => isItemActive(item, localPathname)); +} +function DropdownNavbarItemDesktop({ + items, + position, + className, + onClick, + ...props +}) { + const dropdownRef = useRef(null); + const [showDropdown, setShowDropdown] = useState(false); + useEffect(() => { + const handleClickOutside = (event) => { + if (!dropdownRef.current || dropdownRef.current.contains(event.target)) { + return; + } + setShowDropdown(false); + }; + document.addEventListener('mousedown', handleClickOutside); + document.addEventListener('touchstart', handleClickOutside); + document.addEventListener('focusin', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + document.removeEventListener('touchstart', handleClickOutside); + document.removeEventListener('focusin', handleClickOutside); + }; + }, [dropdownRef]); + return ( +
+ e.preventDefault()} + onKeyDown={(e) => { + if (e.key === 'Enter') { + e.preventDefault(); + setShowDropdown(!showDropdown); + } + }}> + {props.children ?? props.label} + +
    + {items.map((childItemProps, i) => ( + + ))} +
+
+ ); +} +function DropdownNavbarItemMobile({ + items, + className, + position, // Need to destructure position from props so that it doesn't get passed on. + onClick, + ...props +}) { + const localPathname = useLocalPathname(); + const containsActive = containsActiveItems(items, localPathname); + const {collapsed, toggleCollapsed, setCollapsed} = useCollapsible({ + initialState: () => !containsActive, + }); + // Expand/collapse if any item active after a navigation + useEffect(() => { + if (containsActive) { + setCollapsed(!containsActive); + } + }, [localPathname, containsActive, setCollapsed]); + return ( +
  • + { + e.preventDefault(); + toggleCollapsed(); + }}> + {props.children ?? props.label} + + + {items.map((childItemProps, i) => ( + + ))} + +
  • + ); +} +export default function DropdownNavbarItem({mobile = false, ...props}) { + const Comp = mobile ? DropdownNavbarItemMobile : DropdownNavbarItemDesktop; + return ; +} diff --git a/src/theme/NavbarItem/DropdownNavbarItem/styles.module.css b/src/theme/NavbarItem/DropdownNavbarItem/styles.module.css new file mode 100644 index 0000000000..121c956c68 --- /dev/null +++ b/src/theme/NavbarItem/DropdownNavbarItem/styles.module.css @@ -0,0 +1,6 @@ +.dropdownNavbarItemMobile { + cursor: pointer; + &::after { + margin-left: 8px; + } +} diff --git a/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.js b/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.js new file mode 100644 index 0000000000..f2c44bf47a --- /dev/null +++ b/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.js @@ -0,0 +1,62 @@ +import React from 'react'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import { useAlternatePageUtils } from '@docusaurus/theme-common/internal'; +import { useLocation } from '@docusaurus/router'; +import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; +import IconLanguage from '@theme/Icon/Language'; +import styles from './styles.module.css'; + +export default function LocaleDropdownNavbarItem({ + mobile, + dropdownItemsBefore, + dropdownItemsAfter, + queryString = '', + ...props +}) { + const { + i18n: { currentLocale, locales, localeConfigs }, + } = useDocusaurusContext(); + const alternatePageUtils = useAlternatePageUtils(); + const { search, hash } = useLocation(); + const localeItems = locales.map((locale) => { + const baseTo = `pathname://${alternatePageUtils.createUrl({ + locale, + fullyQualified: false, + })}`; + // preserve ?search#hash suffix on locale switches + const to = `${baseTo}${search}${hash}${queryString}`; + + return { + label: localeConfigs[locale].label, + lang: localeConfigs[locale].htmlLang, + to, + target: '_self', + autoAddBaseUrl: false, + className: + // eslint-disable-next-line no-nested-ternary + locale === currentLocale + ? // Similar idea as DefaultNavbarItem: select the right Infima active + // class name. This cannot be substituted with isActive, because the + // target URLs contain `pathname://` and therefore are not NavLinks! + mobile + ? 'menu__link--active' + : 'dropdown__link--active' + : '', + }; + }); + const items = [...dropdownItemsBefore, ...localeItems, ...dropdownItemsAfter]; + + return ( + + + {localeConfigs[currentLocale].label} + + } + items={items} + /> + ); +} diff --git a/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css b/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css new file mode 100644 index 0000000000..923a485c05 --- /dev/null +++ b/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css @@ -0,0 +1,5 @@ +.iconLanguage { + vertical-align: text-bottom; + margin-right: 5px; + display: inline-block; +} diff --git a/src/theme/Tag/index.js b/src/theme/Tag/index.js new file mode 100644 index 0000000000..10fc7861db --- /dev/null +++ b/src/theme/Tag/index.js @@ -0,0 +1,24 @@ +import React from "react"; +import clsx from "clsx"; +import Link from "@docusaurus/Link"; + +export default function Tag({ permalink, label, isActive }) { + return ( + + {label} + + ); +} diff --git a/src/theme/TagsList/index.tsx b/src/theme/TagsList/index.tsx new file mode 100644 index 0000000000..697143f5df --- /dev/null +++ b/src/theme/TagsList/index.tsx @@ -0,0 +1,210 @@ +import React from 'react'; +import Tag from '@theme/Tag'; +import { titleCase } from 'title-case'; +import clsx from 'clsx'; +import { Disclosure, Transition } from '@headlessui/react'; + +const ChevronDownIcon = () => ( + + + +); + +const mapLabel = (label) => { + // remove `-` + label = label.replace(/-/g, ' '); + + // replace + const replace = [ + ['typescript', 'TypeScript'], + ['javascript', 'JavaScript'], + ['chakra ui', 'Chakra UI'], + ['material ui', 'Material UI'], + ['nextjs', 'Next.js'], + ['nestjs', 'NestJS'], + ['css', 'CSS'], + ]; + + replace.forEach((element) => { + label = label.replace(element[0], element[1]); + }); + + // title case + return titleCase(label); +}; + +const Desktop = ({ + tags, + collapsed, + onShowMoreClick, +}: { + tags: any; + collapsed: boolean; + onShowMoreClick: (collapsed: boolean) => void; +}) => { + return ( +
    +
      + {tags.map((tag) => ( +
    • + +
    • + ))} +
    + +
    + ); +}; + +const Mobile = ({ tags }: { tags: any }) => { + return ( +
    + + {({ open }) => ( +
    + + {/* */} + + Blog Post Tags + + + + +
      + {tags.map((tag) => ( +
    • + +
    • + ))} +
    +
    +
    +
    + )} +
    +
    + ); +}; + +export default function TagsList({ tags }) { + const [collapsed, setCollapsed] = React.useState(true); + const priorityTags = [ + 'refine', + 'react', + 'nextjs', + 'typescript', + 'tutorial', + 'material-ui', + 'ant-design', + 'docker', + 'comparison', + ]; + + const sortedTags = (tags ?? []).sort((a, b) => { + const aIndex = priorityTags.indexOf(a.label); + const bIndex = priorityTags.indexOf(b.label); + + if (aIndex === -1) { + return bIndex === -1 ? 0 : 1; + } else { + return bIndex === -1 ? -1 : aIndex - bIndex; + } + }); + + return ( + <> + setCollapsed(collapsed)} + /> + + + ); +} diff --git a/src/utils/gtag.ts b/src/utils/gtag.ts new file mode 100644 index 0000000000..094f0748c9 --- /dev/null +++ b/src/utils/gtag.ts @@ -0,0 +1,21 @@ +type SendTagEventParams = { + action: string; + category?: string; + label?: string; + value?: string; +}; + +export const sendTagEvent = ({ + action, + category, + label, + value, +}: SendTagEventParams) => { + if (typeof window !== 'undefined' && 'gtag' in window) { + window.gtag('event', action, { + event_category: category, + event_label: label, + value: value, + }); + } +}; diff --git a/static/.nojekyll b/static/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/img/docusaurus-social-card.jpg b/static/img/docusaurus-social-card.jpg new file mode 100644 index 0000000000..ffcb448210 Binary files /dev/null and b/static/img/docusaurus-social-card.jpg differ diff --git a/static/img/docusaurus.png b/static/img/docusaurus.png new file mode 100644 index 0000000000..f458149e3c Binary files /dev/null and b/static/img/docusaurus.png differ diff --git a/static/img/favicon.ico b/static/img/favicon.ico new file mode 100644 index 0000000000..c01d54bcd3 Binary files /dev/null and b/static/img/favicon.ico differ diff --git a/static/img/home3/bannerBg.mp4 b/static/img/home3/bannerBg.mp4 new file mode 100644 index 0000000000..fdbc915cbf Binary files /dev/null and b/static/img/home3/bannerBg.mp4 differ diff --git a/static/img/home3/bannerBg.svg b/static/img/home3/bannerBg.svg new file mode 100644 index 0000000000..46d89f6057 --- /dev/null +++ b/static/img/home3/bannerBg.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/home3/joinItem.svg b/static/img/home3/joinItem.svg new file mode 100644 index 0000000000..fa3a46855a --- /dev/null +++ b/static/img/home3/joinItem.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/home3/quote.svg b/static/img/home3/quote.svg new file mode 100644 index 0000000000..0e9ba7d47e --- /dev/null +++ b/static/img/home3/quote.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/home3/vs.svg b/static/img/home3/vs.svg new file mode 100644 index 0000000000..46d2221336 --- /dev/null +++ b/static/img/home3/vs.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/img/logo.svg b/static/img/logo.svg new file mode 100644 index 0000000000..936fd29968 --- /dev/null +++ b/static/img/logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/public/arrow.svg b/static/img/public/arrow.svg new file mode 100644 index 0000000000..927c308037 --- /dev/null +++ b/static/img/public/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/public/close.svg b/static/img/public/close.svg new file mode 100644 index 0000000000..c49bb43767 --- /dev/null +++ b/static/img/public/close.svg @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/static/img/public/discord.svg b/static/img/public/discord.svg new file mode 100644 index 0000000000..6fbb6bc3aa --- /dev/null +++ b/static/img/public/discord.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/public/github.svg b/static/img/public/github.svg new file mode 100644 index 0000000000..6a9174d3f1 --- /dev/null +++ b/static/img/public/github.svg @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/static/img/public/grayGithub.svg b/static/img/public/grayGithub.svg new file mode 100644 index 0000000000..256cc25399 --- /dev/null +++ b/static/img/public/grayGithub.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/static/img/public/linearDiscord.svg b/static/img/public/linearDiscord.svg new file mode 100644 index 0000000000..a4560deec0 --- /dev/null +++ b/static/img/public/linearDiscord.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/public/linearGithub.svg b/static/img/public/linearGithub.svg new file mode 100644 index 0000000000..096bccf048 --- /dev/null +++ b/static/img/public/linearGithub.svg @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/static/img/public/linkedin.svg b/static/img/public/linkedin.svg new file mode 100644 index 0000000000..e5b09728a6 --- /dev/null +++ b/static/img/public/linkedin.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/static/img/public/menu.svg b/static/img/public/menu.svg new file mode 100644 index 0000000000..c8cef9e91b --- /dev/null +++ b/static/img/public/menu.svg @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/static/img/public/productHunt.svg b/static/img/public/productHunt.svg new file mode 100644 index 0000000000..0182108994 --- /dev/null +++ b/static/img/public/productHunt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/public/twitter.svg b/static/img/public/twitter.svg new file mode 100644 index 0000000000..e771dcc040 --- /dev/null +++ b/static/img/public/twitter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/public/vector.svg b/static/img/public/vector.svg new file mode 100644 index 0000000000..3f41c2abf8 --- /dev/null +++ b/static/img/public/vector.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/img/undraw_docusaurus_mountain.svg b/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 0000000000..af961c49a8 --- /dev/null +++ b/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/undraw_docusaurus_react.svg b/static/img/undraw_docusaurus_react.svg new file mode 100644 index 0000000000..94b5cf08f8 --- /dev/null +++ b/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/undraw_docusaurus_tree.svg b/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 0000000000..d9161d3392 --- /dev/null +++ b/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/whiteLogo.svg b/static/img/whiteLogo.svg new file mode 100644 index 0000000000..2b59807a50 --- /dev/null +++ b/static/img/whiteLogo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000000..d56f4c0401 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,680 @@ +const defaultTheme = require("tailwindcss/defaultTheme"); +const plugin = require("tailwindcss/plugin"); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class", '[data-theme="dark"]'], + content: ["./src/**/*.{js,jsx,ts,tsx}", "./docs/**/*.{md,mdx,tsx}"], + jit: true, + theme: { + extend: { + zIndex: { + modal: 100, + }, + colors: { + discord: "#5865F2", + twitter: "#00AAEC", + refine: { + red: "#FF4C4D", + orange: "#FF9933", + yellow: "#FFBF00", + green: "#1FAD66", + "green-alt": "#26D97F", + cyan: "#0FBDBD", + "cyan-alt": "#47EBEB", + blue: "#0080FF", + "blue-alt": "#6EB3F7", + indigo: "#3333FF", + "indigo-alt": "#8080FF", + purple: "#8000FF", + "purple-alt": "#B366FF", + pink: "#ED5EC9", + bg: "#0A0A29", + kdb: "#DBDBF0", + "bg-alt": "#262640", + "link-dark": "#6EB3F7", + "link-light": "#0080FF", + "landing-tile-icon-border": "#4D4DB2", + "landing-playground-border": "#4D4DB2", + "landing-tile-image-border": "#272762", + "landing-stats-fallback-bg": "#242442", + "landing-footer-bg": "#0F0F3D", + "landing-footer-border": "#2E2E78", + "walkthrough-button-bg": "#4D4DB2", + "walkthrough-button-alt-bg": "#474E6B", + "pricing-table-alt-dark": "#181927", + "pricing-table-alt": "#F4F8FB", + "enterprise-table-alt-dark": "#1D1E30", + "enterprise-table-alt": "#F4F8FB", + }, + gray: { + 0: "#FFFFFF", + 50: "#F4F8FB", + 100: "#EDF2F7", + 200: "#DEE5ED", + 300: "#CFD7E2", + 400: "#A3ADC2", + 450: "#808080", + 500: "#6C7793", + 600: "#474E6B", + 700: "#303450", + 800: "#1D1E30", + 900: "#14141F", + 1000: "#000000", + }, + + 'white-01': '#ffffffff', + 'white-02': '#ffffffe6', + 'white-03': '#ffffffc0', + 'white-04': '#ffffff80', + 'white-05': '#ffffff4c', + 'white-06': '#fff3', + 'white-07': '#ffffff28', + 'white-08': '#ffffff1e', + 'white-09': '#ffffff19', + + 'gray-01': '#000000ff', + 'gray-02': '#1f1f1fff', + 'gray-03': '#5c5c5cff', + 'gray-04': '#999999ff', + 'gray-05': '#c2c2c2ff', + 'gray-06': '#d6d6d6ff', + 'gray-07': '#e0e0e0ff', + 'gray-08': '#ebebebff', + 'gray-09': '#f5f5f5ff', + + 'garyBlue-01': '#0b0c0fff', + 'garyBlue-02': '#1d2129ff', + 'garyBlue-03': '#787e85ff', + 'garyBlue-04': '#a9aeb8ff', + 'garyBlue-05': '#bbc0c9ff', + 'garyBlue-06': '#c9cdd4ff', + 'garyBlue-07': '#dadee5ff', + 'garyBlue-08': '#e5e6ebff', + 'garyBlue-09': '#f2f3f5ff', + + 'tech-purple-n-01': '#100974', + 'tech-purple-01': '#26189c', + 'tech-purple-02': '#422ec4', + 'tech-purple-03': '#654aec', + 'tech-purple-04': '#8368f0', + 'tech-purple-05': '#a087f4', + 'tech-purple-06': '#bca6f7', + 'tech-purple-07': '#d6c7fb', + 'tech-purple-08': '#f0e8ff', + + 'tech-pink-n-01': '#790a5a', + 'tech-pink-01': '#a61d7a', + 'tech-pink-02': '#d2369c', + 'tech-pink-03': '#ff58be', + 'tech-pink-04': '#ff75c5', + 'tech-pink-05': '#ff92ce', + 'tech-pink-06': '#ffaed8', + 'tech-pink-07': '#ffcbe4', + 'tech-pink-08': '#ffe8f2', + + 'blackAlpha-01': 'rgba(0, 0, 0, 0.88)', + 'blackAlpha-02': 'rgba(0, 0, 0, 0.64)', + 'blackAlpha-03': 'rgba(0, 0, 0, 0.4)', + 'blackAlpha-04': 'rgba(0, 0, 0, 0.24)', + 'blackAlpha-06': 'rgba(0, 0, 0, 0.12)', + 'blackAlpha-05': 'rgba(0, 0, 0, 0.16)', + 'blackAlpha-07': 'rgba(0, 0, 0, 0.08)', + 'blackAlpha-08': 'rgba(0, 0, 0, 0.04)', + + 'blue-n-01': '#042379', + 'blue-01': '#0a39a6', + 'blue-02': '#1353d2', + 'blue-03': '#1e6fff', + 'blue-04': '#4690ff', + 'blue-05': '#6aa1ff', + 'blue-06': '#94bfff', + 'blue-07': '#bedaff', + 'blue-08': '#e8f4ff', + + 'purple-n-01': '#2a0874', + 'purple-01': '#44159b', + 'purple-02': '#6227c3', + 'purple-03': '#863eea', + 'purple-04': '#9f5eee', + 'purple-05': '#b77ff2', + 'purple-06': '#cda1f7', + 'purple-07': '#e2c4fb', + 'purple-08': '#f5e8ff', + + 'red-n-01': '#770813', + 'red-01': '#a1151e', + 'red-02': '#cb272d', + 'red-03': '#f53f3f', + 'red-04': '#f76560', + 'red-05': '#f98981', + 'red-06': '#fbaca3', + 'red-07': '#fdcdc5', + 'red-08': '#ffece8', + + 'green-n-01': '#02672d', + 'green-01': '#048136', + 'green-02': '#079c3e', + 'green-03': '#0bb645', + 'green-04': '#2dc55b', + 'green-05': '#55d376', + 'green-06': '#81e297', + 'green-07': '#b2f0be', + "green-08": "#e8ffec", + + 'yellow-n-01': '#795d00', + 'yellow-01': '#a68501', + 'yellow-02': '#d2b002', + 'yellow-03': '#f8b804', + 'yellow-04': '#ffea32', + 'yellow-05': '#fff45f', + 'yellow-06': '#fffb8d', + 'yellow-07': '#ffffba', + 'yellow-08': '#fdffd6', + + 'orange-n-01': '#792e00', + 'orange-01': '#a64500', + 'orange-02': '#d25f00', + 'orange-03': '#ff7d00', + 'orange-04': '#ff9a2e', + 'orange-05': '#ffb65d', + 'orange-06': '#ffcf8b', + 'orange-07': '#ffe4ba', + 'orange-08': '#fff7e8', + + "cyan-n-01": "#045677", + "cyan-01": "#0c7ca1", + "cyan-02": "#16a4cc", + "cyan-03": "#24d1f6", + "cyan-04": "#4adef8", + "cyan-05": "#71eafa", + "cyan-06": "#98f3fb", + "cyan-07": "#c0fafd", + "cyan-08": "#e8ffff", + + "brand-01": "#654aecff", + "brand-02": "#ff58beff", + }, + fontSize: { + xs: '.75rem', + sm: '.875rem', + tiny: '.875rem', + base: '1rem', + lg: '1.125rem', + xl: '1.25rem', + '2xl': '1.5rem', + '3xl': '1.875rem', + '4xl': '2.25rem', + '5xl': '3rem', + '6xl': '5rem', + '7xl': '7rem', + title: '2.5rem', + titleWeb: '5rem', + }, + fontFamily: { + sans: [ + "var(--primary-font-sans)", + ...defaultTheme.fontFamily.sans, + ], + mono: ["Source Code Pro", ...defaultTheme.fontFamily.mono], + montserrat: ["Montserrat", ...defaultTheme.fontFamily.serif], + disket: ["Disket Mono", ...defaultTheme.fontFamily.mono], + inter: ["Inter", ...defaultTheme.fontFamily.serif], + "jetBrains-mono": [ + "JetBrains Mono", + ...defaultTheme.fontFamily.mono, + ], + source: ['Source Sans Pro', ...defaultTheme.fontFamily.sans], + 'ubuntu-mono': ['Ubuntu Mono', ...defaultTheme.fontFamily.mono], + eurostile: ['Eurostile Becker', ...defaultTheme.fontFamily.sans], + jetBrains: ['JetBrains Mono', ...defaultTheme.fontFamily.sans], + }, + dropShadow: { + "showcase-highlight": [ + "0px 3px 7px rgba(108, 119, 147, 0.141)", + + "0px 13px 13px rgba(108, 119, 147, 0.141)", + + "0px 20px 18px rgba(108, 119, 147, 0.18)", + + "0px 34px 21px rgba(108, 119, 147, 0.2)", + "0px 54px 23px rgba(108, 119, 147, 0)", + ], + "github-stars-glow": [ + "0px 0px 3px #FF993330", + "0px 0px 6px #FF9933A0", + "0px 0px 16px #FF9933A0", + "0px 0px 16px #FF9933", + ], + }, + boxShadow: { + modal: "4px 8px 16px rgba(42, 42, 66, 0.25)", + tile: "6px 8px 16px 0 rgba(42, 42, 66, 0.4)", + integrationTile: "3px 4px 8px 0 rgba(42, 42, 66, 0.25)", + tagTile: "3px -2px 8px 0 rgba(42, 42, 66, 0.25)", + startTiles: "4px 8px 16px rgba(42, 42, 66, 0.25)", + menuItem: "2px 4px 8px rgba(36, 36, 54, 0.2)", + "menu-dark": "0px 0px 0px 4px rgba(48, 52, 80, 0.25)", + "menu-light": "0px 0px 0px 4px rgba(222, 229, 237, 0.25)", + "landing-sweet-spot-code-dark": + "0px 2.26915px 2.21381px 0px rgba(0, 0, 0, 0.07), 0px 5.45308px 5.32008px 0px rgba(0, 0, 0, 0.11), 0px 10.26767px 10.01724px 0px rgba(0, 0, 0, 0.13), 0px 18.31577px 17.86905px 0px rgba(0, 0, 0, 0.15), 0px 34.25764px 33.42209px 0px rgba(0, 0, 0, 0.19), 0px 82px 80px 0px rgba(0, 0, 0, 0.26)", + "landing-sweet-spot-code-light": + "0px 2.26915px 2.21381px 0px rgba(0, 0, 0, 0.02), 0px 5.45308px 5.32008px 0px rgba(0, 0, 0, 0.04), 0px 10.26767px 10.01724px 0px rgba(0, 0, 0, 0.04), 0px 18.31577px 17.86905px 0px rgba(0, 0, 0, 0.05), 0px 34.25764px 33.42209px 0px rgba(0, 0, 0, 0.06), 0px 82px 80px 0px rgba(0, 0, 0, 0.09)", + }, + backgroundColor: { + "landing-header-bg": "rgba(10, 10, 41, 0.70)", + "landing-header-border": "rgba(48, 52, 80, 0.70)", + "common-header-bg-dark": "rgba(29, 30, 48, 0.70)", + "common-header-bg-light": "rgba(244, 248, 251, 0.85)", + }, + backdropBlur: { + "header-blur": "12px", + }, + backgroundPosition: { + "landing-wizard-option-right": + "top -350px right -350px, center", + "landing-wizard-option-left": + "bottom -350px left -350px, center", + "landing-wizard-side-left-position": "center left", + "landing-wizard-side-right-position": "center right", + "landing-sweet-spot-glow-position-lg": + "center, calc(50% + 800px) calc(50% - 300px)", + "landing-sweet-spot-glow-position-md": + "center, calc(50% + 490px) calc(50% + 180px)", + "landing-sweet-spot-glow-position-xs": + "center, calc(50% - 30px) calc(50% + 300px)", + "wheel-already-invented-position": "center", + }, + backgroundSize: { + "landing-wizard-option": "600px 600px, auto", + "landing-wizard-side-size": "512px 512px", + "landing-sweet-spot-glow-size-lg": "auto auto, 1600px 1600px", + "landing-sweet-spot-glow-size-xs": "auto auto, 656px 656px", + "wheel-already-invented-size": "100% 1px", + "landing-github-stars-border-bg-size": "72px 72px", + }, + animation: { + "spin-slow": "spin 3s linear infinite", + beat: "2s ease-in-out 1.5s infinite normal forwards running landing-hero-beat", + "playground-slide-down": + "playground-slide-down 45s linear infinite", + "playground-slide-down-mobile": + "playground-slide-down-mobile 45s linear infinite", + "playground-slide-up": + "playground-slide-up 45s linear infinite", + "playground-slide-up-mobile": + "playground-slide-up-mobile 45s linear infinite", + "hackathon-button-bg": + "hackathon-button-bg 2s ease-in-out infinite alternate", + "walkthrough-bounce": + "walkthrough-bounce 3s ease-in-out infinite", + "top-announcement-glow": + "top-announcement-glow 1s ease-in-out infinite alternate", + "landing-hero-grid-beats": + "landing-hero-grid-beats 2s ease-in-out infinite", + "hero-logo-pulse": "hero-logo-pulse 4s ease-in-out infinite", + "mini-bounce": "mini-bounce 3s ease-in-out infinite", + "dot-waves": "dot-waves 2.5s linear infinite", + "landing-packages-left": + "landing-packages-left 65s linear infinite", + "landing-packages-right": + "landing-packages-right 60s linear infinite", + "code-scroll": "code-scroll 25s linear infinite", + "beam-spin": "beam-spin 3s linear 1 forwards", + "landing-hero-beam-line": + "landing-hero-beam-line 7.5s ease-in-out infinite", + "landing-hero-beam-glow": + "landing-hero-beam-glow 7.5s ease-in-out infinite", + "landing-hero-beam-bottom": + "landing-hero-beam-bottom 7.5s ease-in-out infinite", + "showcase-bottom-fade-reveal": + "showcase-bottom-fade-reveal 0.3s ease-in-out forwards", + "opacity-reveal": "opacity-reveal 1s ease-in-out forwards", + "wheel-already-invented-reveal": + "wheel-already-invented-reveal 0.6s cubic-bezier(.23,.95,.64,1.24) forwards", + "showcase-reveal": "showcase-reveal 0.3s ease-in-out forwards", + "github-stars-border": + "github-stars-border 10s linear infinite alternate", + "github-stars-glow": + "github-stars-glow 10s linear infinite alternate", + "enterprise-iam-services-left": + "enterprise-iam-services-left 40s linear infinite", + "enterprise-iam-services-right": + "enterprise-iam-services-right 40s linear infinite", + "enterprise-data-source-left": + "enterprise-data-source-left 25s linear infinite", + "enterprise-data-source-right": + "enterprise-data-source-right 25s linear infinite", + "enterprise-table-left-to-right": + "enterprise-table-left-to-right 0.3s ease-in-out forwards", + "enterprise-table-right-to-left": + "enterprise-table-right-to-left 0.3s ease-in-out forwards", + "new-badge-border": "new-badge-border 4s linear infinite", + reveal: "reveal 0.3s ease-in-out forwards", + }, + keyframes: { + reveal: { + "0%": { + opacity: 0, + }, + "100%": { + opacity: 1, + }, + }, + "code-scroll": { + "0%": { + transform: "translateY(0)", + }, + "100%": { + transform: "translateY(-448px)", + }, + }, + "walkthrough-bounce": { + "0%": { + transform: "translateY(4%)", + }, + "50%": { + transform: "none", + }, + "100%": { + transform: "translateY(4%)", + }, + }, + "hackathon-button-bg": { + "0%": { + backgroundPosition: "0% 0%", + }, + "100%": { + backgroundPosition: "100% 0%", + }, + }, + "landing-hero-beat": { + "0%": { + opacity: 0.4, + }, + "5%": { + opacity: 0.4, + }, + "50%": { + opacity: 1, + }, + "95%": { + opacity: 0.4, + }, + "100%": { + opacity: 0.4, + }, + }, + "playground-slide-down-mobile": { + "0%": { + transform: "translateY(0px)", + }, + "99.99%": { + transform: "translateY(-1655px)", + }, + "100%": { + transform: "translateY(0px)", + }, + }, + "playground-slide-down": { + "0%": { + transform: "translateY(0px)", + }, + "99.99%": { + transform: "translateY(-3329px)", + }, + "100%": { + transform: "translateY(0px)", + }, + }, + "playground-slide-up-mobile": { + "0%": { + transform: "translateY(-1655px)", + }, + "99.99%": { + transform: "translateY(0px)", + }, + "100%": { + transform: "translateY(-1655px)", + }, + }, + "playground-slide-up": { + "0%": { + transform: "translateY(-3328px)", + }, + "99.99%": { + transform: "translateY(0px)", + }, + "100%": { + transform: "translateY(-3328px)", + }, + }, + "top-announcement-glow": { + "0%": { + opacity: 1, + }, + "100%": { + opacity: 0, + }, + }, + "landing-hero-grid-beats": { + "0%": { + fillOpacity: 0, + }, + "50%": { + fillOpacity: 0.8, + }, + "100%": { + fillOpacity: 0, + }, + }, + "hero-logo-pulse": { + "0%": { + fillOpacity: 1, + }, + "50%": { + fillOpacity: 0.75, + }, + "100%": { + fillOpacity: 1, + }, + }, + "mini-bounce": { + "0%": { + transform: "translateY(0%)", + }, + "50%": { + transform: "translateY(-8%)", + }, + "100%": { + transform: "translateY(0%)", + }, + }, + "dot-waves": { + "0%": { + transform: "scale(0)", + opacity: 1, + }, + "75%": { + transform: "scale(2)", + opacity: 0, + }, + "100%": { + transform: "scale(0)", + opacity: 0, + }, + }, + "landing-packages-left": { + "0%": { transform: "translateX(0)" }, + "100%": { transform: "translateX(-50%)" }, + }, + "landing-packages-right": { + "0%": { transform: "translateX(0)" }, + "100%": { transform: "translateX(50%)" }, + }, + "beam-spin": { + "0%": { + transform: + "translateX(-45px) translateY(-190px) translateZ(0) rotate(0deg)", + }, + "100%": { + transform: + "translateX(-45px) translateY(-190px) translateZ(0) rotate(-360deg)", + }, + }, + "landing-hero-beam-line": { + "0%": { + opacity: 1, + }, + "50%": { + opacity: 0.5, + }, + "100%": { + opacity: 1, + }, + }, + "landing-hero-beam-glow": { + "0%": { + opacity: 1, + }, + "50%": { + opacity: 0.25, + }, + "100%": { + opacity: 1, + }, + }, + "landing-hero-beam-bottom": { + "0%": { + opacity: 1, + transform: "scaleX(1)", + }, + "50%": { + opacity: 0.5, + transform: "scaleX(0.5)", + }, + "100%": { + opacity: 1, + transform: "scaleX(1)", + }, + }, + "showcase-bottom-fade-reveal": { + "0%": { + opacity: 0, + transform: "translateY(96px)", + }, + "100%": { + opacity: 1, + transform: "translateY(0)", + }, + }, + "opacity-reveal": { + "0%": { + opacity: 0, + }, + "100%": { + opacity: 1, + }, + }, + "wheel-already-invented-reveal": { + "0%": {}, + "100%": { + transform: "translateX(0)", + }, + }, + "showcase-reveal": { + "0%": { + // transform: "translateY(-100px)", + opacity: 0, + }, + "100%": { + transform: "translateY(0)", + opacity: 1, + }, + }, + "github-stars-border": { + "0%": { + transform: "translateX(-72px)", + }, + "100%": { + transform: "translateX(216px)", + }, + }, + + "github-stars-glow": { + "0%": { + transform: "translateX(0) scale(0.5)", + }, + "50%": { + transform: "translateX(78px) scale(1)", + }, + "100%": { + transform: "translateX(156px) scale(0.5)", + }, + }, + "enterprise-iam-services-left": { + "0%": { transform: "translateX(0)" }, + "100%": { transform: "translateX(-50%)" }, + }, + "enterprise-iam-services-right": { + "0%": { transform: "translateX(0)" }, + "100%": { transform: "translateX(50%)" }, + }, + "enterprise-data-source-left": { + "0%": { transform: "translateX(0)" }, + "100%": { transform: "translateX(-50%)" }, + }, + "enterprise-data-source-right": { + "0%": { transform: "translateX(0)" }, + "100%": { transform: "translateX(50%)" }, + }, + "enterprise-table-left-to-right": { + "0%": { transform: "translateX(-100%)", opacity: 0 }, + "100%": { transform: "translateX(0)", opacity: 1 }, + }, + "enterprise-table-right-to-left": { + "0%": { transform: "translateX(100%)", opacity: 0 }, + "100%": { transform: "translateX(0)", opacity: 1 }, + }, + "new-badge-border": { + "0%": { transform: "rotate(0deg)" }, + "100%": { transform: "rotate(360deg)" }, + }, + }, + }, + screens: { + ...defaultTheme.screens, + "content-sm": "480px", + "content-md": "656px", + "content-2xl": "864px", + "content-4xl": "1536px", + "header-sm": "640px", + "header-md": "1200px", + "landing-content": "944px", + "landing-xs": "360px", + "landing-sm": "720px", + "landing-md": "960px", + "landing-lg": "1296px", + "landing-xl": "1440px", + "landing-footer": "1264px", + "pricing-content-sm": "640px", + "pricing-content": "960px", + "blog-sm": "688px", + "blog-md": "1000px", + "blog-lg": "1280px", + "blog-max": "1408px", + "blog-xl": "1440px", + "blog-2xl": "1584px", + walkthrough: "976px", + }, + }, + plugins: [ + require("@tailwindcss/typography"), + plugin(({ addVariant }) => { + addVariant("light", `[data-theme="light"] &`); + }), + ], + corePlugins: { + // preflight: false, + }, +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..b796ade8e0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": ".", + "types": ["@types/gtag.js"] + } +}