diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..b9e1e2ce1 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,16 @@ +{ + "name": "WPF UI Docs Dev Container", + "image": "mcr.microsoft.com/dotnet/sdk:9.0", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "20" + } + }, + "postCreateCommand": "./.devcontainer/post-create.sh", + "forwardPorts": [ + 8080 + ], + "remoteEnv": { + "NODE_ENV": "development" + } +} diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100755 index 000000000..4be12f03e --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +apt-get update +apt-get install -y openssh-client + +cd docs/templates +npm ci +npm run build +dotnet tool install -g docfx + +export PATH="$PATH:/root/.dotnet/tools" + +cd ../ +docfx docfx.json --serve diff --git a/.editorconfig b/.editorconfig index 38c62724d..301fb13a8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -50,10 +50,10 @@ file_header_template = This Source Code Form is subject to the terms of the MIT #### .NET Coding Conventions #### # this. and Me. preferences -dotnet_style_qualification_for_event = false:warning -dotnet_style_qualification_for_field = false:warning -dotnet_style_qualification_for_method = false:warning -dotnet_style_qualification_for_property = false:warning +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_property = false:silent # Language keywords vs BCL types preferences dotnet_style_predefined_type_for_locals_parameters_members = true:warning @@ -95,8 +95,8 @@ dotnet_style_readonly_field = true:warning # var preferences csharp_style_var_elsewhere = false:warning -csharp_style_var_for_built_in_types = false:warning -csharp_style_var_when_type_is_apparent = false:warning +csharp_style_var_for_built_in_types = false:none +csharp_style_var_when_type_is_apparent = false:none # Expression-bodied members csharp_style_expression_bodied_accessors = false:silent @@ -388,7 +388,7 @@ dotnet_diagnostic.SA1633.severity = none dotnet_diagnostic.SA1634.severity = none dotnet_diagnostic.SA1652.severity = none -dotnet_diagnostic.IDE0009.severity = none + # Additional Stylecop Analyzers dotnet_diagnostic.SA1111.severity = none @@ -397,3 +397,19 @@ dotnet_diagnostic.SA1204.severity = none dotnet_diagnostic.SA1208.severity = none dotnet_diagnostic.SA1518.severity = none dotnet_diagnostic.SA1615.severity = none +dotnet_diagnostic.SA1502.severity = none +dotnet_diagnostic.SA1010.severity = none # Opening square brackets should not be preceded by a space + # conflicts with collection expressions and IDE0028 + +# Suppress some ValueConverter warnings +dotnet_diagnostic.WPF0073.severity = none # Add ValueConversion attribute (unknown types) +dotnet_diagnostic.WPF0071.severity = none # Add ValueConversion attribute +dotnet_diagnostic.WPF0070.severity = none # Add default field to converter + +# Suppress some IDE warnings +dotnet_diagnostic.IDE0290.severity = none # Use primary constructor +dotnet_diagnostic.CS1591.severity = none # Missing XML comment for publicly visible type or member + # 15000+ warnings in the solution +dotnet_diagnostic.CA1510.severity = none # Use ArgumentNullException throw helper + # doesn't work with older versions of .NET + \ No newline at end of file diff --git a/.github/labeler.yml b/.github/labeler.yml index f1ce31c7d..fe74caf9b 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -36,6 +36,10 @@ themes: - changed-files: - any-glob-to-any-file: 'src/Wpf.Ui/Appearance/**' +titlebar: +- changed-files: + - any-glob-to-any-file: 'src/Wpf.Ui/Controls/TitleBar/**' + tray: - changed-files: - any-glob-to-any-file: 'src/Wpf.Ui.Tray/**' diff --git a/.github/workflows/top-issues-dashboard.yml b/.github/workflows/top-issues-dashboard.yml new file mode 100644 index 000000000..f1c3ffbf6 --- /dev/null +++ b/.github/workflows/top-issues-dashboard.yml @@ -0,0 +1,24 @@ +name: wpf-ui-top-issues-dashboard +on: + schedule: + - cron: '0 0 */1 * *' + +jobs: + ShowAndLabelTopIssues: + name: Display and label top issues. + runs-on: ubuntu-latest + steps: + - name: Top Issues action + uses: rickstaa/top-issues-action@v1.3.101 + env: + github_token: ${{ secrets.GITHUB_TOKEN }} + with: + top_list_size: 10 + label: true + dashboard: true + dashboard_show_total_reactions: true + top_issues: true + top_bugs: true + top_features: true + feature_label: feature + top_pull_requests: true diff --git a/.github/workflows/wpf-ui-cd-docs.yaml b/.github/workflows/wpf-ui-cd-docs.yaml index a1abfed1c..1464f4dc6 100644 --- a/.github/workflows/wpf-ui-cd-docs.yaml +++ b/.github/workflows/wpf-ui-cd-docs.yaml @@ -28,15 +28,15 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Setup Pages - uses: actions/configure-pages@v4 + uses: actions/configure-pages@v5 - name: Use Node.js 18.x uses: actions/setup-node@v4 with: node-version: 18.x - - name: Setup .NET Core SDK 8.x + - name: Setup .NET Core SDK 9.x uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.x + dotnet-version: 9.x - name: Install docfx run: dotnet tool update -g docfx diff --git a/.github/workflows/wpf-ui-cd-extension.yaml b/.github/workflows/wpf-ui-cd-extension.yaml index ac179799e..2635972b5 100644 --- a/.github/workflows/wpf-ui-cd-extension.yaml +++ b/.github/workflows/wpf-ui-cd-extension.yaml @@ -3,6 +3,8 @@ name: wpf-ui-cd-extension on: push: branches: [main] + paths: + - 'src/Wpf.Ui.Extension**' workflow_dispatch: @@ -11,7 +13,7 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v4 - - uses: microsoft/setup-msbuild@v1.3 + - uses: microsoft/setup-msbuild@v2 with: msbuild-architecture: x64 - uses: nuget/setup-nuget@v2 @@ -22,9 +24,17 @@ jobs: run: nuget restore Wpf.Ui.sln - name: Build the solution - run: msbuild src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj /t:Rebuild -p:Configuration=Release -p:RestorePackages=false -p:Platform="x64" -p:GITHUB_ACTIONS=True + run: msbuild src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj /t:Rebuild -p:Configuration=Release -p:RestorePackages=false -p:Platform="x64" -p:ProductArchitecture="amd64" -p:GITHUB_ACTIONS=True + + - name: Build the solution + run: msbuild src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj /t:Rebuild -p:Configuration=Release -p:RestorePackages=false -p:Platform="arm64" -p:ProductArchitecture="arm64" -p:GITHUB_ACTIONS=True - uses: actions/upload-artifact@v4 with: - name: wpf-ui-vs22-extension + name: wpf-ui-vs22-extension-x64 path: src\Wpf.Ui.Extension\bin\x64\Release\Wpf.Ui.Extension.vsix + + - uses: actions/upload-artifact@v4 + with: + name: wpf-ui-vs22-extension-arm64 + path: src\Wpf.Ui.Extension\bin\arm64\Release\Wpf.Ui.Extension.vsix diff --git a/.github/workflows/wpf-ui-cd-nuget.yaml b/.github/workflows/wpf-ui-cd-nuget.yaml index 20c957228..de485012d 100644 --- a/.github/workflows/wpf-ui-cd-nuget.yaml +++ b/.github/workflows/wpf-ui-cd-nuget.yaml @@ -2,7 +2,11 @@ name: wpf-ui-cd-nuget on: push: - branches: [main] + branches: + - main + - release/* + paths: + - 'src/**' workflow_dispatch: @@ -11,28 +15,47 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v4 - - uses: microsoft/setup-msbuild@v1.3 + - uses: microsoft/setup-msbuild@v2 with: msbuild-architecture: x64 - uses: nuget/setup-nuget@v2 with: nuget-api-key: ${{ secrets.NUGET_API_KEY }} - - name: Setup .NET Core SDK 8.x + - name: Setup .NET Core SDK 9.x uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.x + dotnet-version: 9.x + + - name: Fetch the certificate + run: | + $signing_keys_payload = [System.Convert]::FromBase64String("${{ secrets.STRONG_NAME_KEY }}") + $currentDirectory = Get-Location + $certificatePath = Join-Path -Path $currentDirectory -ChildPath "src/lepo.snk" + [IO.File]::WriteAllBytes("$certificatePath", $signing_keys_payload) - name: Install dependencies run: dotnet restore - name: Build - run: dotnet build src\Wpf.Ui\Wpf.Ui.csproj --configuration Release --no-restore + run: dotnet build src\Wpf.Ui\Wpf.Ui.csproj --configuration Release --no-restore -p:SourceLinkEnabled=true + + - name: Build + run: dotnet build src\Wpf.Ui.Abstractions\Wpf.Ui.Abstractions.csproj --configuration Release --no-restore -p:SourceLinkEnabled=true - name: Build - run: dotnet build src\Wpf.Ui.Tray\Wpf.Ui.Tray.csproj --configuration Release --no-restore + run: dotnet build src\Wpf.Ui.DependencyInjection\Wpf.Ui.DependencyInjection.csproj --configuration Release --no-restore -p:SourceLinkEnabled=true + + - name: Build + run: dotnet build src\Wpf.Ui.Tray\Wpf.Ui.Tray.csproj --configuration Release --no-restore -p:SourceLinkEnabled=true - name: Publish the package to NuGet.org run: nuget push **\*.nupkg -NonInteractive -SkipDuplicate -Source 'https://api.nuget.org/v3/index.json' - name: Publish the symbols to NuGet.org run: nuget push **\*.snupkg -NonInteractive -SkipDuplicate -Source 'https://api.nuget.org/v3/index.json' + + - name: Upload NuGet packages as artifacts + uses: actions/upload-artifact@v4 + with: + name: nuget-packages + path: '**\*.nupkg' diff --git a/.github/workflows/wpf-ui-lock.yml b/.github/workflows/wpf-ui-lock.yml index 7914cce8f..3cd32bf28 100644 --- a/.github/workflows/wpf-ui-lock.yml +++ b/.github/workflows/wpf-ui-lock.yml @@ -2,19 +2,19 @@ name: wpf-ui-lock on: schedule: - - cron: "0 0 * * *" + - cron: '0 0 * * 0' + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + discussions: write + +concurrency: + group: lock-threads jobs: - lock: + action: runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@v5 - with: - # https://github.com/dessant/lock-threads - github-token: ${{ github.token }} - issue-inactive-days: "90" - exclude-issue-created-before: "" - exclude-any-issue-labels: "keep-unlocked, status:awaiting response" - add-issue-labels: "locked-due-to-inactivity" - issue-comment: "" - issue-lock-reason: "resolved" diff --git a/.github/workflows/wpf-ui-pr-validator.yaml b/.github/workflows/wpf-ui-pr-validator.yaml index c99cd6617..7a641dcac 100644 --- a/.github/workflows/wpf-ui-pr-validator.yaml +++ b/.github/workflows/wpf-ui-pr-validator.yaml @@ -2,9 +2,7 @@ name: wpf-ui-pr-validator on: pull_request: - branches: [development] - push: - branches: [development] + branches: [main] workflow_dispatch: @@ -13,16 +11,16 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v4 - - uses: microsoft/setup-msbuild@v1.3 + - uses: microsoft/setup-msbuild@v2 with: msbuild-architecture: x64 - uses: nuget/setup-nuget@v2 with: nuget-api-key: ${{ secrets.NUGET_API_KEY }} - - name: Setup .NET Core SDK 8.x + - name: Setup .NET Core SDK 9.x uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.x + dotnet-version: 9.x - name: Install dependencies run: dotnet restore diff --git a/.gitignore b/.gitignore index e628c2e8c..30b97c438 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,15 @@ ## files generated by popular Visual Studio add-ons. ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +# Strong Name Key files +src/lepo.snk + # DocFX docs/api/ +# Desktop service store +.DS_Store + # User-specific files *.rsuser *.suo diff --git a/Directory.Build.props b/Directory.Build.props index a46c1bf6c..cf67c770c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,33 +1,29 @@ - - - 3.0.3 - 12.0 - true - - lepo.co - lepo.co - Copyright (C) 2021-2024 Leszek Pomianowski and WPF UI Contributors + $(MSBuildThisFileDirectory) + $(RepositoryDirectory)build\ - net8.0-windows;net7.0-windows;net6.0-windows;net481;net472;net462 + 4.0.0-rc.3 + 4.0.0 - $(Version) - true + lepo.co + lepo.co + WPF-UI + lepoco;toolkit;wpf;fluent;navigation;controls;design;icons;system;accent;theme;winui MIT - https://raw.githubusercontent.com/lepoco/wpfui/main/LICENSE + true + Copyright (C) 2021-2024 Leszek Pomianowski and WPF UI Contributors https://github.com/lepoco/wpfui - https://github.com/lepoco/wpfui + https://github.com/lepoco/wpfui/releases + Icon.png + https://github.com/lepoco/wpfui/main/build/nuget.png main git - WPF UI provides the Fluent experience in your known and loved WPF framework. Intuitive design, themes, navigation and new immersive controls. All natively and effortlessly. - wpf ui wpfui fluent design winui windows controls custom metro modern xaml toolkit color dark theme lepo net6 net5 net - README.md @@ -38,18 +34,48 @@ true - - - + + true + true + + + + true + 13.0 + enable + + + $(NoWarn);CS8500 + + + + $(MSBuildProjectName.Contains('Test')) + False + True + - - - <_Parameter1>$(MSBuildProjectName).UnitTests - - + + + + + true + + true + + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + + + + + + diff --git a/Directory.Build.targets b/Directory.Build.targets index 148d27752..0050b61cd 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,16 +1,66 @@ - - + + true + true + true + true + + + + true + $(RepositoryDirectory)\src\lepo.snk + + + + - - - - - - + + + + + + \ No newline at end of file diff --git a/Directory.Packages.props b/Directory.Packages.props index cddae1f54..46f0814d5 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -2,23 +2,29 @@ - + + + + + - + - - - + + + - - + + + + - + \ No newline at end of file diff --git a/LICENSE b/LICENSE index 2f579bda1..4642df15d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/ +Copyright (c) 2021-2024 Leszek Pomianowski and WPF UI Contributors. https://lepo.co/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/Wpf.Ui/License - Fluent System Icons.txt b/LICENSE.md similarity index 92% rename from src/Wpf.Ui/License - Fluent System Icons.txt rename to LICENSE.md index bc9c36b28..4642df15d 100644 --- a/src/Wpf.Ui/License - Fluent System Icons.txt +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 Microsoft Corporation +Copyright (c) 2021-2024 Leszek Pomianowski and WPF UI Contributors. https://lepo.co/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 9e2eefa6c..23999c102 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ # WPF UI -[Created with ❤ in Poland by lepo.co](https://dev.lepo.co/) -A simple way to make your application written in WPF keep up with modern design trends. Library changes the base elements like `Page`, `ToggleButton` or `List`, and also includes additional controls like `Navigation`, `NumberBox`, `Dialog` or `Snackbar`. +[Created with ❤ in Poland by lepo.co](https://lepo.co/) +WPF UI provides the Fluent experience in your known and loved WPF framework. Intuitive design, themes, navigation and new immersive controls. All natively and effortlessly. Library changes the base elements like `Page`, `ToggleButton` or `List`, and also includes additional controls like `Navigation`, `NumberBox`, `Dialog` or `Snackbar`. [![Discord](https://img.shields.io/discord/1071051348348514375?label=discord)](https://discord.gg/AR9ywDUwGq) [![GitHub license](https://img.shields.io/github/license/lepoco/wpfui)](https://github.com/lepoco/wpfui/blob/master/LICENSE) [![Nuget](https://img.shields.io/nuget/v/WPF-UI)](https://www.nuget.org/packages/WPF-UI/) [![Nuget](https://img.shields.io/nuget/dt/WPF-UI?label=nuget)](https://www.nuget.org/packages/WPF-UI/) [![VS 2022 Downloads](https://img.shields.io/visual-studio-marketplace/i/lepo.WPF-UI?label=vs-2022)](https://marketplace.visualstudio.com/items?itemName=lepo.WPF-UI) [![Sponsors](https://img.shields.io/github/sponsors/lepoco)](https://github.com/sponsors/lepoco) @@ -14,12 +14,19 @@ A simple way to make your application written in WPF keep up with modern design https://bank.gov.ua/en/about/humanitarian-aid-to-ukraine -### Refugees in Poland +![ua](https://user-images.githubusercontent.com/13592821/184498735-d296feb8-0f9b-45df-bc0d-b7f0b6f580ed.png) -Many forms of support for refugees from Ukraine and organizations supporting them are available on the Polish government website -https://pomagamukrainie.gov.pl/chce-pomoc/prywatnie/pomoc-finansowa +## 🛟 Support plans -![ua](https://user-images.githubusercontent.com/13592821/184498735-d296feb8-0f9b-45df-bc0d-b7f0b6f580ed.png) +To ensure you receive the expert guidance you need, we offer a variety of support plans designed to meet the diverse needs of our community. Whether you are looking to modernize your WPF applications or need assistance with our other libraries, our tailored support solutions are here to help. From priority email support to 24/7 dedicated assistance, we provide flexible plans to suit your project requirements. + +[Take a look at the lepo.co support plans](https://lepo.co/support) + +## 🤝 Help us keep working on this project + +Support the development of WPF UI and other innovative projects by becoming a sponsor on GitHub! Your monthly or one-time contributions help us continue to deliver high-quality, open-source solutions that empower developers worldwide. + +[Sponsor WPF UI on GitHub](https://github.com/sponsors/lepoco) ## 🚀 Getting started @@ -39,35 +46,18 @@ https://www.nuget.org/packages/wpf-ui/ The plugin for **Visual Studio 2022** let you easily create new projects using **WPF UI**. https://marketplace.visualstudio.com/items?itemName=lepo.wpf-ui -## 📁 What's included? - -| Name | Framework | -| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Wpf.Ui**
Library that allows you to use all features in your own application | [![NET7](https://img.shields.io/badge/.NET-8.0-purple)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Wpf.Ui.csproj) [![NET6](https://img.shields.io/badge/.NET-6.0-yellow)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Wpf.Ui.csproj)
[![NETCore3](https://img.shields.io/badge/.NET%20Core-3.1-brightgreen)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Wpf.Ui.csproj)
[![NETFramework48](https://img.shields.io/badge/.NET%20Framework-4.8-orange)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Wpf.Ui.csproj)
[![NETFramework472](https://img.shields.io/badge/.NET%20Framework-4.7.2-orange)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Wpf.Ui.csproj)
[![NETFramework462](https://img.shields.io/badge/.NET%20Framework-4.6.2-orange)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Wpf.Ui.csproj) | -| **Wpf.Ui.Gallery**
Application with all controls. | [![NET7-win](https://img.shields.io/badge/.NET-8.0--windows-purple)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj) | -| **Wpf.Ui.Demo.Mvvm**
An MVVM app written in WPF .NET 6 where you can test the features. | [![NET7-win](https://img.shields.io/badge/.NET-8.0--windows-purple)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj) | -| **Wpf.Ui.Demo.Simple**
Simple .NET 7 app with navigation. | [![NET7-win](https://img.shields.io/badge/.NET-8.0--windows-purple)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj) | -| **Wpf.Ui.FontMapper**
Console app for generating Fluent System Icons enums. | [![NET7](https://img.shields.io/badge/.NET-8.0-purple)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj) | -| **Wpf.Ui.Extension**
Project for Visual Studio 2022 extension. | [![NETFramework48](https://img.shields.io/badge/.NET%20Framework-4.8-orange)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui.Extension/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj) | - ## 📷 Screenshots ![Demo App Sample](https://user-images.githubusercontent.com/13592821/166259110-0fb98120-fe34-4e6d-ab92-9f72ad7113c3.png) ![Monaco Editor](https://user-images.githubusercontent.com/13592821/258610583-7d71f69d-45b3-4be6-bcb8-8cf6cd60a2ff.png) -![Text Editor Sample](https://user-images.githubusercontent.com/13592821/165918838-a65cbb86-4fc4-4efb-adb7-e39027fb661f.png) - ![Store App Sample](https://user-images.githubusercontent.com/13592821/165918914-6948fb42-1ee1-4c36-870e-65bb8ffe3c8a.png) ## 🏗️ Works with Visual Studio Designer ![VS2022 Designer Preview](https://user-images.githubusercontent.com/13592821/165919228-0aa3a36c-fb37-4198-835e-53488845226c.png) -## 🏁 Virtualized panels for displaying thousands controls - -![WPF UI virtualized wrap panels](https://user-images.githubusercontent.com/13592821/167254364-bc7d1106-2740-4337-907c-0e0f1ce4c320.png) - ## ❤️ Custom Tray icon and menu in pure WPF ![WPF UI Tray menu in WPF](https://user-images.githubusercontent.com/13592821/166259470-2d48a88e-47ce-4f8f-8f07-c9b110de64a5.png) @@ -76,21 +66,13 @@ https://marketplace.visualstudio.com/items?itemName=lepo.wpf-ui ![WPF UI Snap Layout for WPF](https://user-images.githubusercontent.com/13592821/166259869-e60d37e4-ded4-46bf-80d9-f92c47266f34.png) -## 🕹️ Radiograph - -Radiograph is a computer hardware monitoring app that uses **WPF UI**. - -![Radiograph screenshot](https://user-images.githubusercontent.com/13592821/165918625-6cc72bb1-2617-40fa-a193-60fea0efcd65.png) - -[](https://www.microsoft.com/en-us/p/radiograph/9nh1p86h06cg?activetab=pivot:overviewtab) - ## 📖 Documentation -Documentation can be found at https://wpfui.lepo.co/. We also have a [tutorial](https://wpfui.lepo.co/tutorial/) over there for newcomers. +Documentation can be found at https://wpfui.lepo.co/. We also have a [tutorial](#-getting-started) over there for newcomers. ## 🚧 Development -If you want to propose a new functionality or submit a bugfix, create a [Pull Request](https://github.com/lepoco/wpfui/compare/development...development) for the branch [development](https://github.com/lepoco/wpfui/tree/development). +If you want to propose a new functionality or submit a bugfix, create a [Pull Request](https://github.com/lepoco/wpfui/compare/main...main) for the branch [main](https://github.com/lepoco/wpfui/tree/main). ## 📐 How to use? @@ -143,8 +125,13 @@ Now you can create fantastic apps, e.g. with one button: Crafting apps for .NET without the creators of tools like ReSharper or XAML Styler would never be such a fantastic adventure. -- [🔗 JetBrains ReSharper](https://www.jetbrains.com/resharper/) -- [🔗 XAML Styler](https://github.com/Xavalon/XamlStyler) +- [🔗 JetBrains ReSharper](https://www.jetbrains.com/resharper/) +- [🔗 XAML Styler](https://github.com/Xavalon/XamlStyler) + +JetBrains was kind enough to lend a license for the open-source **dotUltimate** for WPF UI development. Learn more here: + +- https://www.jetbrains.com/dotnet/ +- https://www.jetbrains.com/opensource/ ## Microsoft Property @@ -164,13 +151,6 @@ In the app dictionaries, you can add an alternate path to the font pack://application:,,,/;component/Fonts/#Segoe Fluent Icons ``` -## Compilation - -Use Visual Studio 2022 and invoke the .sln. - -Visual Studio -**WPF UI** is an Open Source project. You are entitled to download and use the freely available Visual Studio Community Edition to build, run or develop for WPF UI. As per the Visual Studio Community Edition license, this applies regardless of whether you are an individual or a corporate user. - ## Code of Conduct This project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community. diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt new file mode 100644 index 000000000..265e0cde3 --- /dev/null +++ b/ThirdPartyNotices.txt @@ -0,0 +1,124 @@ +WPF-UI + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This project incorporates components from the projects listed below. The original copyright notices and the licenses under which the authors received such components are set forth below. + +1. sbaeumlisberger/VirtualizingWrapPanel version 2.0.6 (https://github.com/sbaeumlisberger/VirtualizingWrapPanel), included in Wpf.Ui. +2. microsoft/fluentui-system-icons version 1.1.242 (https://github.com/microsoft/fluentui-system-icons), included in Wpf.Ui. +3. dotnet/wpf version 8.0 (https://github.com/dotnet/wpf), included in Wpf.Ui. +4. microsoft/microsoft-ui-xaml version 3.0 (https://github.com/microsoft/microsoft-ui-xaml), included in Wpf.Ui. +5. microsoft/segoe-fluent-icons-font version 3.0 (https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font), included in Wpf.Ui. + +%% sbaeumlisberger/VirtualizingWrapPanel NOTICES AND INFORMATION BEGIN HERE +========================================= +MIT License + +Copyright (c) 2019 S. Bäumlisberger + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF sbaeumlisberger/VirtualizingWrapPanel NOTICES AND INFORMATION + +%% microsoft/fluentui-system-icons NOTICES AND INFORMATION BEGIN HERE +========================================= +MIT License + +Copyright (c) 2020 Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF microsoft/fluentui-system-icons NOTICES AND INFORMATION + +%% dotnet/wpf NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF dotnet/wpf NOTICES AND INFORMATION + +%% microsoft/microsoft-ui-xaml NOTICES AND INFORMATION BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE +========================================= +END OF microsoft/microsoft-ui-xaml NOTICES AND INFORMATION + +%% microsoft/segoe-fluent-icons-font NOTICES AND INFORMATION BEGIN HERE +========================================= +You may use the Segoe and icon fonts, or glyphs included in this file (“Software”) solely to design, develop and test your programs that run on a Microsoft Platform, a Microsoft Platform includes but is not limited to any hardware or software product or service branded by trademark, trade dress, copyright or some other recognized means, as a product or service of Microsoft. This license does not grant you the right to distribute or sublicense all or part of the Software to any third party. By using the Software, you agree to these terms. If you do not agree to these terms, do not use the Software. +========================================= +END OF microsoft/segoe-fluent-icons-font NOTICES AND INFORMATION diff --git a/Wpf.Ui.sln b/Wpf.Ui.sln index a55a71d42..03c890493 100644 --- a/Wpf.Ui.sln +++ b/Wpf.Ui.sln @@ -9,9 +9,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets Directory.Packages.props = Directory.Packages.props + LICENSE = LICENSE + LICENSE.md = LICENSE.md nuget.config = nuget.config README.md = README.md Settings.XamlStyler = Settings.XamlStyler + ThirdPartyNotices.txt = ThirdPartyNotices.txt EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Gallery", "src\Wpf.Ui.Gallery\Wpf.Ui.Gallery.csproj", "{E55BFB14-9DA6-434A-8153-BFE124D71818}" @@ -20,10 +23,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui", "src\Wpf.Ui\Wpf.Ui EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.FontMapper", "src\Wpf.Ui.FontMapper\Wpf.Ui.FontMapper.csproj", "{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Mvvm", "src\Wpf.Ui.Demo.Mvvm\Wpf.Ui.Demo.Mvvm.csproj", "{DA4D97CC-4817-41D5-B517-DE53A2CDE113}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Simple", "src\Wpf.Ui.Demo.Simple\Wpf.Ui.Demo.Simple.csproj", "{3FB5104C-C6F5-452C-9713-F17E15D34271}" -EndProject Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "Wpf.Ui.Gallery.Package", "src\Wpf.Ui.Gallery.Package\Wpf.Ui.Gallery.Package.wapproj", "{50C713C3-555E-491F-87EE-C806BEC0579F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.UnitTests", "tests\Wpf.Ui.UnitTests\Wpf.Ui.UnitTests.csproj", "{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}" @@ -46,7 +45,19 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Tray", "src\Wpf.Ui.T EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.SyntaxHighlight", "src\Wpf.Ui.SyntaxHighlight\Wpf.Ui.SyntaxHighlight.csproj", "{07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Console", "src\Wpf.Ui.Demo.Console\Wpf.Ui.Demo.Console.csproj", "{1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Abstractions", "src\Wpf.Ui.Abstractions\Wpf.Ui.Abstractions.csproj", "{F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{D7EA6A65-3CB5-4A59-934A-B8402C849107}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Console", "samples\Wpf.Ui.Demo.Console\Wpf.Ui.Demo.Console.csproj", "{6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Mvvm", "samples\Wpf.Ui.Demo.Mvvm\Wpf.Ui.Demo.Mvvm.csproj", "{5138077E-670E-413D-94D1-0825B6D1201B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Simple", "samples\Wpf.Ui.Demo.Simple\Wpf.Ui.Demo.Simple.csproj", "{E37CD05A-EBFC-429D-A550-BEE44119FA9E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Dialogs", "samples\Wpf.Ui.Demo.Dialogs\Wpf.Ui.Demo.Dialogs.csproj", "{7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.DependencyInjection", "src\Wpf.Ui.DependencyInjection\Wpf.Ui.DependencyInjection.csproj", "{9C8D6133-9417-43A1-B54F-725009569D71}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -108,38 +119,6 @@ Global {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x64.Build.0 = Release|x64 {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x86.ActiveCfg = Release|Any CPU {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x86.Build.0 = Release|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|arm64.ActiveCfg = Debug|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|arm64.Build.0 = Debug|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|x64.ActiveCfg = Debug|x64 - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|x64.Build.0 = Debug|x64 - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|x86.ActiveCfg = Debug|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Debug|x86.Build.0 = Debug|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|Any CPU.Build.0 = Release|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|arm64.ActiveCfg = Release|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|arm64.Build.0 = Release|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|x64.ActiveCfg = Release|x64 - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|x64.Build.0 = Release|x64 - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|x86.ActiveCfg = Release|Any CPU - {DA4D97CC-4817-41D5-B517-DE53A2CDE113}.Release|x86.Build.0 = Release|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|arm64.ActiveCfg = Debug|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|arm64.Build.0 = Debug|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|x64.ActiveCfg = Debug|x64 - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|x64.Build.0 = Debug|x64 - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|x86.ActiveCfg = Debug|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Debug|x86.Build.0 = Debug|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|Any CPU.Build.0 = Release|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|arm64.ActiveCfg = Release|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|arm64.Build.0 = Release|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|x64.ActiveCfg = Release|x64 - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|x64.Build.0 = Release|x64 - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|x86.ActiveCfg = Release|Any CPU - {3FB5104C-C6F5-452C-9713-F17E15D34271}.Release|x86.Build.0 = Release|Any CPU {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|arm64.ActiveCfg = Debug|ARM64 {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|arm64.Build.0 = Debug|ARM64 @@ -302,22 +281,102 @@ Global {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|x64.Build.0 = Release|Any CPU {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|x86.ActiveCfg = Release|Any CPU {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|x86.Build.0 = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|arm64.ActiveCfg = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|arm64.Build.0 = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|x64.ActiveCfg = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|x64.Build.0 = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|x86.ActiveCfg = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Debug|x86.Build.0 = Debug|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|Any CPU.Build.0 = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|arm64.ActiveCfg = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|arm64.Build.0 = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|x64.ActiveCfg = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|x64.Build.0 = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|x86.ActiveCfg = Release|Any CPU - {1FB6D1C2-B2E7-48F5-B5BA-9F0CA4F1B826}.Release|x86.Build.0 = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|arm64.ActiveCfg = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|arm64.Build.0 = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x64.ActiveCfg = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x64.Build.0 = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x86.ActiveCfg = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x86.Build.0 = Debug|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|Any CPU.Build.0 = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|arm64.ActiveCfg = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|arm64.Build.0 = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x64.ActiveCfg = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x64.Build.0 = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x86.ActiveCfg = Release|Any CPU + {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x86.Build.0 = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|arm64.ActiveCfg = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|arm64.Build.0 = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x64.ActiveCfg = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x64.Build.0 = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x86.ActiveCfg = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x86.Build.0 = Debug|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|Any CPU.Build.0 = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|arm64.ActiveCfg = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|arm64.Build.0 = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x64.ActiveCfg = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x64.Build.0 = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x86.ActiveCfg = Release|Any CPU + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x86.Build.0 = Release|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|arm64.ActiveCfg = Debug|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|arm64.Build.0 = Debug|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.ActiveCfg = Debug|x64 + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.Build.0 = Debug|x64 + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x86.ActiveCfg = Debug|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x86.Build.0 = Debug|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|Any CPU.Build.0 = Release|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|arm64.ActiveCfg = Release|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|arm64.Build.0 = Release|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.ActiveCfg = Release|x64 + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.Build.0 = Release|x64 + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x86.ActiveCfg = Release|Any CPU + {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x86.Build.0 = Release|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|arm64.ActiveCfg = Debug|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|arm64.Build.0 = Debug|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.ActiveCfg = Debug|x64 + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.Build.0 = Debug|x64 + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x86.ActiveCfg = Debug|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x86.Build.0 = Debug|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|Any CPU.Build.0 = Release|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|arm64.ActiveCfg = Release|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|arm64.Build.0 = Release|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.ActiveCfg = Release|x64 + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.Build.0 = Release|x64 + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x86.ActiveCfg = Release|Any CPU + {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x86.Build.0 = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|arm64.ActiveCfg = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|arm64.Build.0 = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x64.ActiveCfg = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x64.Build.0 = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x86.ActiveCfg = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x86.Build.0 = Debug|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|Any CPU.Build.0 = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|arm64.ActiveCfg = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|arm64.Build.0 = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x64.ActiveCfg = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x64.Build.0 = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x86.ActiveCfg = Release|Any CPU + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x86.Build.0 = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|arm64.ActiveCfg = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|arm64.Build.0 = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x64.Build.0 = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x86.Build.0 = Debug|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|Any CPU.Build.0 = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|arm64.ActiveCfg = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|arm64.Build.0 = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x64.ActiveCfg = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x64.Build.0 = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x86.ActiveCfg = Release|Any CPU + {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -325,6 +384,10 @@ Global GlobalSection(NestedProjects) = preSolution {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C} = {35AC6218-CBEA-4FDA-8CE1-D1EBD6FD8D4A} {4059EB00-22B3-4EF9-A509-469CE8B0096D} = {35AC6218-CBEA-4FDA-8CE1-D1EBD6FD8D4A} + {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} + {5138077E-670E-413D-94D1-0825B6D1201B} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} + {E37CD05A-EBFC-429D-A550-BEE44119FA9E} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} + {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {234CB3F9-5ADC-433F-BDBD-CB8EA59EB518} diff --git a/src/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-1024.png b/build/nuget.png similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-1024.png rename to build/nuget.png diff --git a/docs/docfx.json b/docs/docfx.json index ceaecca16..e338a2776 100644 --- a/docs/docfx.json +++ b/docs/docfx.json @@ -3,7 +3,12 @@ { "src": [ { - "files": ["src/Wpf.Ui/*.csproj", "src/Wpf.Ui.Tray/*.csproj"], + "files": [ + "src/Wpf.Ui/*.csproj", + "src/Wpf.Ui.Tray/*.csproj", + "src/Wpf.Ui.Abstractions/*.csproj", + "src/Wpf.Ui.DependencyInjection/*.csproj" + ], "src": "../" } ], @@ -18,8 +23,13 @@ "build": { "content": [ { - "files": ["**/*.{md,yml}"], - "exclude": ["_site/**", "obj/**"] + "files": [ + "**/*.{md,yml}" + ], + "exclude": [ + "_site/**", + "obj/**" + ] } ], "resource": [ @@ -30,20 +40,30 @@ "manifest.webmanifest", "robots.txt" ], - "exclude": ["_site/**", "obj/**"] + "exclude": [ + "_site/**", + "obj/**" + ] } ], - "xrefService": ["https://xref.docs.microsoft.com/query?uid={uid}"], - "postProcessors": ["ExtractSearchIndex"], + "xrefService": [ + "https://xref.docs.microsoft.com/query?uid={uid}" + ], + "postProcessors": [ + "ExtractSearchIndex" + ], "globalMetadata": { "_appTitle": "WPF UI", "_appName": "WPF UI", "_appFaviconPath": "images/favicon.ico", "_appLogoPath": "images/wpfui.png", - "_appFooter": "Made with docfx, ChatGPT and DeepL | Copyright © 2023 lepo.co" + "_appFooter": "Made with docfx, ChatGPT and DeepL | Copyright © 2024 lepo.co" }, "dest": "_site", - "template": ["default", "templates/wpfui"], + "template": [ + "default", + "templates/wpfui" + ], "globalMetadataFiles": [], "fileMetadataFiles": [], "markdownEngineName": "markdig", diff --git a/docs/documentation/getting-started.md b/docs/documentation/getting-started.md index c22b1cc85..01576cf0e 100644 --- a/docs/documentation/getting-started.md +++ b/docs/documentation/getting-started.md @@ -2,8 +2,7 @@ ## Adding dictionaries -[XAML](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/xaml/?view=netdesktop-6.0), and hence WPF, operate on resource dictionaries. These are HTML-like files that describe the appearance and various aspects of the [controls](https://wpfui.lepo.co/documentation/controls). -**WPF UI** adds its own sets of these files to tell the application how the controls should look like. +[XAML](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/xaml/?view=netdesktop-6.0), and hence WPF, operate on resource dictionaries. These are HTML-like files that describe the appearance and various aspects of the [controls](https://wpfui.lepo.co/documentation/controls). **WPF UI** adds its own sets of these files to tell the application how the controls should look. There should be a file called `App.xaml` in your new application. Add new dictionaries to it using **WPF UI** `ControlsDictionary` and `ThemesDictionary` classes: @@ -20,16 +19,13 @@ There should be a file called `App.xaml` in your new application. Add new dictio - ``` -You can choose a color theme here, -`Light` or `Dark`. +Notice that the `ThemeDictionary` lets you choose a color theme, `Light` or `Dark`. ## The main window -There should be a `MainWindow.xaml` file in your newly created application. -It contains the arrangement of the controls used and their parameters. +There should be a `MainWindow.xaml` file in your newly created application. It contains the arrangement of the controls used and their parameters. ```xml ``` -You can add a new namespace to this window to tell the interpreter that you will be using controls from somewhere, like the **WPF UI** library. +Add the **WPF UI** library namespace to this window to tell the XAML compiler that you will be using controls from the library. ```xml +``` + +NavigationPage.xaml.cs + +```csharp +public partial class NavigationPage : Page +{ + public NavigationPage(NavigationPageModel model) + { + InitializeComponent(); + + DataContext = model; + Loaded += (_, _) => RootNavigation.Navigate(type(MyDashboardClass)); + } +} +``` + +## Using Navigation in the MVVM + +Firstly, you need to implement the `IPageService` interface + +```csharp +// from src/Wpf.Ui.Demo.Mvvm/Services/PageService.cs +public class PageService : IPageService +{ + /// + /// Service which provides the instances of pages. + /// + private readonly IServiceProvider _serviceProvider; + + /// + /// Initializes a new instance of the class and attaches the . + /// + public PageService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public T? GetPage() + where T : class + { + if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) + { + throw new InvalidOperationException("The page should be a WPF control."); + } + + return (T?)_serviceProvider.GetService(typeof(T)); + } + + /// + public FrameworkElement? GetPage(Type pageType) + { + if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) + { + throw new InvalidOperationException("The page should be a WPF control."); + } + + return _serviceProvider.GetService(pageType) as FrameworkElement; + } +} +``` + +Then, inject it into the IoC container. + +```csharp +var services = new ServiceCollection(); + +services.AddSingleton(); +services.AddSingleton(); +services.AddSingleton(); + +// inject View and ViewModel +services.AddSingleton(); +services.AddSingleton(); +services.AddSingleton(); +services.AddSingleton(); +services.AddSingleton(); +services.AddSingleton(); +``` + +Lastly, adjust the code for the navigation window. + +```xml + + + + +``` + +```csharp +using System.Collections.ObjectModel; +using System.Windows; +using CommunityToolkit.Mvvm.ComponentModel; +using Wpf.Ui; +using Wpf.Ui.Controls; + +public partial class MainWindow : Window +{ + public MainWindow(IPageService pageService, MainWindowViewModel model) + { + DataContext = model; + InitializeComponent(); + + // Set the page service for the navigation control. + RootNavigationView.SetPageService(pageService); + } +} + +public partial class MainWindowViewModel : ObservableObject +{ + [ObservableProperty] + private ObservableCollection _navigationItems = []; + + public MainWindowViewModel() + { + NavigationItems = + [ + new NavigationViewItem() + { + Content = "Home", + Icon = new SymbolIcon { Symbol = SymbolRegular.Home24 }, + TargetPageType = typeof(HomePage) + }, + new NavigationViewItem() + { + Content = "Counter", + TargetPageType = typeof(CounterPage) + }, + ]; + } +} +``` + +Alternatively, you can use the **WPF UI** Visual Studio Extension that includes a project template for MVVM pattern. diff --git a/docs/documentation/nuget.md b/docs/documentation/nuget.md index f6e53308f..cb0881512 100644 --- a/docs/documentation/nuget.md +++ b/docs/documentation/nuget.md @@ -28,4 +28,4 @@ NuGet is a free, open-source package management system for the Microsoft .NET pl # Done! -Package installed, to learn more, go to the [**Getting started**](/tutorial/getting-started.html) page. +Package installed, to learn more, go to the [**Getting started**](/documentation/getting-started.html) page. diff --git a/docs/documentation/system-theme-watcher.md b/docs/documentation/system-theme-watcher.md index e69de29bb..c703f7d69 100644 --- a/docs/documentation/system-theme-watcher.md +++ b/docs/documentation/system-theme-watcher.md @@ -0,0 +1,88 @@ +# SystemThemeWatcher + +SystemThemeWatcher automatically updates the application background if the system theme or color changes. This component is used to adapt the application's background effect and theme according to the system theme. + +## Features + + * Automatic Theme Updates: Updates the application's background and theme when the system theme changes. + + * Global Settings: Settings apply globally and cannot be changed for each System.Windows.Window. + + * Supported Backdrop Types: Provides background effects compatible with WindowBackdropType types (e.g., Egg). + + +## Usage + +You can use SystemThemeWatcher to start watching a window's background and theme like this: + +```cs +SystemThemeWatcher.Watch(this as System.Windows.Window); +SystemThemeWatcher.UnWatch(this as System.Windows.Window); +``` + +or +```cs +SystemThemeWatcher.Watch( + _serviceProvider.GetRequiredService() +); +``` + +## Example Usage + +Here's an example of using SystemThemeWatcher in the MainWindow class to start watching the theme when the window is loaded: + +```cs +namespace MyApp; + +public partial class MainWindow : Window +{ + public MainWindow() + { + InitializeComponent(); + + Loaded += (sender, args) => + { + Wpf.Ui.Appearance.SystemThemeWatcher.Watch( + this, // Window class + Wpf.Ui.Controls.WindowBackdropType.Mica, // Background type + true // Whether to change accents automatically + ); + }; + } +} +``` + +## Methods + +### Watch + +Applies the background effect and theme according to the system theme to the observed window. + +```cs +public static void Watch( + Window? window, + WindowBackdropType backdrop = WindowBackdropType.Mica, + bool updateAccents = true +) +``` + +### UnWatch + +Stops watching the window and removes the hook to receive system messages. + +```cs +public static void UnWatch(Window? window) + +``` + +### WndProc + +Listens to system messages on the application windows. + +```cs +private static IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + +``` + +> [!IMPORTANT] +> If UnWatch is called on a window that has not yet loaded, an InvalidOperationException may occur. Ensure that the window is loaded before calling UnWatch. diff --git a/docs/documentation/themes.md b/docs/documentation/themes.md index 4fa255169..e98eb724e 100644 --- a/docs/documentation/themes.md +++ b/docs/documentation/themes.md @@ -24,8 +24,8 @@ Or, you can add **WPF UI** resources manually. - - + + @@ -37,16 +37,16 @@ Or, you can add **WPF UI** resources manually. If you want to change the theme while the application is running, you can call the static `Apply` method of the `Theme` class. ```csharp -Wpf.Ui.Appearance.Theme.Apply( - Wpf.Ui.Appearance.ThemeType.Light, // Theme type - Wpf.Ui.Appearance.BackgroundType.Mica, // Background type - true // Whether to change accents automatically +Wpf.Ui.Appearance.ApplicationThemeManager.Apply( + Wpf.Ui.Appearance.ApplicationTheme.Light, // Theme type + Wpf.Ui.Controls.WindowBackdropType.Mica, // Background type + true // Whether to change accents automatically ); ``` ### Automatic change -The theme can be changed automatically when the operating system changes its background or accent using the [Watcher](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Appearance/Watcher.cs) class. +The theme can be changed automatically when the operating system changes its background or accent using the [SystemThemeWatcher](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Appearance/SystemThemeWatcher.cs) class. ```csharp namespace MyApp; @@ -59,10 +59,10 @@ public partial class MainWindow : Window Loaded += (sender, args) => { - Wpf.Ui.Appearance.Watcher.Watch( - this, // Window class - Wpf.Ui.Appearance.BackgroundType.Mica, // Background type - true // Whether to change accents automatically + Wpf.Ui.Appearance.SystemThemeWatcher.Watch( + this, // Window class + Wpf.Ui.Controls.WindowBackdropType.Mica, // Background type + true // Whether to change accents automatically ); }; } diff --git a/docs/index.md b/docs/index.md index 824269c2d..4aef7c426 100644 --- a/docs/index.md +++ b/docs/index.md @@ -114,7 +114,7 @@ ![Text Editor Sample](https://user-images.githubusercontent.com/13592821/165918838-a65cbb86-4fc4-4efb-adb7-e39027fb661f.png) -[Created with ❤ in Poland by lepo.co](https://dev.lepo.co/) +[Created with ❤ in Poland by lepo.co](https://lepo.co/) A simple way to make your application written in WPF keep up with modern design trends. Library changes the base elements like `Page`, `ToggleButton` or `List`, and also includes additional controls like `Navigation`, `NumberBox`, `Dialog` or `Snackbar`. [![Discord](https://img.shields.io/discord/1071051348348514375?label=discord)](https://discord.gg/AR9ywDUwGq) [![GitHub license](https://img.shields.io/github/license/lepoco/wpfui)](https://github.com/lepoco/wpfui/blob/master/LICENSE) [![Nuget](https://img.shields.io/nuget/v/WPF-UI)](https://www.nuget.org/packages/WPF-UI/) [![Nuget](https://img.shields.io/nuget/dt/WPF-UI?label=nuget)](https://www.nuget.org/packages/WPF-UI/) [![VS 2022 Downloads](https://img.shields.io/visual-studio-marketplace/i/lepo.WPF-UI?label=vs-2022)](https://marketplace.visualstudio.com/items?itemName=lepo.WPF-UI) [![Sponsors](https://img.shields.io/github/sponsors/lepoco)](https://github.com/sponsors/lepoco) diff --git a/docs/templates/package-lock.json b/docs/templates/package-lock.json index 6cf762307..53dc439e6 100644 --- a/docs/templates/package-lock.json +++ b/docs/templates/package-lock.json @@ -1,7 +1,7 @@ { "name": "@docfx/template", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -825,19 +825,13 @@ "name": "bootstrap", "version": "3.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", - "engines": { - "node": ">=6" - } + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" }, "node_modules/@default/highlight.js": { "name": "highlight.js", "version": "11.8.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", - "engines": { - "node": ">=12.0.0" - } + "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==" }, "node_modules/@default/lunr": { "name": "lunr", @@ -855,6 +849,7 @@ "name": "twbs-pagination", "version": "1.3.1", "resolved": "git+ssh://git@github.com/josecebe/twbs-pagination.git#a0ceda4b492030ca12081ce08c1acca1d295c0ed", + "integrity": "sha512-GlX+5S4jiffUAZGsK3k31YLAxRDcdU46BHcPn7P+oH7Mkgig5PfLEfU7d0/MKpzW7vFSZBJYQLyGqxwEcdhtBw==", "license": "Apache 2.0", "dependencies": { "jquery": ">=1.7.0" @@ -866,134 +861,6 @@ "resolved": "https://registry.npmjs.org/@websanova/url/-/url-2.6.3.tgz", "integrity": "sha512-+gLI+9nIVPg3X4VcC30MUrGd9/DmYPla2ryzl7qKzIbH07wgsgy99H2WRsSFweVgV4FLkTHEpClj1//t0u+FLw==" }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-arm64": { "version": "0.18.17", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", @@ -1010,214 +877,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1234,10 +893,11 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.1.tgz", - "integrity": "sha512-O7x6dMstWLn2ktjcoiNLDkAGG2EjveHL+Vvc+n0fXumkJYAcSqcVYKtwDU+hDZ0uDUsnUagSYaZrOLAYE8un1A==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1301,6 +961,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1351,6 +1012,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -1838,6 +1500,7 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "peer": true, "funding": { "type": "opencollective", @@ -2010,6 +1673,7 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/mdast": { @@ -2492,17 +2156,37 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -2521,16 +2205,39 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2541,15 +2248,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2559,6 +2267,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -2596,11 +2328,15 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2926,11 +2662,26 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "semver": "^7.0.0" @@ -2946,14 +2697,21 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3789,6 +3547,63 @@ "lodash-es": "^4.17.21" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dayjs": { "version": "1.11.7", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", @@ -3890,13 +3705,34 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4172,45 +4008,59 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -4219,29 +4069,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -4249,6 +4140,7 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-callable": "^1.1.4", @@ -4390,6 +4282,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-standard": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", @@ -4420,15 +4329,16 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4436,6 +4346,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -4446,13 +4357,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^3.2.7" @@ -4471,6 +4384,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -4481,76 +4395,57 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", "peer": true, "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" + "eslint": ">=8" } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -4564,6 +4459,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -4574,6 +4470,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "esutils": "^2.0.2" @@ -4587,6 +4484,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eslint-plugin-import/node_modules/semver": { @@ -4594,29 +4492,34 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "version": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" }, "engines": { - "node": ">=12.22.0" + "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" @@ -4626,16 +4529,20 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, + "license": "ISC", "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-scope": { @@ -4654,35 +4561,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", @@ -5041,6 +4919,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-callable": "^1.1.3" @@ -5072,37 +4951,28 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -5116,6 +4986,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5140,15 +5011,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5176,14 +5053,16 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -5192,10 +5071,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -5263,10 +5157,11 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -5278,13 +5173,15 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5324,6 +5221,7 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" @@ -5353,23 +5251,12 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5385,23 +5272,25 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -5415,6 +5304,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -5424,13 +5314,14 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5439,6 +5330,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/heap": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", @@ -5629,6 +5533,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -5648,14 +5553,15 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -5671,15 +5577,18 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5696,6 +5605,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-bigints": "^1.0.1" @@ -5721,6 +5631,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -5733,11 +5644,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -5747,12 +5676,33 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5763,6 +5713,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -5814,10 +5765,11 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -5849,6 +5801,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -5892,6 +5845,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -5905,13 +5859,17 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5934,6 +5892,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -5950,6 +5909,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-symbols": "^1.0.2" @@ -5962,17 +5922,14 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5986,6 +5943,7 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2" @@ -6003,6 +5961,14 @@ "node": ">=4" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6729,6 +6695,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.0" @@ -7675,6 +7642,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7816,11 +7784,15 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", "peer": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7830,20 +7802,22 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -7854,16 +7828,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8168,6 +8179,17 @@ "npm": ">=1.0.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.26", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", @@ -8488,15 +8510,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -8505,19 +8529,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8543,12 +8554,13 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -8589,6 +8601,17 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -8625,6 +8648,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -8686,17 +8710,41 @@ "node": ">=6" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8897,6 +8945,42 @@ "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8925,15 +9009,20 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9239,31 +9328,56 @@ "node": ">=8" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9286,6 +9400,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -9734,14 +9849,15 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -9779,16 +9895,82 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9831,6 +10013,7 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -10028,6 +10211,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-bigint": "^1.0.1", @@ -10041,18 +10225,18 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10193,7282 +10377,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "dev": true - }, - "@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", - "dev": true, - "requires": { - "@babel/types": "^7.21.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@braintree/sanitize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" - }, - "@csstools/css-parser-algorithms": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.0.tgz", - "integrity": "sha512-dTKSIHHWc0zPvcS5cqGP+/TPFUJB0ekJ9dGKvMAFoNuBFhDPBt9OMGNZiIA5vTiNdGHHBeScYPXIGBMnVOahsA==", - "dev": true, - "requires": {} - }, - "@csstools/css-tokenizer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz", - "integrity": "sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==", - "dev": true - }, - "@csstools/media-query-list-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.2.tgz", - "integrity": "sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", - "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", - "dev": true, - "requires": {} - }, - "@default/anchor-js": { - "version": "npm:anchor-js@5.0.0", - "resolved": "https://registry.npmjs.org/anchor-js/-/anchor-js-5.0.0.tgz", - "integrity": "sha512-2bOqCsBIXAYhjAN3iI4QevoAJtB2gRWAiY9P3P7CVW8lIjA3Dl6ldhDlWeeQvCHif+V5vIndfLOag/5I8tzTzA==" - }, - "@default/bootstrap": { - "version": "npm:bootstrap@3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" - }, - "@default/highlight.js": { - "version": "npm:highlight.js@11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==" - }, - "@default/lunr": { - "version": "npm:lunr@2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" - }, - "@default/mark.js": { - "version": "npm:mark.js@8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" - }, - "@default/twbs-pagination": { - "version": "git+ssh://git@github.com/josecebe/twbs-pagination.git#a0ceda4b492030ca12081ce08c1acca1d295c0ed", - "from": "@default/twbs-pagination@josecebe/twbs-pagination#1.3.1", - "requires": { - "jquery": ">=1.7.0" - } - }, - "@default/url": { - "version": "npm:@websanova/url@2.6.3", - "resolved": "https://registry.npmjs.org/@websanova/url/-/url-2.6.3.tgz", - "integrity": "sha512-+gLI+9nIVPg3X4VcC30MUrGd9/DmYPla2ryzl7qKzIbH07wgsgy99H2WRsSFweVgV4FLkTHEpClj1//t0u+FLw==" - }, - "@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.1.tgz", - "integrity": "sha512-O7x6dMstWLn2ktjcoiNLDkAGG2EjveHL+Vvc+n0fXumkJYAcSqcVYKtwDU+hDZ0uDUsnUagSYaZrOLAYE8un1A==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", - "dev": true, - "requires": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", - "dev": true, - "requires": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-mock": "^29.6.2" - } - }, - "@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", - "dev": true, - "requires": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" - } - }, - "@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", - "dev": true, - "requires": { - "jest-get-type": "^29.4.3" - } - }, - "@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.1", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" - } - }, - "@jest/globals": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", - "dev": true, - "requires": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" - } - }, - "@jest/reporters": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - } - }, - "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", - "dev": true, - "requires": { - "@jest/console": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.6.2", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - } - } - }, - "@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", - "requires": { - "@types/d3-time": "*" - } - }, - "@types/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" - }, - "@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" - }, - "@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", - "requires": { - "@types/ms": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", - "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "peer": true - }, - "@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", - "requires": { - "@types/unist": "*" - } - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "@types/node": { - "version": "18.14.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", - "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.1.tgz", - "integrity": "sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/type-utils": "6.2.1", - "@typescript-eslint/utils": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.1.tgz", - "integrity": "sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/typescript-estree": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", - "debug": "^4.3.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.1.tgz", - "integrity": "sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.1.tgz", - "integrity": "sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "6.2.1", - "@typescript-eslint/utils": "6.2.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.1.tgz", - "integrity": "sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.1.tgz", - "integrity": "sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.1.tgz", - "integrity": "sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/typescript-estree": "6.2.1", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.1.tgz", - "integrity": "sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.2.1", - "eslint-visitor-keys": "^3.4.1" - } - }, - "@websanova/url": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@websanova/url/-/url-2.6.3.tgz", - "integrity": "sha512-+gLI+9nIVPg3X4VcC30MUrGd9/DmYPla2ryzl7qKzIbH07wgsgy99H2WRsSFweVgV4FLkTHEpClj1//t0u+FLw==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "anchor-js": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/anchor-js/-/anchor-js-5.0.0.tgz", - "integrity": "sha512-2bOqCsBIXAYhjAN3iI4QevoAJtB2gRWAiY9P3P7CVW8lIjA3Dl6ldhDlWeeQvCHif+V5vIndfLOag/5I8tzTzA==" - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "peer": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "babel-jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", - "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", - "dev": true, - "requires": { - "@jest/transform": "^29.6.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bootstrap": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.1.tgz", - "integrity": "sha512-jzwza3Yagduci2x0rr9MeFSORjcHpt0lRZukZPZQJT1Dth5qzV7XcgGqYzi39KGAVYR8QEDVoO0ubFKOxzMG+g==", - "requires": {} - }, - "bootstrap-icons": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.5.tgz", - "integrity": "sha512-oSX26F37V7QV7NCE53PPEL45d7EGXmBgHG3pDpZvcRaKVzWMqIRL9wcqJUyEha1esFtM3NJzvmxFXDxjJYD0jQ==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-sync": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", - "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", - "dev": true, - "requires": { - "browser-sync-client": "^2.29.3", - "browser-sync-ui": "^2.29.3", - "bs-recipes": "1.3.4", - "chalk": "4.1.2", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "^4.0.1", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.2.0", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "^4.4.1", - "ua-parser-js": "^1.0.33", - "yargs": "^17.3.1" - } - }, - "browser-sync-client": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", - "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", - "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3" - } - }, - "browser-sync-ui": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", - "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", - "dev": true, - "requires": { - "async-each-series": "0.1.1", - "chalk": "4.1.2", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^4.4.1", - "stream-throttle": "^0.1.3" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", - "dev": true - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "peer": true, - "requires": { - "semver": "^7.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "peer": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "requires": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001466", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", - "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "requires": { - "layout-base": "^1.0.0" - } - }, - "cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", - "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-functions-list": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.0.tgz", - "integrity": "sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==", - "dev": true - }, - "css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "requires": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cytoscape": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.23.0.tgz", - "integrity": "sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==", - "requires": { - "heap": "^0.2.6", - "lodash": "^4.17.21" - } - }, - "cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "requires": { - "cose-base": "^1.0.0" - } - }, - "cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "requires": { - "cose-base": "^2.2.0" - }, - "dependencies": { - "cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "requires": { - "layout-base": "^2.0.0" - } - }, - "layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" - } - } - }, - "d3": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.4.tgz", - "integrity": "sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==", - "requires": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - } - }, - "d3-array": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz", - "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" - }, - "d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - } - }, - "d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "requires": { - "d3-path": "1 - 3" - } - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "requires": { - "d3-array": "^3.2.0" - } - }, - "d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "requires": { - "delaunator": "5" - } - }, - "d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" - }, - "d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - } - }, - "d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "requires": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" - }, - "d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "requires": { - "d3-dsv": "1 - 3" - } - }, - "d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" - }, - "d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "requires": { - "d3-array": "2.5.0 - 3" - } - }, - "d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" - }, - "d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" - }, - "d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" - }, - "d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" - }, - "d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "requires": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - }, - "dependencies": { - "d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "requires": { - "internmap": "^1.0.0" - } - }, - "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "requires": { - "d3-path": "1" - } - }, - "internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" - } - } - }, - "d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "requires": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - } - }, - "d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "requires": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - } - }, - "d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" - }, - "d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "requires": { - "d3-path": "^3.1.0" - } - }, - "d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "requires": { - "d3-array": "2 - 3" - } - }, - "d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "requires": { - "d3-time": "1 - 3" - } - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" - }, - "d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "requires": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - } - }, - "dagre-d3-es": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", - "requires": { - "d3": "^7.8.2", - "lodash-es": "^4.17.21" - } - }, - "dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "requires": { - "character-entities": "^2.0.0" - } - }, - "dedent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.3.0.tgz", - "integrity": "sha512-7glNLfvdsMzZm3FpRY1CHuI2lbYDR+71YmrhmTZjYFD5pfT0ACgnGRdrrC9Mk2uICnzkcdelCx5at787UDGOvg==", - "dev": true, - "requires": {} - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "peer": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "requires": { - "robust-predicates": "^3.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", - "dev": true - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" - }, - "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dompurify": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz", - "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==" - }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "eazy-logger": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", - "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", - "dev": true, - "requires": { - "chalk": "4.1.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.331", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.331.tgz", - "integrity": "sha512-tdtr9y9oJl8VDiS+HeB6e/JDJqdDGjIk3yRfEMHm5rDnWQ/D5SbafybAayInxolbfbH6pouV5g7ZUAwE/WVtHw==", - "dev": true - }, - "elkjs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", - "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", - "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, - "peer": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "peer": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "peer": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "peer": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" - } - }, - "esbuild-sass-plugin": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.10.0.tgz", - "integrity": "sha512-STv849QGT8g77RRFmroSt4VBVKjv+dypKcO4aWz8IP4G5JbRH0KC0+B8ODuzlUNu9R5MbkGcev/62RDP/JcZ2Q==", - "dev": true, - "requires": { - "resolve": "^1.22.2", - "sass": "^1.63.0" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "peer": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "peer": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - } - } - }, - "eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "peer": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "peer": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "peer": true - } - } - }, - "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "peer": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "peer": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true - } - } - }, - "eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", - "dev": true, - "peer": true, - "requires": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - } - }, - "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "peer": true, - "requires": {} - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "peer": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "peer": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.6.2", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "peer": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "peer": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "peer": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "peer": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "peer": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "peer": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "peer": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "peer": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "peer": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" - }, - "highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==" - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "peer": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" - }, - "is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "peer": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "peer": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "requires": { - "lodash.isfinite": "^3.3.2" - } - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "peer": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "peer": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", - "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", - "dev": true, - "requires": { - "@jest/core": "^29.6.2", - "@jest/types": "^29.6.1", - "import-local": "^3.0.2", - "jest-cli": "^29.6.2" - } - }, - "jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", - "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", - "dev": true, - "requires": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.2", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "p-limit": "^3.1.0", - "pretty-format": "^29.6.2", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", - "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", - "dev": true, - "requires": { - "@jest/core": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", - "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-jest": "^29.6.2", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.2", - "jest-environment-node": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" - } - }, - "jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", - "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.6.2", - "pretty-format": "^29.6.2" - } - }, - "jest-environment-node": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", - "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" - } - }, - "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", - "dev": true - }, - "jest-haste-map": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", - "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", - "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", - "dev": true, - "requires": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" - } - }, - "jest-matcher-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", - "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" - } - }, - "jest-message-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", - "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", - "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-util": "^29.6.2" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", - "dev": true - }, - "jest-resolve": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", - "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", - "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", - "dev": true, - "requires": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.2" - } - }, - "jest-runner": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", - "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", - "dev": true, - "requires": { - "@jest/console": "^29.6.2", - "@jest/environment": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-leak-detector": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-resolve": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-util": "^29.6.2", - "jest-watcher": "^29.6.2", - "jest-worker": "^29.6.2", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", - "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", - "dev": true, - "requires": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/globals": "^29.6.2", - "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } - } - }, - "jest-snapshot": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", - "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.6.2", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^29.6.2", - "semver": "^7.5.3" - } - }, - "jest-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", - "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", - "dev": true, - "requires": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.6.2" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", - "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", - "dev": true, - "requires": { - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.6.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", - "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.6.2", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jquery": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", - "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "khroma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "known-css-properties": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", - "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", - "dev": true - }, - "layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", - "dev": true, - "requires": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "mathjax": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.2.2.tgz", - "integrity": "sha512-Bt+SSVU8eBG27zChVewOicYs7Xsdt40qm4+UpHyX7k0/O9NliPc+x77k1/FEsPsjKPZGJvtRZM1vO+geW0OhGw==" - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true - }, - "mdast-util-from-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz", - "integrity": "sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - } - }, - "mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "requires": { - "@types/mdast": "^3.0.0" - } - }, - "mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "mermaid": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.3.0.tgz", - "integrity": "sha512-H5quxuQjwXC8M1WuuzhAp2TdqGg74t5skfDBrNKJ7dt3z8Wprl5S6h9VJsRhoBUTSs1TMtHEdplLhCqXleZZLw==", - "requires": { - "@braintree/sanitize-url": "^6.0.2", - "@types/d3-scale": "^4.0.3", - "@types/d3-scale-chromatic": "^3.0.0", - "cytoscape": "^3.23.0", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.4.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.10", - "dayjs": "^1.11.7", - "dompurify": "3.0.5", - "elkjs": "^0.8.2", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "mdast-util-from-markdown": "^1.3.0", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.3", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" - } - }, - "micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==" - }, - "micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==" - }, - "micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==" - }, - "micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "peer": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "non-layered-tidy-tree-layout": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "peer": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "peer": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", - "dev": true - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "dev": true, - "requires": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - } - }, - "postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true - }, - "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "requires": {} - }, - "postcss-scss": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", - "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", - "dev": true, - "requires": {} - }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "requires": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "peer": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", - "dev": true, - "requires": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", - "dev": true - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "requires": { - "mri": "^1.1.0" - } - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass": { - "version": "1.63.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", - "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "dependencies": { - "immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true - } - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "socket.io": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.0.tgz", - "integrity": "sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dev": true, - "requires": { - "ws": "~8.11.0" - } - }, - "socket.io-client": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz", - "integrity": "sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.4.0", - "socket.io-parser": "~4.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", - "dev": true - }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", - "dev": true, - "requires": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "peer": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "requires": { - "min-indent": "^1.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, - "stylelint": { - "version": "15.10.2", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.2.tgz", - "integrity": "sha512-UxqSb3hB74g4DTO45QhUHkJMjKKU//lNUAOWyvPBVPZbCknJ5HjOWWZo+UDuhHa9FLeVdHBZXxu43eXkjyIPWg==", - "dev": true, - "requires": { - "@csstools/css-parser-algorithms": "^2.3.0", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/media-query-list-parser": "^2.1.2", - "@csstools/selector-specificity": "^3.0.0", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^8.2.0", - "css-functions-list": "^3.2.0", - "css-tree": "^2.3.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.0", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.3.1", - "ignore": "^5.2.4", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.27.0", - "mathml-tag-names": "^2.1.3", - "meow": "^10.1.5", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.25", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.13", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^3.0.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "write-file-atomic": "^5.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "stylelint-config-recommended": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-12.0.0.tgz", - "integrity": "sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==", - "dev": true, - "requires": {} - }, - "stylelint-config-recommended-scss": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-12.0.0.tgz", - "integrity": "sha512-5Bb2mlGy6WLa30oNeKpZvavv2lowJUsUJO25+OA68GFTemlwd1zbFsL7q0bReKipOSU3sG47hKneZ6Nd+ctrFA==", - "dev": true, - "requires": { - "postcss-scss": "^4.0.6", - "stylelint-config-recommended": "^12.0.0", - "stylelint-scss": "^5.0.0" - } - }, - "stylelint-config-standard": { - "version": "33.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-33.0.0.tgz", - "integrity": "sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^12.0.0" - } - }, - "stylelint-config-standard-scss": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-10.0.0.tgz", - "integrity": "sha512-bChBEo1p3xUVWh/wenJI+josoMk21f2yuLDGzGjmKYcALfl2u3DFltY+n4UHswYiXghqXaA8mRh+bFy/q1hQlg==", - "dev": true, - "requires": { - "stylelint-config-recommended-scss": "^12.0.0", - "stylelint-config-standard": "^33.0.0" - } - }, - "stylelint-scss": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.0.1.tgz", - "integrity": "sha512-n87iCRZrr2J7//I/QFsDXxFLnHKw633U4qvWZ+mOW6KDAp/HLj06H+6+f9zOuTYy+MdGdTuCSDROCpQIhw5fvQ==", - "dev": true, - "requires": { - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.13", - "postcss-value-parser": "^4.2.0" - } - }, - "stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true - }, - "ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", - "dev": true, - "requires": {} - }, - "ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==" - }, - "ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "peer": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true - }, - "ua-parser-js": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", - "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "requires": { - "@types/unist": "^2.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "dependencies": { - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - } - } - }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "peer": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "peer": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", - "dev": true - } - } - }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} - }, - "xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/docs/templates/wpfui/layout/_master.tmpl b/docs/templates/wpfui/layout/_master.tmpl index d58da696a..4a8f59273 100644 --- a/docs/templates/wpfui/layout/_master.tmpl +++ b/docs/templates/wpfui/layout/_master.tmpl @@ -134,7 +134,7 @@ diff --git a/docs/toc.yml b/docs/toc.yml index e6a1c8dc1..61f9348b2 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -26,5 +26,7 @@ items: href: documentation/gallery.md - name: Releases href: documentation/releases.md - - name: API + - name: API v4.0 href: api/ + - name: Support plans + href: https://lepo.co/support diff --git a/nuget.config b/nuget.config index 6eca12a6b..3a370b5ed 100644 --- a/nuget.config +++ b/nuget.config @@ -1,4 +1,3 @@ - @@ -6,6 +5,7 @@ + diff --git a/src/Wpf.Ui.Demo.Console/Usings.cs b/samples/Wpf.Ui.Demo.Console/GlobalUsings.cs similarity index 89% rename from src/Wpf.Ui.Demo.Console/Usings.cs rename to samples/Wpf.Ui.Demo.Console/GlobalUsings.cs index 35c99c21d..248984198 100644 --- a/src/Wpf.Ui.Demo.Console/Usings.cs +++ b/samples/Wpf.Ui.Demo.Console/GlobalUsings.cs @@ -4,7 +4,7 @@ // All Rights Reserved. global using System; -global using System.Linq; +global using System.Collections.ObjectModel; global using System.Threading; global using System.Windows; global using System.Windows.Media; diff --git a/src/Wpf.Ui.Demo.Console/Models/DataColor.cs b/samples/Wpf.Ui.Demo.Console/Models/DataColor.cs similarity index 100% rename from src/Wpf.Ui.Demo.Console/Models/DataColor.cs rename to samples/Wpf.Ui.Demo.Console/Models/DataColor.cs diff --git a/src/Wpf.Ui.Demo.Console/Program.cs b/samples/Wpf.Ui.Demo.Console/Program.cs similarity index 83% rename from src/Wpf.Ui.Demo.Console/Program.cs rename to samples/Wpf.Ui.Demo.Console/Program.cs index 515e5e98a..2a98c56cc 100644 --- a/src/Wpf.Ui.Demo.Console/Program.cs +++ b/samples/Wpf.Ui.Demo.Console/Program.cs @@ -3,14 +3,18 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Diagnostics; + public static class Program { [STAThread] public static void Main(string[] args) { + Debug.WriteLine("Args: " + string.Join(", ", args)); + if (Application.Current is null) { - Console.WriteLine($"Application.Current is null."); + Console.WriteLine("Application.Current is null."); } try diff --git a/src/Wpf.Ui.Demo.Console/Utilities/ThemeUtilities.cs b/samples/Wpf.Ui.Demo.Console/Utilities/ThemeUtilities.cs similarity index 60% rename from src/Wpf.Ui.Demo.Console/Utilities/ThemeUtilities.cs rename to samples/Wpf.Ui.Demo.Console/Utilities/ThemeUtilities.cs index fe37e05ce..2d5489eea 100644 --- a/src/Wpf.Ui.Demo.Console/Utilities/ThemeUtilities.cs +++ b/samples/Wpf.Ui.Demo.Console/Utilities/ThemeUtilities.cs @@ -3,34 +3,37 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Wpf.Ui; using Wpf.Ui.Appearance; +namespace Wpf.Ui.Demo.Console.Utilities; + public static class ThemeUtilities { public static void ApplyTheme(this FrameworkElement frameworkElement) { ApplicationThemeManager.Apply(frameworkElement); - ThemeChangedEvent themeChanged = (sender, args) => + void themeChanged(ApplicationTheme sender, Color args) { ApplicationThemeManager.Apply(frameworkElement); if (frameworkElement is Window window) { if (window != UiApplication.Current.MainWindow) + { WindowBackgroundManager.UpdateBackground( window, sender, - Wpf.Ui.Controls.WindowBackdropType.None, - true + Wpf.Ui.Controls.WindowBackdropType.None ); + } } - }; + } if (frameworkElement.IsLoaded) { ApplicationThemeManager.Changed += themeChanged; } + frameworkElement.Loaded += (s, e) => { ApplicationThemeManager.Changed += themeChanged; @@ -84,48 +87,4 @@ public static void ChangeTheme() ApplicationThemeManager.Apply(applicationTheme, updateAccent: false); } - - /// - /// Applies Resources in the . - /// - private static void Apply(FrameworkElement frameworkElement) - { - if (frameworkElement is null) - { - return; - } - - ResourceDictionary[] resourcesRemove = frameworkElement - .Resources.MergedDictionaries.Where(e => e.Source is not null) - //.Where(e => e.Source.ToString().ToLower().Contains(Wpf.Ui.Appearance.ApplicationThemeManager.LibraryNamespace)) - .Where(e => e.Source.ToString().ToLower().Contains("Wpf.Ui;")) - .ToArray(); - - foreach (ResourceDictionary? resource in resourcesRemove) - { - //System.Console.WriteLine( - // $"INFO | {typeof(MainView)} Remove {resource.Source}", - // "Wpf.Ui.Appearance" - //); - frameworkElement.Resources.MergedDictionaries.Remove(resource); - } - - foreach (ResourceDictionary? resource in UiApplication.Current.Resources.MergedDictionaries) - { - //System.Console.WriteLine( - // $"INFO | {typeof(MainView)} Add {resource.Source}", - // "Wpf.Ui.Appearance" - //); - frameworkElement.Resources.MergedDictionaries.Add(resource); - } - - foreach (System.Collections.DictionaryEntry resource in UiApplication.Current.Resources) - { - //System.Console.WriteLine( - // $"INFO | {typeof(MainView)} Copy Resource {resource.Key} - {resource.Value}", - // "Wpf.Ui.Appearance" - //); - frameworkElement.Resources[resource.Key] = resource.Value; - } - } } diff --git a/src/Wpf.Ui.Demo.Console/Views/MainView.xaml b/samples/Wpf.Ui.Demo.Console/Views/MainView.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Console/Views/MainView.xaml rename to samples/Wpf.Ui.Demo.Console/Views/MainView.xaml diff --git a/src/Wpf.Ui.Demo.Console/Views/MainView.xaml.cs b/samples/Wpf.Ui.Demo.Console/Views/MainView.xaml.cs similarity index 94% rename from src/Wpf.Ui.Demo.Console/Views/MainView.xaml.cs rename to samples/Wpf.Ui.Demo.Console/Views/MainView.xaml.cs index 06558a6dc..6e89233ce 100644 --- a/src/Wpf.Ui.Demo.Console/Views/MainView.xaml.cs +++ b/samples/Wpf.Ui.Demo.Console/Views/MainView.xaml.cs @@ -3,6 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using Wpf.Ui.Demo.Console.Utilities; using Wpf.Ui.Demo.Console.Views.Pages; namespace Wpf.Ui.Demo.Console.Views; diff --git a/src/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml b/samples/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml rename to samples/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml diff --git a/src/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml.cs b/samples/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml.cs similarity index 96% rename from src/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml.cs rename to samples/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml.cs index bde1eeccb..924b76d0d 100644 --- a/src/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Console/Views/Pages/DashboardPage.xaml.cs @@ -3,6 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using Wpf.Ui.Demo.Console.Utilities; + namespace Wpf.Ui.Demo.Console.Views.Pages; /// diff --git a/src/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml b/samples/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml rename to samples/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml diff --git a/src/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml.cs b/samples/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml.cs similarity index 90% rename from src/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml.cs rename to samples/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml.cs index 023c4dc75..53bcf80c3 100644 --- a/src/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Console/Views/Pages/DataPage.xaml.cs @@ -3,8 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Collections.ObjectModel; using Wpf.Ui.Demo.Console.Models; +using Wpf.Ui.Demo.Console.Utilities; namespace Wpf.Ui.Demo.Console.Views.Pages; @@ -13,7 +13,7 @@ namespace Wpf.Ui.Demo.Console.Views.Pages; /// public partial class DataPage { - public ObservableCollection ColorsCollection = new(); + public ObservableCollection ColorsCollection = []; public DataPage() { @@ -30,6 +30,7 @@ private void InitializeData() var random = new Random(); for (int i = 0; i < 8192; i++) + { ColorsCollection.Add( new DataColor { @@ -43,5 +44,6 @@ private void InitializeData() ) } ); + } } } diff --git a/src/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml b/samples/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml rename to samples/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml diff --git a/src/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml.cs b/samples/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml.cs similarity index 95% rename from src/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml.cs rename to samples/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml.cs index e8e900114..7fc2e25e4 100644 --- a/src/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Console/Views/Pages/SettingsPage.xaml.cs @@ -4,6 +4,7 @@ // All Rights Reserved. using Wpf.Ui.Appearance; +using Wpf.Ui.Demo.Console.Utilities; namespace Wpf.Ui.Demo.Console.Views.Pages; @@ -43,6 +44,6 @@ private void OnDarkThemeRadioButtonChecked(object sender, RoutedEventArgs e) private string GetAssemblyVersion() { return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() - ?? String.Empty; + ?? string.Empty; } } diff --git a/src/Wpf.Ui.Demo.Console/Views/SimpleView.xaml b/samples/Wpf.Ui.Demo.Console/Views/SimpleView.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Console/Views/SimpleView.xaml rename to samples/Wpf.Ui.Demo.Console/Views/SimpleView.xaml diff --git a/src/Wpf.Ui.Demo.Console/Views/SimpleView.xaml.cs b/samples/Wpf.Ui.Demo.Console/Views/SimpleView.xaml.cs similarity index 93% rename from src/Wpf.Ui.Demo.Console/Views/SimpleView.xaml.cs rename to samples/Wpf.Ui.Demo.Console/Views/SimpleView.xaml.cs index 311fee3be..3d14fb4aa 100644 --- a/src/Wpf.Ui.Demo.Console/Views/SimpleView.xaml.cs +++ b/samples/Wpf.Ui.Demo.Console/Views/SimpleView.xaml.cs @@ -3,6 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using Wpf.Ui.Demo.Console.Utilities; + namespace Wpf.Ui.Demo.Console.Views; public partial class SimpleView diff --git a/src/Wpf.Ui.Demo.Console/Wpf.Ui.Demo.Console.csproj b/samples/Wpf.Ui.Demo.Console/Wpf.Ui.Demo.Console.csproj similarity index 58% rename from src/Wpf.Ui.Demo.Console/Wpf.Ui.Demo.Console.csproj rename to samples/Wpf.Ui.Demo.Console/Wpf.Ui.Demo.Console.csproj index fb5496e36..42039ff40 100644 --- a/src/Wpf.Ui.Demo.Console/Wpf.Ui.Demo.Console.csproj +++ b/samples/Wpf.Ui.Demo.Console/Wpf.Ui.Demo.Console.csproj @@ -2,12 +2,11 @@ Exe - net4.8 - false - enable + net472 true wpfui.ico $(NoWarn);SA1601 + True @@ -19,7 +18,7 @@ - + @@ -28,4 +27,11 @@ + + + all + build; analyzers + + + diff --git a/src/Wpf.Ui.Demo.Console/wpfui.ico b/samples/Wpf.Ui.Demo.Console/wpfui.ico similarity index 100% rename from src/Wpf.Ui.Demo.Console/wpfui.ico rename to samples/Wpf.Ui.Demo.Console/wpfui.ico diff --git a/samples/Wpf.Ui.Demo.Dialogs/App.xaml b/samples/Wpf.Ui.Demo.Dialogs/App.xaml new file mode 100644 index 000000000..6caa7edc6 --- /dev/null +++ b/samples/Wpf.Ui.Demo.Dialogs/App.xaml @@ -0,0 +1,5 @@ + diff --git a/samples/Wpf.Ui.Demo.Dialogs/App.xaml.cs b/samples/Wpf.Ui.Demo.Dialogs/App.xaml.cs new file mode 100644 index 000000000..67474fc64 --- /dev/null +++ b/samples/Wpf.Ui.Demo.Dialogs/App.xaml.cs @@ -0,0 +1,8 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Demo.Dialogs; + +public partial class App; diff --git a/samples/Wpf.Ui.Demo.Dialogs/AssemblyInfo.cs b/samples/Wpf.Ui.Demo.Dialogs/AssemblyInfo.cs new file mode 100644 index 000000000..ac46ec8f1 --- /dev/null +++ b/samples/Wpf.Ui.Demo.Dialogs/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; + +[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] diff --git a/src/Wpf.Ui.Demo.Simple/Assets/applicationIcon-1024.png b/samples/Wpf.Ui.Demo.Dialogs/Assets/applicationIcon-1024.png similarity index 100% rename from src/Wpf.Ui.Demo.Simple/Assets/applicationIcon-1024.png rename to samples/Wpf.Ui.Demo.Dialogs/Assets/applicationIcon-1024.png diff --git a/src/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-256.png b/samples/Wpf.Ui.Demo.Dialogs/Assets/applicationIcon-256.png similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-256.png rename to samples/Wpf.Ui.Demo.Dialogs/Assets/applicationIcon-256.png diff --git a/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml b/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml new file mode 100644 index 000000000..7e6c222d6 --- /dev/null +++ b/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml.cs b/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml.cs new file mode 100644 index 000000000..40eba0dc5 --- /dev/null +++ b/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml.cs @@ -0,0 +1,46 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using Wpf.Ui.Controls; + +namespace Wpf.Ui.Demo.Dialogs; + +public partial class MainWindow +{ + public MainWindow() + { + // Initialize WPF window + InitializeComponent(); + } + + private async void OnShowDialogClick(object sender, RoutedEventArgs e) + { + // Dispatch to the UI queue + await Application.Current.Dispatcher.InvokeAsync(ShowSampleDialogAsync); + } + + private async Task ShowSampleDialogAsync() + { + // Defining dialog object + ContentDialog myDialog = + new() + { + Title = "My sample dialog", + Content = "Content of the dialog", + CloseButtonText = "Close button", + PrimaryButtonText = "Primary button", + SecondaryButtonText = "Secondary button" + }; + + // Setting the dialog container + myDialog.DialogHost = ContentPresenterForDialogs; + + // Showing the dialog + await myDialog.ShowAsync(CancellationToken.None); + } +} diff --git a/samples/Wpf.Ui.Demo.Dialogs/Wpf.Ui.Demo.Dialogs.csproj b/samples/Wpf.Ui.Demo.Dialogs/Wpf.Ui.Demo.Dialogs.csproj new file mode 100644 index 000000000..325164a23 --- /dev/null +++ b/samples/Wpf.Ui.Demo.Dialogs/Wpf.Ui.Demo.Dialogs.csproj @@ -0,0 +1,32 @@ + + + + WinExe + net8.0-windows10.0.22621.0 + 10.0.17763.0 + true + app.manifest + applicationIcon.ico + AnyCPU;x64 + $(NoWarn);SA1601 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Wpf.Ui.Demo.Dialogs/app.manifest b/samples/Wpf.Ui.Demo.Dialogs/app.manifest new file mode 100644 index 000000000..cd5659de5 --- /dev/null +++ b/samples/Wpf.Ui.Demo.Dialogs/app.manifest @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PerMonitor + true/PM + true + + + + + + + + + + diff --git a/src/Wpf.Ui.Demo.Mvvm/applicationIcon.ico b/samples/Wpf.Ui.Demo.Dialogs/applicationIcon.ico similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/applicationIcon.ico rename to samples/Wpf.Ui.Demo.Dialogs/applicationIcon.ico diff --git a/src/Wpf.Ui.Demo.Mvvm/App.xaml b/samples/Wpf.Ui.Demo.Mvvm/App.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/App.xaml rename to samples/Wpf.Ui.Demo.Mvvm/App.xaml diff --git a/src/Wpf.Ui.Demo.Mvvm/App.xaml.cs b/samples/Wpf.Ui.Demo.Mvvm/App.xaml.cs similarity index 60% rename from src/Wpf.Ui.Demo.Mvvm/App.xaml.cs rename to samples/Wpf.Ui.Demo.Mvvm/App.xaml.cs index bf821f1b3..652455eca 100644 --- a/src/Wpf.Ui.Demo.Mvvm/App.xaml.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/App.xaml.cs @@ -1,4 +1,4 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. @@ -7,9 +7,9 @@ using System.Windows.Threading; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; using Wpf.Ui.Demo.Mvvm.Models; using Wpf.Ui.Demo.Mvvm.Services; +using Wpf.Ui.DependencyInjection; namespace Wpf.Ui.Demo.Mvvm; @@ -26,53 +26,54 @@ public partial class App private static readonly IHost _host = Host.CreateDefaultBuilder() .ConfigureAppConfiguration(c => { - c.SetBasePath(Path.GetDirectoryName(AppContext.BaseDirectory)); + var basePath = + Path.GetDirectoryName(AppContext.BaseDirectory) + ?? throw new DirectoryNotFoundException( + "Unable to find the base directory of the application." + ); + _ = c.SetBasePath(basePath); }) .ConfigureServices( (context, services) => { - // App Host - services.AddHostedService(); + _ = services.AddNavigationViewPageProvider(); - // Page resolver service - services.AddSingleton(); + // App Host + _ = services.AddHostedService(); // Theme manipulation - services.AddSingleton(); + _ = services.AddSingleton(); // TaskBar manipulation - services.AddSingleton(); + _ = services.AddSingleton(); // Service containing navigation, same as INavigationWindow... but without window - services.AddSingleton(); + _ = services.AddSingleton(); // Main window with navigation - services.AddSingleton(); - services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); // Views and ViewModels - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); // Configuration - services.Configure(context.Configuration.GetSection(nameof(AppConfig))); + _ = services.Configure(context.Configuration.GetSection(nameof(AppConfig))); } ) .Build(); /// - /// Gets registered service. + /// Gets services. /// - /// Type of the service to get. - /// Instance of the service or . - public static T? GetService() - where T : class + public static IServiceProvider Services { - return _host.Services.GetService(typeof(T)) as T; + get { return _host.Services; } } /// diff --git a/samples/Wpf.Ui.Demo.Mvvm/AssemblyInfo.cs b/samples/Wpf.Ui.Demo.Mvvm/AssemblyInfo.cs new file mode 100644 index 000000000..89adb40fb --- /dev/null +++ b/samples/Wpf.Ui.Demo.Mvvm/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] diff --git a/samples/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-1024.png b/samples/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-1024.png new file mode 100644 index 000000000..b70c4ed59 Binary files /dev/null and b/samples/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-1024.png differ diff --git a/src/Wpf.Ui.Demo.Simple/Assets/applicationIcon-256.png b/samples/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-256.png similarity index 100% rename from src/Wpf.Ui.Demo.Simple/Assets/applicationIcon-256.png rename to samples/Wpf.Ui.Demo.Mvvm/Assets/applicationIcon-256.png diff --git a/samples/Wpf.Ui.Demo.Mvvm/GlobalUsings.cs b/samples/Wpf.Ui.Demo.Mvvm/GlobalUsings.cs new file mode 100644 index 000000000..d01a3845c --- /dev/null +++ b/samples/Wpf.Ui.Demo.Mvvm/GlobalUsings.cs @@ -0,0 +1,15 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +global using System; +global using System.Collections.Generic; +global using System.Globalization; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; +global using System.Windows; +global using CommunityToolkit.Mvvm.ComponentModel; +global using CommunityToolkit.Mvvm.Input; +global using Microsoft.Extensions.Hosting; diff --git a/src/Wpf.Ui.Demo.Mvvm/Helpers/EnumToBooleanConverter.cs b/samples/Wpf.Ui.Demo.Mvvm/Helpers/EnumToBooleanConverter.cs similarity index 83% rename from src/Wpf.Ui.Demo.Mvvm/Helpers/EnumToBooleanConverter.cs rename to samples/Wpf.Ui.Demo.Mvvm/Helpers/EnumToBooleanConverter.cs index 263b2be21..4df817714 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Helpers/EnumToBooleanConverter.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/Helpers/EnumToBooleanConverter.cs @@ -1,9 +1,8 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Globalization; using System.Windows.Data; namespace Wpf.Ui.Demo.Mvvm.Helpers; @@ -12,11 +11,15 @@ internal class EnumToBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - if (parameter is not String enumString) + if (parameter is not string enumString) + { throw new ArgumentException("ExceptionEnumToBooleanConverterParameterMustBeAnEnumName"); + } if (!Enum.IsDefined(typeof(Wpf.Ui.Appearance.ApplicationTheme), value)) + { throw new ArgumentException("ExceptionEnumToBooleanConverterValueMustBeAnEnum"); + } var enumValue = Enum.Parse(typeof(Wpf.Ui.Appearance.ApplicationTheme), enumString); @@ -25,8 +28,10 @@ public object Convert(object value, Type targetType, object parameter, CultureIn public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { - if (parameter is not String enumString) + if (parameter is not string enumString) + { throw new ArgumentException("ExceptionEnumToBooleanConverterParameterMustBeAnEnumName"); + } return Enum.Parse(typeof(Wpf.Ui.Appearance.ApplicationTheme), enumString); } diff --git a/samples/Wpf.Ui.Demo.Mvvm/Models/AppConfig.cs b/samples/Wpf.Ui.Demo.Mvvm/Models/AppConfig.cs new file mode 100644 index 000000000..0779b7a6c --- /dev/null +++ b/samples/Wpf.Ui.Demo.Mvvm/Models/AppConfig.cs @@ -0,0 +1,13 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Demo.Mvvm.Models; + +public class AppConfig +{ + public string? ConfigurationsFolder { get; set; } + + public string? AppPropertiesFileName { get; set; } +} diff --git a/src/Wpf.Ui.Demo.Mvvm/Models/DataColor.cs b/samples/Wpf.Ui.Demo.Mvvm/Models/DataColor.cs similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/Models/DataColor.cs rename to samples/Wpf.Ui.Demo.Mvvm/Models/DataColor.cs diff --git a/src/Wpf.Ui.Demo.Mvvm/Services/ApplicationHostService.cs b/samples/Wpf.Ui.Demo.Mvvm/Services/ApplicationHostService.cs similarity index 69% rename from src/Wpf.Ui.Demo.Mvvm/Services/ApplicationHostService.cs rename to samples/Wpf.Ui.Demo.Mvvm/Services/ApplicationHostService.cs index c627bab09..1c1ed62f6 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Services/ApplicationHostService.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/Services/ApplicationHostService.cs @@ -1,9 +1,8 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Microsoft.Extensions.Hosting; using Wpf.Ui.Demo.Mvvm.Views; namespace Wpf.Ui.Demo.Mvvm.Services; @@ -11,15 +10,9 @@ namespace Wpf.Ui.Demo.Mvvm.Services; /// /// Managed host of the application. /// -public class ApplicationHostService : IHostedService +public class ApplicationHostService(IServiceProvider serviceProvider) : IHostedService { - private readonly IServiceProvider _serviceProvider; - private INavigationWindow _navigationWindow; - - public ApplicationHostService(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } + private INavigationWindow? _navigationWindow; /// /// Triggered when the application host is ready to start the service. @@ -48,12 +41,10 @@ private async Task HandleActivationAsync() if (!Application.Current.Windows.OfType().Any()) { - _navigationWindow = ( - _serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow - )!; + _navigationWindow = (serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow)!; _navigationWindow!.ShowWindow(); - _navigationWindow.Navigate(typeof(Views.Pages.DashboardPage)); + _ = _navigationWindow.Navigate(typeof(Views.Pages.DashboardPage)); } await Task.CompletedTask; diff --git a/src/Wpf.Ui.Demo.Mvvm/ViewModels/DashboardViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DashboardViewModel.cs similarity index 75% rename from src/Wpf.Ui.Demo.Mvvm/ViewModels/DashboardViewModel.cs rename to samples/Wpf.Ui.Demo.Mvvm/ViewModels/DashboardViewModel.cs index 5f0ebdacb..4658c4d7d 100644 --- a/src/Wpf.Ui.Demo.Mvvm/ViewModels/DashboardViewModel.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DashboardViewModel.cs @@ -1,11 +1,11 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. namespace Wpf.Ui.Demo.Mvvm.ViewModels; -public partial class DashboardViewModel : ObservableObject +public partial class DashboardViewModel : ViewModel { [ObservableProperty] private int _counter = 0; diff --git a/src/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs similarity index 71% rename from src/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs rename to samples/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs index c69801289..cbe43ff9c 100644 --- a/src/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs @@ -1,36 +1,36 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. using System.Windows.Media; -using Wpf.Ui.Controls; using Wpf.Ui.Demo.Mvvm.Models; namespace Wpf.Ui.Demo.Mvvm.ViewModels; -public partial class DataViewModel : ObservableObject, INavigationAware +public partial class DataViewModel : ViewModel { private bool _isInitialized = false; [ObservableProperty] - private IEnumerable _colors; + private List _colors = []; - public void OnNavigatedTo() + public override void OnNavigatedTo() { if (!_isInitialized) + { InitializeViewModel(); + } } - public void OnNavigatedFrom() { } - private void InitializeViewModel() { var random = new Random(); - var colorCollection = new List(); + Colors.Clear(); for (int i = 0; i < 8192; i++) - colorCollection.Add( + { + Colors.Add( new DataColor { Color = new SolidColorBrush( @@ -43,8 +43,7 @@ private void InitializeViewModel() ) } ); - - Colors = colorCollection; + } _isInitialized = true; } diff --git a/src/Wpf.Ui.Demo.Mvvm/ViewModels/MainWindowViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/MainWindowViewModel.cs similarity index 66% rename from src/Wpf.Ui.Demo.Mvvm/ViewModels/MainWindowViewModel.cs rename to samples/Wpf.Ui.Demo.Mvvm/ViewModels/MainWindowViewModel.cs index 08e56af05..079533861 100644 --- a/src/Wpf.Ui.Demo.Mvvm/ViewModels/MainWindowViewModel.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/MainWindowViewModel.cs @@ -1,4 +1,4 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. @@ -8,34 +8,41 @@ namespace Wpf.Ui.Demo.Mvvm.ViewModels; -public partial class MainWindowViewModel : ObservableObject +public partial class MainWindowViewModel : ViewModel { private bool _isInitialized = false; [ObservableProperty] - private string _applicationTitle = String.Empty; + private string _applicationTitle = string.Empty; [ObservableProperty] - private ObservableCollection _navigationItems = new(); + private ObservableCollection _navigationItems = []; [ObservableProperty] - private ObservableCollection _navigationFooter = new(); + private ObservableCollection _navigationFooter = []; [ObservableProperty] - private ObservableCollection _trayMenuItems = new(); + private ObservableCollection _trayMenuItems = []; + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Style", + "IDE0060:Remove unused parameter", + Justification = "Demo" + )] public MainWindowViewModel(INavigationService navigationService) { if (!_isInitialized) + { InitializeViewModel(); + } } private void InitializeViewModel() { ApplicationTitle = "WPF UI - MVVM Demo"; - NavigationItems = new ObservableCollection - { + NavigationItems = + [ new NavigationViewItem() { Content = "Home", @@ -47,23 +54,20 @@ private void InitializeViewModel() Content = "Data", Icon = new SymbolIcon { Symbol = SymbolRegular.DataHistogram24 }, TargetPageType = typeof(Views.Pages.DataPage) - } - }; + }, + ]; - NavigationFooter = new ObservableCollection - { + NavigationFooter = + [ new NavigationViewItem() { Content = "Settings", Icon = new SymbolIcon { Symbol = SymbolRegular.Settings24 }, TargetPageType = typeof(Views.Pages.SettingsPage) - } - }; + }, + ]; - TrayMenuItems = new ObservableCollection - { - new MenuItem { Header = "Home", Tag = "tray_home" } - }; + TrayMenuItems = [new() { Header = "Home", Tag = "tray_home" }]; _isInitialized = true; } diff --git a/src/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs similarity index 85% rename from src/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs rename to samples/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs index 86c56258f..5b6faa818 100644 --- a/src/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs @@ -3,16 +3,14 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Wpf.Ui.Controls; - namespace Wpf.Ui.Demo.Mvvm.ViewModels; -public partial class SettingsViewModel : ObservableObject, INavigationAware +public partial class SettingsViewModel : ViewModel { private bool _isInitialized = false; [ObservableProperty] - private string _appVersion = String.Empty; + private string _appVersion = string.Empty; [ObservableProperty] private Wpf.Ui.Appearance.ApplicationTheme _currentApplicationTheme = Wpf.Ui @@ -20,14 +18,14 @@ public partial class SettingsViewModel : ObservableObject, INavigationAware .ApplicationTheme .Unknown; - public void OnNavigatedTo() + public override void OnNavigatedTo() { if (!_isInitialized) + { InitializeViewModel(); + } } - public void OnNavigatedFrom() { } - private void InitializeViewModel() { CurrentApplicationTheme = Wpf.Ui.Appearance.ApplicationThemeManager.GetAppTheme(); @@ -36,10 +34,10 @@ private void InitializeViewModel() _isInitialized = true; } - private string GetAssemblyVersion() + private static string GetAssemblyVersion() { return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() - ?? String.Empty; + ?? string.Empty; } [RelayCommand] @@ -49,7 +47,9 @@ private void OnChangeTheme(string parameter) { case "theme_light": if (CurrentApplicationTheme == Wpf.Ui.Appearance.ApplicationTheme.Light) + { break; + } Wpf.Ui.Appearance.ApplicationThemeManager.Apply(Wpf.Ui.Appearance.ApplicationTheme.Light); CurrentApplicationTheme = Wpf.Ui.Appearance.ApplicationTheme.Light; @@ -58,7 +58,9 @@ private void OnChangeTheme(string parameter) default: if (CurrentApplicationTheme == Wpf.Ui.Appearance.ApplicationTheme.Dark) + { break; + } Wpf.Ui.Appearance.ApplicationThemeManager.Apply(Wpf.Ui.Appearance.ApplicationTheme.Dark); CurrentApplicationTheme = Wpf.Ui.Appearance.ApplicationTheme.Dark; diff --git a/samples/Wpf.Ui.Demo.Mvvm/ViewModels/ViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/ViewModel.cs new file mode 100644 index 000000000..b96b71e2f --- /dev/null +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/ViewModel.cs @@ -0,0 +1,39 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using Wpf.Ui.Abstractions.Controls; + +namespace Wpf.Ui.Demo.Mvvm.ViewModels; + +public abstract class ViewModel : ObservableObject, INavigationAware +{ + /// + public virtual Task OnNavigatedToAsync() + { + OnNavigatedTo(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired after the component is navigated to. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedTo() { } + + /// + public virtual Task OnNavigatedFromAsync() + { + OnNavigatedFrom(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired before the component is navigated from. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedFrom() { } +} diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml b/samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml rename to samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml.cs b/samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml.cs similarity index 79% rename from src/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml.cs rename to samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml.cs index a6dd4a9a0..86e7c71ab 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml.cs @@ -3,6 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using Wpf.Ui.Abstractions; using Wpf.Ui.Controls; namespace Wpf.Ui.Demo.Mvvm.Views; @@ -14,11 +15,7 @@ public partial class MainWindow : INavigationWindow { public ViewModels.MainWindowViewModel ViewModel { get; } - public MainWindow( - ViewModels.MainWindowViewModel viewModel, - IPageService pageService, - INavigationService navigationService - ) + public MainWindow(ViewModels.MainWindowViewModel viewModel, INavigationService navigationService) { ViewModel = viewModel; DataContext = this; @@ -26,25 +23,21 @@ INavigationService navigationService Appearance.SystemThemeWatcher.Watch(this); InitializeComponent(); - SetPageService(pageService); navigationService.SetNavigationControl(RootNavigation); } - #region INavigationWindow methods - public INavigationView GetNavigation() => RootNavigation; public bool Navigate(Type pageType) => RootNavigation.Navigate(pageType); - public void SetPageService(IPageService pageService) => RootNavigation.SetPageService(pageService); + public void SetPageService(INavigationViewPageProvider navigationViewPageProvider) => + RootNavigation.SetPageProviderService(navigationViewPageProvider); public void ShowWindow() => Show(); public void CloseWindow() => Close(); - #endregion INavigationWindow methods - /// /// Raises the closed event. /// diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml rename to samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml.cs b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml.cs similarity index 85% rename from src/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml.cs rename to samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml.cs index e56b545e7..7aea5e908 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DashboardPage.xaml.cs @@ -1,9 +1,9 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Wpf.Ui.Controls; +using Wpf.Ui.Abstractions.Controls; namespace Wpf.Ui.Demo.Mvvm.Views.Pages; diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml rename to samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml.cs b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml.cs similarity index 85% rename from src/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml.cs rename to samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml.cs index 9a1f38ff3..43330c98a 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/DataPage.xaml.cs @@ -1,9 +1,9 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Wpf.Ui.Controls; +using Wpf.Ui.Abstractions.Controls; namespace Wpf.Ui.Demo.Mvvm.Views.Pages; diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml rename to samples/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml diff --git a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml.cs b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml.cs similarity index 85% rename from src/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml.cs rename to samples/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml.cs index 1abdff60e..4af851510 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/Views/Pages/SettingsPage.xaml.cs @@ -1,9 +1,9 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Wpf.Ui.Controls; +using Wpf.Ui.Abstractions.Controls; namespace Wpf.Ui.Demo.Mvvm.Views.Pages; diff --git a/src/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj b/samples/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj similarity index 57% rename from src/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj rename to samples/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj index 1f3462e02..7e24cbdd1 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj +++ b/samples/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj @@ -4,8 +4,6 @@ WinExe net8.0-windows10.0.22621.0 10.0.17763.0 - enable - enable true app.manifest applicationIcon.ico @@ -28,9 +26,10 @@ - - - + + + + @@ -38,15 +37,4 @@ - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/src/Wpf.Ui.Demo.Mvvm/app.manifest b/samples/Wpf.Ui.Demo.Mvvm/app.manifest similarity index 100% rename from src/Wpf.Ui.Demo.Mvvm/app.manifest rename to samples/Wpf.Ui.Demo.Mvvm/app.manifest diff --git a/src/Wpf.Ui.Demo.Simple/applicationIcon.ico b/samples/Wpf.Ui.Demo.Mvvm/applicationIcon.ico similarity index 100% rename from src/Wpf.Ui.Demo.Simple/applicationIcon.ico rename to samples/Wpf.Ui.Demo.Mvvm/applicationIcon.ico diff --git a/src/Wpf.Ui.Demo.Simple/App.xaml b/samples/Wpf.Ui.Demo.Simple/App.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Simple/App.xaml rename to samples/Wpf.Ui.Demo.Simple/App.xaml diff --git a/src/Wpf.Ui.Demo.Simple/App.xaml.cs b/samples/Wpf.Ui.Demo.Simple/App.xaml.cs similarity index 100% rename from src/Wpf.Ui.Demo.Simple/App.xaml.cs rename to samples/Wpf.Ui.Demo.Simple/App.xaml.cs diff --git a/samples/Wpf.Ui.Demo.Simple/AssemblyInfo.cs b/samples/Wpf.Ui.Demo.Simple/AssemblyInfo.cs new file mode 100644 index 000000000..b8f7eb71b --- /dev/null +++ b/samples/Wpf.Ui.Demo.Simple/AssemblyInfo.cs @@ -0,0 +1,11 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located (used if a resource is not found in the page, or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly // where the generic resource dictionary is located (used if a resource is not found in the page, app, or any theme specific resource dictionaries) +)] diff --git a/samples/Wpf.Ui.Demo.Simple/Assets/applicationIcon-1024.png b/samples/Wpf.Ui.Demo.Simple/Assets/applicationIcon-1024.png new file mode 100644 index 000000000..b70c4ed59 Binary files /dev/null and b/samples/Wpf.Ui.Demo.Simple/Assets/applicationIcon-1024.png differ diff --git a/samples/Wpf.Ui.Demo.Simple/Assets/applicationIcon-256.png b/samples/Wpf.Ui.Demo.Simple/Assets/applicationIcon-256.png new file mode 100644 index 000000000..6b5cf5d5a Binary files /dev/null and b/samples/Wpf.Ui.Demo.Simple/Assets/applicationIcon-256.png differ diff --git a/src/Wpf.Ui.Demo.Simple/MainWindow.xaml b/samples/Wpf.Ui.Demo.Simple/MainWindow.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Simple/MainWindow.xaml rename to samples/Wpf.Ui.Demo.Simple/MainWindow.xaml diff --git a/src/Wpf.Ui.Demo.Simple/MainWindow.xaml.cs b/samples/Wpf.Ui.Demo.Simple/MainWindow.xaml.cs similarity index 100% rename from src/Wpf.Ui.Demo.Simple/MainWindow.xaml.cs rename to samples/Wpf.Ui.Demo.Simple/MainWindow.xaml.cs diff --git a/src/Wpf.Ui.Demo.Simple/Models/DataColor.cs b/samples/Wpf.Ui.Demo.Simple/Models/DataColor.cs similarity index 100% rename from src/Wpf.Ui.Demo.Simple/Models/DataColor.cs rename to samples/Wpf.Ui.Demo.Simple/Models/DataColor.cs diff --git a/src/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml b/samples/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml rename to samples/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml diff --git a/src/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml.cs b/samples/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml.cs similarity index 100% rename from src/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml.cs rename to samples/Wpf.Ui.Demo.Simple/Views/Pages/DashboardPage.xaml.cs diff --git a/src/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml b/samples/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml rename to samples/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml diff --git a/src/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml.cs b/samples/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml.cs similarity index 87% rename from src/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml.cs rename to samples/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml.cs index 577720b35..99dc09c0b 100644 --- a/src/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Simple/Views/Pages/DataPage.xaml.cs @@ -1,4 +1,4 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. @@ -15,7 +15,7 @@ namespace Wpf.Ui.Demo.Simple.Views.Pages; /// public partial class DataPage { - public ObservableCollection ColorsCollection = new(); + public ObservableCollection ColorsCollection { get; private set; } = []; public DataPage() { @@ -30,6 +30,7 @@ private void InitializeData() var random = new Random(); for (int i = 0; i < 8192; i++) + { ColorsCollection.Add( new DataColor { @@ -43,5 +44,6 @@ private void InitializeData() ) } ); + } } } diff --git a/src/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml b/samples/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml similarity index 100% rename from src/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml rename to samples/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml diff --git a/src/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml.cs b/samples/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml.cs similarity index 94% rename from src/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml.cs rename to samples/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml.cs index e48c18e52..f040ce5ca 100644 --- a/src/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml.cs +++ b/samples/Wpf.Ui.Demo.Simple/Views/Pages/SettingsPage.xaml.cs @@ -40,9 +40,9 @@ private void OnDarkThemeRadioButtonChecked(object sender, RoutedEventArgs e) Appearance.ApplicationThemeManager.Apply(ApplicationTheme.Dark); } - private string GetAssemblyVersion() + private static string GetAssemblyVersion() { return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() - ?? String.Empty; + ?? string.Empty; } } diff --git a/src/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj b/samples/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj similarity index 54% rename from src/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj rename to samples/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj index 1d6697725..ea1f29ef8 100644 --- a/src/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj +++ b/samples/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj @@ -4,7 +4,6 @@ WinExe net8.0-windows10.0.22621.0 10.0.17763.0 - enable true app.manifest applicationIcon.ico @@ -22,9 +21,9 @@ - - - + + + @@ -32,15 +31,4 @@ - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/src/Wpf.Ui.Demo.Simple/app.manifest b/samples/Wpf.Ui.Demo.Simple/app.manifest similarity index 100% rename from src/Wpf.Ui.Demo.Simple/app.manifest rename to samples/Wpf.Ui.Demo.Simple/app.manifest diff --git a/samples/Wpf.Ui.Demo.Simple/applicationIcon.ico b/samples/Wpf.Ui.Demo.Simple/applicationIcon.ico new file mode 100644 index 000000000..cc128fda3 Binary files /dev/null and b/samples/Wpf.Ui.Demo.Simple/applicationIcon.ico differ diff --git a/src/Wpf.Ui/Controls/NavigationView/INavigableView.cs b/src/Wpf.Ui.Abstractions/Controls/INavigableView.cs similarity index 59% rename from src/Wpf.Ui/Controls/NavigationView/INavigableView.cs rename to src/Wpf.Ui.Abstractions/Controls/INavigableView.cs index 9cd23d8b7..a7057c3f9 100644 --- a/src/Wpf.Ui/Controls/NavigationView/INavigableView.cs +++ b/src/Wpf.Ui.Abstractions/Controls/INavigableView.cs @@ -3,17 +3,17 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -// ReSharper disable once CheckNamespace -namespace Wpf.Ui.Controls; +namespace Wpf.Ui.Abstractions.Controls; /// -/// A component whose ViewModel is separate from the DataContext and can be navigated by . +/// A component whose ViewModel is separate from the DataContext and can be navigated by INavigationView. /// +/// The type of the ViewModel associated with the view. This type optionally may implement to participate in navigation processes. public interface INavigableView { /// - /// ViewModel used by the view. - /// Optionally, it may implement and be navigated by . + /// Gets the view model used by the view. + /// Optionally, it may implement and be navigated by INavigationView. /// T ViewModel { get; } } diff --git a/src/Wpf.Ui/Controls/NavigationView/INavigationAware.cs b/src/Wpf.Ui.Abstractions/Controls/INavigationAware.cs similarity index 50% rename from src/Wpf.Ui/Controls/NavigationView/INavigationAware.cs rename to src/Wpf.Ui.Abstractions/Controls/INavigationAware.cs index 586aedbd6..8843b52cb 100644 --- a/src/Wpf.Ui/Controls/NavigationView/INavigationAware.cs +++ b/src/Wpf.Ui.Abstractions/Controls/INavigationAware.cs @@ -3,8 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -// ReSharper disable once CheckNamespace -namespace Wpf.Ui.Controls; +namespace Wpf.Ui.Abstractions.Controls; /// /// Notifies class about being navigated. @@ -12,12 +11,15 @@ namespace Wpf.Ui.Controls; public interface INavigationAware { /// - /// Method triggered when the class is navigated. + /// Asynchronously handles the event that is fired after the component is navigated to. /// - void OnNavigatedTo(); + /// A task that represents the asynchronous operation. + + Task OnNavigatedToAsync(); /// - /// Method triggered when the navigation leaves the current class. + /// Asynchronously handles the event that is fired before the component is navigated from. /// - void OnNavigatedFrom(); + /// A task that represents the asynchronous operation. + Task OnNavigatedFromAsync(); } diff --git a/src/Wpf.Ui.Abstractions/Controls/NavigationAware.cs b/src/Wpf.Ui.Abstractions/Controls/NavigationAware.cs new file mode 100644 index 000000000..2c371d80f --- /dev/null +++ b/src/Wpf.Ui.Abstractions/Controls/NavigationAware.cs @@ -0,0 +1,40 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Abstractions.Controls; + +/// +/// Provides a base class for navigation-aware components. +/// +public abstract class NavigationAware : INavigationAware +{ + /// + public virtual Task OnNavigatedToAsync() + { + OnNavigatedTo(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired after the component is navigated to. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedTo() { } + + /// + public virtual Task OnNavigatedFromAsync() + { + OnNavigatedFrom(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired before the component is navigated from. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedFrom() { } +} diff --git a/src/Wpf.Ui.Abstractions/GlobalUsings.cs b/src/Wpf.Ui.Abstractions/GlobalUsings.cs new file mode 100644 index 000000000..2f59ea353 --- /dev/null +++ b/src/Wpf.Ui.Abstractions/GlobalUsings.cs @@ -0,0 +1,7 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +global using System; +global using System.Threading.Tasks; diff --git a/src/Wpf.Ui.Abstractions/INavigationViewPageProvider.cs b/src/Wpf.Ui.Abstractions/INavigationViewPageProvider.cs new file mode 100644 index 000000000..d983f743b --- /dev/null +++ b/src/Wpf.Ui.Abstractions/INavigationViewPageProvider.cs @@ -0,0 +1,19 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Abstractions; + +/// +/// Defines a service that provides pages for navigation. +/// +public interface INavigationViewPageProvider +{ + /// + /// Retrieves a page of the specified type. + /// + /// The type of the page to retrieve. + /// An instance of the specified page type, or null if the page is not found. + public object? GetPage(Type pageType); +} diff --git a/src/Wpf.Ui.Abstractions/NavigationException.cs b/src/Wpf.Ui.Abstractions/NavigationException.cs new file mode 100644 index 000000000..ccf3b9981 --- /dev/null +++ b/src/Wpf.Ui.Abstractions/NavigationException.cs @@ -0,0 +1,27 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Abstractions; + +/// +/// Represents errors that occur during navigation. +/// +public sealed class NavigationException : Exception +{ + /// + /// Initializes a new instance of the NavigationException class with a specified error message. + /// + /// The message that describes the error. + public NavigationException(string message) + : base(message) { } + + /// + /// Initializes a new instance of the NavigationException class with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// The exception that is the cause of the current exception. + /// The message that describes the error. + public NavigationException(Exception e, string message) + : base(message, e) { } +} diff --git a/src/Wpf.Ui.Abstractions/NavigationViewPageProviderExtensions.cs b/src/Wpf.Ui.Abstractions/NavigationViewPageProviderExtensions.cs new file mode 100644 index 000000000..a5d4554d8 --- /dev/null +++ b/src/Wpf.Ui.Abstractions/NavigationViewPageProviderExtensions.cs @@ -0,0 +1,39 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Abstractions; + +/// +/// Provides extension methods for the INavigationViewPageProvider interface. +/// +public static class NavigationViewPageProviderExtensions +{ + /// + /// Retrieves a page of the specified type from the page service. + /// + /// The type of the page to retrieve. + /// The page service instance. + /// An instance of the specified page type, or null if the page is not found. + public static TPage? GetPage(this INavigationViewPageProvider navigationViewPageProvider) + where TPage : class + { + return navigationViewPageProvider.GetPage(typeof(TPage)) as TPage; + } + + /// + /// Retrieves a page of the specified type from the page service. + /// Throws a NavigationException if the page is not found. + /// + /// The type of the page to retrieve. + /// The page service instance. + /// An instance of the specified page type. + /// Thrown when the specified page type is not found. + public static TPage GetRequiredPage(this INavigationViewPageProvider navigationViewPageProvider) + where TPage : class + { + return navigationViewPageProvider.GetPage(typeof(TPage)) as TPage + ?? throw new NavigationException($"{typeof(TPage)} page not found."); + } +} diff --git a/src/Wpf.Ui.Abstractions/Wpf.Ui.Abstractions.csproj b/src/Wpf.Ui.Abstractions/Wpf.Ui.Abstractions.csproj new file mode 100644 index 000000000..332b5d0ac --- /dev/null +++ b/src/Wpf.Ui.Abstractions/Wpf.Ui.Abstractions.csproj @@ -0,0 +1,22 @@ + + + + WPF-UI.Abstractions + netstandard2.0;netstandard2.1;net462;net472;net6.0;net8.0;net9.0 + true + Abstractions for the WPF UI. + $(CommonTags);abstractions;standard + + + + + all + build; analyzers + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/src/Wpf.Ui.Demo.Mvvm/AssemblyInfo.cs b/src/Wpf.Ui.Demo.Mvvm/AssemblyInfo.cs deleted file mode 100644 index 0d7e98bef..000000000 --- a/src/Wpf.Ui.Demo.Mvvm/AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -using System.Windows; - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located -//(used if a resource is not found in the page, -// app, or any theme specific resource dictionaries) -)] diff --git a/src/Wpf.Ui.Demo.Mvvm/Services/PageService.cs b/src/Wpf.Ui.Demo.Mvvm/Services/PageService.cs deleted file mode 100644 index 0b0ceb45b..000000000 --- a/src/Wpf.Ui.Demo.Mvvm/Services/PageService.cs +++ /dev/null @@ -1,44 +0,0 @@ -// This Source Code Form is subject to the terms of the MIT License. -// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. -// Copyright (C) Leszek Pomianowski and WPF UI Contributors. -// All Rights Reserved. - -namespace Wpf.Ui.Demo.Mvvm.Services; - -/// -/// Service that provides pages for navigation. -/// -public class PageService : IPageService -{ - /// - /// Service which provides the instances of pages. - /// - private readonly IServiceProvider _serviceProvider; - - /// - /// Creates new instance and attaches the . - /// - public PageService(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - /// - public T? GetPage() - where T : class - { - if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) - throw new InvalidOperationException("The page should be a WPF control."); - - return (T?)_serviceProvider.GetService(typeof(T)); - } - - /// - public FrameworkElement? GetPage(Type pageType) - { - if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) - throw new InvalidOperationException("The page should be a WPF control."); - - return _serviceProvider.GetService(pageType) as FrameworkElement; - } -} diff --git a/src/Wpf.Ui.Demo.Simple/AssemblyInfo.cs b/src/Wpf.Ui.Demo.Simple/AssemblyInfo.cs deleted file mode 100644 index 77c6c5db5..000000000 --- a/src/Wpf.Ui.Demo.Simple/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Windows; - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located -//(used if a resource is not found in the page, -// app, or any theme specific resource dictionaries) -)] diff --git a/src/Wpf.Ui.DependencyInjection/DependencyInjectionNavigationViewPageProvider.cs b/src/Wpf.Ui.DependencyInjection/DependencyInjectionNavigationViewPageProvider.cs new file mode 100644 index 000000000..de5ef1927 --- /dev/null +++ b/src/Wpf.Ui.DependencyInjection/DependencyInjectionNavigationViewPageProvider.cs @@ -0,0 +1,21 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using Wpf.Ui.Abstractions; + +namespace Wpf.Ui.DependencyInjection; + +/// +/// Service that provides pages for navigation. +/// +public class DependencyInjectionNavigationViewPageProvider(IServiceProvider serviceProvider) + : INavigationViewPageProvider +{ + /// + public object? GetPage(Type pageType) + { + return serviceProvider.GetService(pageType); + } +} diff --git a/src/Wpf.Ui.DependencyInjection/GlobalUsings.cs b/src/Wpf.Ui.DependencyInjection/GlobalUsings.cs new file mode 100644 index 000000000..bc3b69a4d --- /dev/null +++ b/src/Wpf.Ui.DependencyInjection/GlobalUsings.cs @@ -0,0 +1,6 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +global using System; diff --git a/src/Wpf.Ui.DependencyInjection/ServiceCollectionExtensions.cs b/src/Wpf.Ui.DependencyInjection/ServiceCollectionExtensions.cs new file mode 100644 index 000000000..71a7be708 --- /dev/null +++ b/src/Wpf.Ui.DependencyInjection/ServiceCollectionExtensions.cs @@ -0,0 +1,31 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using Microsoft.Extensions.DependencyInjection; +using Wpf.Ui.Abstractions; + +namespace Wpf.Ui.DependencyInjection; + +/// +/// Provides extension methods for to support WPF UI navigation and services. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the services necessary for page navigation within a WPF UI NavigationView. + /// + /// The to add the services to. + /// The so that additional calls can be chained. + + public static IServiceCollection AddNavigationViewPageProvider(this IServiceCollection services) + { + _ = services.AddSingleton< + INavigationViewPageProvider, + DependencyInjectionNavigationViewPageProvider + >(); + + return services; + } +} diff --git a/src/Wpf.Ui.DependencyInjection/Wpf.Ui.DependencyInjection.csproj b/src/Wpf.Ui.DependencyInjection/Wpf.Ui.DependencyInjection.csproj new file mode 100644 index 000000000..421efb133 --- /dev/null +++ b/src/Wpf.Ui.DependencyInjection/Wpf.Ui.DependencyInjection.csproj @@ -0,0 +1,27 @@ + + + + WPF-UI.DependencyInjection + netstandard2.0;netstandard2.1;net462;net472;net6.0;net8.0;net9.0 + true + Dependency injection for the WPF UI. + $(CommonTags);dependency;injection;abstractions;standard + + + + + + all + build; analyzers + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/src/Wpf.Ui.Extension.Template.Blank/App.xaml.cs b/src/Wpf.Ui.Extension.Template.Blank/App.xaml.cs index 12f11be2c..2f88101a2 100644 --- a/src/Wpf.Ui.Extension.Template.Blank/App.xaml.cs +++ b/src/Wpf.Ui.Extension.Template.Blank/App.xaml.cs @@ -20,7 +20,7 @@ public partial class App // https://docs.microsoft.com/dotnet/core/extensions/logging private static readonly IHost _host = Host .CreateDefaultBuilder() - .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)); }) + .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(AppContext.BaseDirectory)); }) .ConfigureServices((context, services) => { throw new NotImplementedException("No service or window was registered."); diff --git a/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj b/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj index 1eeee3598..f43c38506 100644 --- a/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj +++ b/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj @@ -5,9 +5,9 @@ net8.0-windows app.manifest wpfui-icon.ico + true enable enable - true @@ -15,7 +15,7 @@ - + diff --git a/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Extension.Template.Blank.csproj b/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Extension.Template.Blank.csproj index 713964ea9..94471a2d0 100644 --- a/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Extension.Template.Blank.csproj +++ b/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Extension.Template.Blank.csproj @@ -10,6 +10,7 @@ 15.0 + win;win-x64;win-arm64 true @@ -20,6 +21,15 @@ 11.0 prompt + + true + bin\arm64\Debug\ + DEBUG;TRACE + full + arm64 + 11.0 + prompt + bin\x64\Release\ TRACE @@ -29,6 +39,15 @@ 11.0 prompt + + bin\arm64\Release\ + TRACE + true + pdbonly + arm64 + 11.0 + prompt + Debug diff --git a/src/Wpf.Ui.Extension.Template.Compact/App.xaml.cs b/src/Wpf.Ui.Extension.Template.Compact/App.xaml.cs index bcedf63e4..5e3346fdd 100644 --- a/src/Wpf.Ui.Extension.Template.Compact/App.xaml.cs +++ b/src/Wpf.Ui.Extension.Template.Compact/App.xaml.cs @@ -25,7 +25,7 @@ public partial class App // https://docs.microsoft.com/dotnet/core/extensions/logging private static readonly IHost _host = Host .CreateDefaultBuilder() - .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)); }) + .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(AppContext.BaseDirectory)); }) .ConfigureServices((context, services) => { services.AddHostedService(); diff --git a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj index 1eeee3598..f43c38506 100644 --- a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj +++ b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj @@ -5,9 +5,9 @@ net8.0-windows app.manifest wpfui-icon.ico + true enable enable - true @@ -15,7 +15,7 @@ - + diff --git a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Extension.Template.Compact.csproj b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Extension.Template.Compact.csproj index 2fe233473..06416f949 100644 --- a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Extension.Template.Compact.csproj +++ b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Extension.Template.Compact.csproj @@ -10,6 +10,7 @@ 15.0 + win;win-x64;win-arm64 true @@ -20,6 +21,15 @@ 11.0 prompt + + true + bin\arm64\Debug\ + DEBUG;TRACE + full + arm64 + 11.0 + prompt + bin\x64\Release\ TRACE @@ -29,6 +39,15 @@ 11.0 prompt + + bin\arm64\Release\ + TRACE + true + pdbonly + arm64 + 11.0 + prompt + Debug diff --git a/src/Wpf.Ui.Extension.Template.Fluent/App.xaml.cs b/src/Wpf.Ui.Extension.Template.Fluent/App.xaml.cs index bcedf63e4..5e3346fdd 100644 --- a/src/Wpf.Ui.Extension.Template.Fluent/App.xaml.cs +++ b/src/Wpf.Ui.Extension.Template.Fluent/App.xaml.cs @@ -25,7 +25,7 @@ public partial class App // https://docs.microsoft.com/dotnet/core/extensions/logging private static readonly IHost _host = Host .CreateDefaultBuilder() - .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)); }) + .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(AppContext.BaseDirectory)); }) .ConfigureServices((context, services) => { services.AddHostedService(); diff --git a/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Extension.Template.Fluent.csproj b/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Extension.Template.Fluent.csproj index 3962d3c05..a327b89c9 100644 --- a/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Extension.Template.Fluent.csproj +++ b/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Extension.Template.Fluent.csproj @@ -10,6 +10,7 @@ 15.0 + win;win-x64;win-arm64 true @@ -20,6 +21,15 @@ 11.0 prompt + + true + bin\arm64\Debug\ + DEBUG;TRACE + full + arm64 + 11.0 + prompt + bin\x64\Release\ TRACE @@ -29,6 +39,15 @@ 11.0 prompt + + bin\arm64\Release\ + TRACE + true + pdbonly + arm64 + 11.0 + prompt + Debug diff --git a/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj b/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj index 833c8384d..6175bde79 100644 --- a/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj +++ b/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj @@ -5,9 +5,9 @@ net8.0-windows app.manifest wpfui-icon.ico + true enable enable - true @@ -15,7 +15,7 @@ - + diff --git a/src/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj b/src/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj index 16be6fe74..e8d50a5a5 100644 --- a/src/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj +++ b/src/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj @@ -2,7 +2,7 @@ 17.0 - win;win-x64 + win;win-x64;win-arm64 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) @@ -15,6 +15,15 @@ 11.0 prompt + + true + bin\arm64\Debug\ + DEBUG;TRACE + full + ARM64 + 11.0 + prompt + bin\x64\Release\ TRACE @@ -24,6 +33,15 @@ 11.0 prompt + + bin\arm64\Release\ + TRACE + true + pdbonly + ARM64 + 11.0 + prompt + Debug @@ -72,7 +90,9 @@ - + + compile; build; native; contentfiles; analyzers; buildtransitive + @@ -114,4 +134,4 @@ - + \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/license.txt b/src/Wpf.Ui.Extension/license.txt index 2f579bda1..4642df15d 100644 --- a/src/Wpf.Ui.Extension/license.txt +++ b/src/Wpf.Ui.Extension/license.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/ +Copyright (c) 2021-2024 Leszek Pomianowski and WPF UI Contributors. https://lepo.co/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/Wpf.Ui.Extension/source.extension.vsixmanifest b/src/Wpf.Ui.Extension/source.extension.vsixmanifest index b1a287dd1..88e080ca7 100644 --- a/src/Wpf.Ui.Extension/source.extension.vsixmanifest +++ b/src/Wpf.Ui.Extension/source.extension.vsixmanifest @@ -1,7 +1,7 @@ - + WPF UI WPF UI provides the Fluent experience in your known and loved WPF framework. Intuitive design, themes, navigation and new immersive controls. All natively and effortlessly. https://github.com/lepoco/wpfui @@ -13,9 +13,12 @@ wpf ui wpfui fluent design winui windows controls custom metro modern xaml toolkit color dark theme lepo net6 net5 net - + amd64 + + arm64 + diff --git a/src/Wpf.Ui.FontMapper/FontSource.cs b/src/Wpf.Ui.FontMapper/FontSource.cs index d3e768da2..ef82fed41 100644 --- a/src/Wpf.Ui.FontMapper/FontSource.cs +++ b/src/Wpf.Ui.FontMapper/FontSource.cs @@ -1,4 +1,9 @@ -namespace Wpf.Ui.FontMapper; +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.FontMapper; class FontSource { @@ -6,7 +11,7 @@ class FontSource public string Description { get; private set; } public string SourcePath { get; } public string DestinationPath { get; } - public IDictionary Contents { get; private set; } + public IDictionary Contents { get; set; } = new Dictionary(); public FontSource(string name, string description, string sourcePath, string destinationPath) { diff --git a/src/Wpf.Ui.FontMapper/GitTag.cs b/src/Wpf.Ui.FontMapper/GitTag.cs index b05c52d12..e4a47f0a4 100644 --- a/src/Wpf.Ui.FontMapper/GitTag.cs +++ b/src/Wpf.Ui.FontMapper/GitTag.cs @@ -1,3 +1,8 @@ -namespace Wpf.Ui.FontMapper; +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.FontMapper; record GitTag(string Ref, string Node_Id, string Url); diff --git a/src/Wpf.Ui.FontMapper/GlobalUsings.cs b/src/Wpf.Ui.FontMapper/GlobalUsings.cs new file mode 100644 index 000000000..93e017b6b --- /dev/null +++ b/src/Wpf.Ui.FontMapper/GlobalUsings.cs @@ -0,0 +1,11 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Text; +global using System.Threading.Tasks; diff --git a/src/Wpf.Ui.FontMapper/Program.cs b/src/Wpf.Ui.FontMapper/Program.cs index 6ffd72f41..31ad36578 100644 --- a/src/Wpf.Ui.FontMapper/Program.cs +++ b/src/Wpf.Ui.FontMapper/Program.cs @@ -3,19 +3,16 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Net.Http; using System.Net.Http.Json; -using System.Text; using Wpf.Ui.FontMapper; Console.WriteLine("Fluent System Icons Mapper"); System.Diagnostics.Debug.WriteLine("INFO | Fluent System Icons Mapper", "Wpf.Ui.FontMapper"); -var workingDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); - -if (workingDirectory is null) -{ - throw new ArgumentNullException(nameof(workingDirectory)); -} +var workingDirectory = + Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + ?? throw new InvalidOperationException("Could not determine the working directory."); var regularIcons = new FontSource( "SymbolRegular", @@ -41,23 +38,23 @@ await httpClient.GetFromJsonAsync>( ) ) ?.Last() - ?.Ref.Replace("refs/tags/", String.Empty) + ?.Ref.Replace("refs/tags/", string.Empty) .Trim() ?? throw new Exception("Unable to parse the version string"); } string FormatIconName(string rawIconName) { rawIconName = rawIconName - .Replace("ic_fluent_", String.Empty) - .Replace("_regular", String.Empty) - .Replace("_filled", String.Empty); + .Replace("ic_fluent_", string.Empty) + .Replace("_regular", string.Empty) + .Replace("_filled", string.Empty); - var iconName = String.Empty; + var iconName = string.Empty; foreach (var newPart in rawIconName.Split('_')) { var charactersArray = newPart.ToCharArray(); - charactersArray[0] = Char.ToUpper(charactersArray[0]); + charactersArray[0] = char.ToUpper(charactersArray[0]); iconName += new string(charactersArray); } @@ -114,9 +111,9 @@ async Task WriteToFile(FontSource singleFont, string fileRootDirectory) ) .AppendLine("// Copyright (C) Leszek Pomianowski and WPF UI Contributors.") .AppendLine("// All Rights Reserved.") - .AppendLine(String.Empty) + .AppendLine() .AppendLine("namespace Wpf.Ui.Controls;") - .AppendLine(String.Empty) + .AppendLine() .AppendLine("/// ") .AppendLine($"/// {singleFont.Description.Replace("\n", "\n/// ")}") .AppendLine("/// ") @@ -127,9 +124,9 @@ async Task WriteToFile(FontSource singleFont, string fileRootDirectory) .AppendLine(" /// Actually, this icon is not empty, but makes it easier to navigate.") .AppendLine(" /// ") .AppendLine(" Empty = 0x0,") - .AppendLine(String.Empty) + .AppendLine() .AppendLine(" // Automatically generated, may contain bugs.") - .AppendLine(String.Empty); + .AppendLine(); foreach (KeyValuePair singleIcon in singleFont.Contents) { @@ -137,7 +134,7 @@ async Task WriteToFile(FontSource singleFont, string fileRootDirectory) if (singleIcon.Value < 32) { _ = enumMapStringBuilder - .AppendLine(String.Empty) + .AppendLine() .AppendLine(" /// ") .AppendLine(" /// Blank icon.") .AppendLine(" /// "); @@ -148,7 +145,7 @@ async Task WriteToFile(FontSource singleFont, string fileRootDirectory) _ = enumMapStringBuilder .AppendLine("}") - .AppendLine(String.Empty) + .AppendLine() .AppendLine("#pragma warning restore CS1591") .Append("\r\n"); @@ -160,6 +157,7 @@ async Task WriteToFile(FontSource singleFont, string fileRootDirectory) } await File.WriteAllTextAsync(destinationPath, enumMapStringBuilder.ToString()); + Console.WriteLine($"Wrote to file \"{destinationPath}\""); } await WriteToFile(regularIcons, workingDirectory); diff --git a/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj b/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj index a372ae4ac..4b231cae5 100644 --- a/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj +++ b/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj @@ -2,11 +2,7 @@ Exe - net8.0 - enable - enable - 10.0 - AnyCPU;x64 + net9.0 diff --git a/src/Wpf.Ui.Gallery/App.xaml.cs b/src/Wpf.Ui.Gallery/App.xaml.cs index 5a9d7528b..6ded57e72 100644 --- a/src/Wpf.Ui.Gallery/App.xaml.cs +++ b/src/Wpf.Ui.Gallery/App.xaml.cs @@ -3,7 +3,10 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using Lepo.i18n.DependencyInjection; +using Wpf.Ui.DependencyInjection; using Wpf.Ui.Gallery.DependencyModel; +using Wpf.Ui.Gallery.Resources; using Wpf.Ui.Gallery.Services; using Wpf.Ui.Gallery.Services.Contracts; using Wpf.Ui.Gallery.ViewModels.Pages; @@ -13,7 +16,6 @@ namespace Wpf.Ui.Gallery; -#pragma warning disable IDE0058 // Expression value is never used public partial class App { // The .NET Generic Host provides dependency injection, configuration, logging, and other services. @@ -24,33 +26,43 @@ public partial class App private static readonly IHost _host = Host.CreateDefaultBuilder() .ConfigureAppConfiguration(c => { - c.SetBasePath(AppContext.BaseDirectory); + _ = c.SetBasePath(AppContext.BaseDirectory); }) .ConfigureServices( - (_, services) => + (_1, services) => { + _ = services.AddNavigationViewPageProvider(); + // App Host - services.AddHostedService(); + _ = services.AddHostedService(); // Main window container with navigation - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); // Top-level pages - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); // All other pages and view models - services.AddTransientFromNamespace("Wpf.Ui.Gallery.Views", GalleryAssembly.Asssembly); - services.AddTransientFromNamespace("Wpf.Ui.Gallery.ViewModels", GalleryAssembly.Asssembly); + _ = services.AddTransientFromNamespace("Wpf.Ui.Gallery.Views", GalleryAssembly.Asssembly); + _ = services.AddTransientFromNamespace( + "Wpf.Ui.Gallery.ViewModels", + GalleryAssembly.Asssembly + ); + + _ = services.AddStringLocalizer(b => + { + b.FromResource(new("pl-PL")); + }); } ) .Build(); @@ -92,4 +104,3 @@ private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledEx // For more info see https://docs.microsoft.com/en-us/dotnet/api/system.windows.application.dispatcherunhandledexception?view=windowsdesktop-6.0 } } -#pragma warning restore IDE0058 // Expression value is never used diff --git a/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs b/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs index 5ea1c948b..9530789b0 100644 --- a/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs +++ b/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs @@ -16,7 +16,7 @@ public class MonacoController private const string EditorObject = "wpfUiMonacoEditor"; - private volatile WebView2 _webView; + private readonly WebView2 _webView; public MonacoController(WebView2 webView) { @@ -25,7 +25,7 @@ public MonacoController(WebView2 webView) public async Task CreateAsync() { - await _webView.ExecuteScriptAsync( + _ = await _webView.ExecuteScriptAsync( $$""" const {{EditorObject}} = monaco.editor.create(document.querySelector('{{EditorContainerSelector}}')); window.onresize = () => {{{EditorObject}}.layout();} @@ -35,12 +35,11 @@ await _webView.ExecuteScriptAsync( public async Task SetThemeAsync(ApplicationTheme appApplicationTheme) { + // TODO: Parse theme from object const string uiThemeName = "wpf-ui-app-theme"; var baseMonacoTheme = appApplicationTheme == ApplicationTheme.Light ? "vs" : "vs-dark"; - // TODO: Parse theme from object - - await _webView.ExecuteScriptAsync( + _ = await _webView.ExecuteScriptAsync( $$$""" monaco.editor.defineTheme('{{{uiThemeName}}}', { base: '{{{baseMonacoTheme}}}', @@ -72,7 +71,9 @@ public async Task SetContentAsync(string contents) public void DispatchScript(string script) { if (_webView == null) + { return; + } Application.Current.Dispatcher.InvokeAsync(async () => await _webView!.ExecuteScriptAsync(script)); } diff --git a/src/Wpf.Ui.Gallery/Controls/ControlExample.xaml.cs b/src/Wpf.Ui.Gallery/Controls/ControlExample.xaml.cs index 0f0905cb8..c23695de4 100644 --- a/src/Wpf.Ui.Gallery/Controls/ControlExample.xaml.cs +++ b/src/Wpf.Ui.Gallery/Controls/ControlExample.xaml.cs @@ -10,6 +10,7 @@ namespace Wpf.Ui.Gallery.Controls; [ContentProperty(nameof(ExampleContent))] public class ControlExample : Control { + /// Identifies the dependency property. public static readonly DependencyProperty HeaderTextProperty = DependencyProperty.Register( nameof(HeaderText), typeof(string), @@ -17,6 +18,7 @@ public class ControlExample : Control new PropertyMetadata(null) ); + /// Identifies the dependency property. public static readonly DependencyProperty ExampleContentProperty = DependencyProperty.Register( nameof(ExampleContent), typeof(object), @@ -24,6 +26,7 @@ public class ControlExample : Control new PropertyMetadata(null) ); + /// Identifies the dependency property. public static readonly DependencyProperty XamlCodeProperty = DependencyProperty.Register( nameof(XamlCode), typeof(string), @@ -31,16 +34,21 @@ public class ControlExample : Control new PropertyMetadata(null) ); + /// Identifies the dependency property. public static readonly DependencyProperty XamlCodeSourceProperty = DependencyProperty.Register( nameof(XamlCodeSource), typeof(Uri), typeof(ControlExample), new PropertyMetadata( null, - static (o, args) => ((ControlExample)o).OnXamlCodeSourceChanged((Uri)args.NewValue) + static (o, args) => + { + ((ControlExample)o).OnXamlCodeSourceChanged((Uri?)args.NewValue); + } ) ); + /// Identifies the dependency property. public static readonly DependencyProperty CsharpCodeProperty = DependencyProperty.Register( nameof(CsharpCode), typeof(string), @@ -48,19 +56,23 @@ public class ControlExample : Control new PropertyMetadata(null) ); + /// Identifies the dependency property. public static readonly DependencyProperty CsharpCodeSourceProperty = DependencyProperty.Register( nameof(CsharpCodeSource), typeof(Uri), typeof(ControlExample), new PropertyMetadata( null, - static (o, args) => ((ControlExample)o).OnCsharpCodeSourceChanged((Uri)args.NewValue) + static (o, args) => + { + ((ControlExample)o).OnCsharpCodeSourceChanged((Uri?)args.NewValue); + } ) ); public string? HeaderText { - get => (string)GetValue(HeaderTextProperty); + get => (string?)GetValue(HeaderTextProperty); set => SetValue(HeaderTextProperty, value); } @@ -72,45 +84,45 @@ public object? ExampleContent public string? XamlCode { - get => (string)GetValue(XamlCodeProperty); + get => (string?)GetValue(XamlCodeProperty); set => SetValue(XamlCodeProperty, value); } public Uri? XamlCodeSource { - get => (Uri)GetValue(XamlCodeSourceProperty); + get => (Uri?)GetValue(XamlCodeSourceProperty); set => SetValue(XamlCodeSourceProperty, value); } public string? CsharpCode { - get => (string)GetValue(CsharpCodeProperty); + get => (string?)GetValue(CsharpCodeProperty); set => SetValue(CsharpCodeProperty, value); } public Uri? CsharpCodeSource { - get => (Uri)GetValue(CsharpCodeSourceProperty); + get => (Uri?)GetValue(CsharpCodeSourceProperty); set => SetValue(CsharpCodeSourceProperty, value); } - private void OnXamlCodeSourceChanged(Uri uri) + private void OnXamlCodeSourceChanged(Uri? uri) { - XamlCode = LoadResource(uri); + SetCurrentValue(XamlCodeProperty, LoadResource(uri)); } - private void OnCsharpCodeSourceChanged(Uri uri) + private void OnCsharpCodeSourceChanged(Uri? uri) { - CsharpCode = LoadResource(uri); + SetCurrentValue(CsharpCodeProperty, LoadResource(uri)); } - private static string LoadResource(Uri uri) + private static string LoadResource(Uri? uri) { try { - if (Application.GetResourceStream(uri) is not { } steamInfo) + if (uri is null || Application.GetResourceStream(uri) is not { } steamInfo) { - return String.Empty; + return string.Empty; } using StreamReader streamReader = new(steamInfo.Stream, Encoding.UTF8); diff --git a/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml.cs b/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml.cs index 28c1b652a..f198369fd 100644 --- a/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml.cs +++ b/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml.cs @@ -7,9 +7,7 @@ namespace Wpf.Ui.Gallery.Controls; public class GalleryNavigationPresenter : System.Windows.Controls.Control { - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( nameof(ItemsSource), typeof(object), @@ -17,9 +15,7 @@ public class GalleryNavigationPresenter : System.Windows.Controls.Control new PropertyMetadata(null) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty TemplateButtonCommandProperty = DependencyProperty.Register( nameof(TemplateButtonCommand), typeof(Wpf.Ui.Input.IRelayCommand), @@ -57,11 +53,9 @@ private void OnTemplateButtonClick(Type? pageType) navigationService.Navigate(pageType); } -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {nameof(GalleryNavigationPresenter)} navigated, ({pageType})", "Wpf.Ui.Gallery" ); -#endif } } diff --git a/src/Wpf.Ui.Gallery/Controls/PageControlDocumentation.xaml.cs b/src/Wpf.Ui.Gallery/Controls/PageControlDocumentation.xaml.cs index 2c6416377..6e0d1d9bd 100644 --- a/src/Wpf.Ui.Gallery/Controls/PageControlDocumentation.xaml.cs +++ b/src/Wpf.Ui.Gallery/Controls/PageControlDocumentation.xaml.cs @@ -13,27 +13,42 @@ public class PageControlDocumentation : Control public static readonly DependencyProperty ShowProperty = DependencyProperty.RegisterAttached( "Show", typeof(bool), - typeof(FrameworkElement), + typeof(PageControlDocumentation), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsRender) ); public static readonly DependencyProperty DocumentationTypeProperty = DependencyProperty.RegisterAttached( "DocumentationType", typeof(Type), - typeof(FrameworkElement), + typeof(PageControlDocumentation), new FrameworkPropertyMetadata(null) ); + /// Helper for getting from . + /// to read from. + /// Show property value. + [AttachedPropertyBrowsableForType(typeof(FrameworkElement))] public static bool GetShow(FrameworkElement target) => (bool)target.GetValue(ShowProperty); + /// Helper for setting on . + /// to set on. + /// Show property value. public static void SetShow(FrameworkElement target, bool show) => target.SetValue(ShowProperty, show); + /// Helper for getting from . + /// to read from. + /// DocumentationType property value. + [AttachedPropertyBrowsableForType(typeof(FrameworkElement))] public static Type? GetDocumentationType(FrameworkElement target) => (Type?)target.GetValue(DocumentationTypeProperty); - public static void SetDocumentationType(FrameworkElement target, Type type) => + /// Helper for setting on . + /// to set on. + /// DocumentationType property value. + public static void SetDocumentationType(FrameworkElement target, Type? type) => target.SetValue(DocumentationTypeProperty, type); + /// Identifies the dependency property. public static readonly DependencyProperty NavigationViewProperty = DependencyProperty.Register( nameof(NavigationView), typeof(INavigationView), @@ -41,6 +56,7 @@ public static void SetDocumentationType(FrameworkElement target, Type type) => new FrameworkPropertyMetadata(null) ); + /// Identifies the dependency property. public static readonly DependencyProperty IsDocumentationLinkVisibleProperty = DependencyProperty.Register( nameof(IsDocumentationLinkVisible), @@ -49,6 +65,7 @@ public static void SetDocumentationType(FrameworkElement target, Type type) => new FrameworkPropertyMetadata(Visibility.Collapsed) ); + /// Identifies the dependency property. public static readonly DependencyProperty TemplateButtonCommandProperty = DependencyProperty.Register( nameof(TemplateButtonCommand), typeof(ICommand), @@ -58,7 +75,7 @@ public static void SetDocumentationType(FrameworkElement target, Type type) => public INavigationView? NavigationView { - get => (INavigationView)GetValue(NavigationViewProperty); + get => (INavigationView?)GetValue(NavigationViewProperty); set => SetValue(NavigationViewProperty, value); } @@ -86,7 +103,9 @@ public PageControlDocumentation() private void OnLoaded() { if (NavigationView is null) + { throw new ArgumentNullException(nameof(NavigationView)); + } NavigationView.Navigated += NavigationViewOnNavigated; } @@ -99,26 +118,26 @@ private void OnUnloaded() private void NavigationViewOnNavigated(NavigationView sender, NavigatedEventArgs args) { - IsDocumentationLinkVisible = Visibility.Collapsed; + SetCurrentValue(IsDocumentationLinkVisibleProperty, Visibility.Collapsed); if (args.Page is not FrameworkElement page || !GetShow(page)) { - Visibility = Visibility.Collapsed; + SetCurrentValue(VisibilityProperty, Visibility.Collapsed); return; } _page = page; - Visibility = Visibility.Visible; + SetCurrentValue(VisibilityProperty, Visibility.Visible); if (GetDocumentationType(page) is not null) { - IsDocumentationLinkVisible = Visibility.Visible; + SetCurrentValue(IsDocumentationLinkVisibleProperty, Visibility.Visible); } } private void OnClick(string? param) { - if (String.IsNullOrWhiteSpace(param) || _page is null) + if (string.IsNullOrWhiteSpace(param) || _page is null) { return; } @@ -136,10 +155,10 @@ private void OnClick(string? param) => CreateUrlForDocumentation(documentationType), "xaml" => CreateUrlForGithub(_page.GetType(), ".xaml"), "c#" => CreateUrlForGithub(_page.GetType(), ".xaml.cs"), - _ => String.Empty + _ => string.Empty }; - if (String.IsNullOrEmpty(navigationUrl)) + if (string.IsNullOrEmpty(navigationUrl)) { return; } @@ -148,7 +167,7 @@ private void OnClick(string? param) { ProcessStartInfo sInfo = new(navigationUrl) { UseShellExecute = true }; - Process.Start(sInfo); + _ = Process.Start(sInfo); } catch (Exception e) { @@ -161,7 +180,9 @@ private static string CreateUrlForGithub(Type pageType, ReadOnlySpan fileE const string baseUrl = "https://github.com/lepoco/wpfui/tree/main/src/Wpf.Ui.Gallery/"; const string baseNamespace = "Wpf.Ui.Gallery"; - var pageFullNameWithoutBaseNamespace = pageType.FullName.AsSpan().Slice(baseNamespace.Length + 1); + ReadOnlySpan pageFullNameWithoutBaseNamespace = pageType.FullName.AsSpan()[ + (baseNamespace.Length + 1).. + ]; Span pageUrl = stackalloc char[pageFullNameWithoutBaseNamespace.Length]; pageFullNameWithoutBaseNamespace.CopyTo(pageUrl); @@ -174,19 +195,19 @@ private static string CreateUrlForGithub(Type pageType, ReadOnlySpan fileE } } - return String.Concat(baseUrl, pageUrl, fileExtension); + return string.Concat(baseUrl, pageUrl, fileExtension); } private static string CreateUrlForDocumentation(Type type) { const string baseUrl = "https://wpfui.lepo.co/api/"; - return String.Concat(baseUrl, type.FullName, ".html"); + return string.Concat(baseUrl, type.FullName, ".html"); } private static void SwitchThemes() { - var currentTheme = Wpf.Ui.Appearance.ApplicationThemeManager.GetAppTheme(); + Appearance.ApplicationTheme currentTheme = Wpf.Ui.Appearance.ApplicationThemeManager.GetAppTheme(); Wpf.Ui.Appearance.ApplicationThemeManager.Apply( currentTheme == Wpf.Ui.Appearance.ApplicationTheme.Light diff --git a/src/Wpf.Ui.Gallery/Controls/TermsOfUseContentDialog.xaml.cs b/src/Wpf.Ui.Gallery/Controls/TermsOfUseContentDialog.xaml.cs index 5c3a2e764..2a45ac1be 100644 --- a/src/Wpf.Ui.Gallery/Controls/TermsOfUseContentDialog.xaml.cs +++ b/src/Wpf.Ui.Gallery/Controls/TermsOfUseContentDialog.xaml.cs @@ -10,7 +10,7 @@ namespace Wpf.Ui.Gallery.Controls; public partial class TermsOfUseContentDialog : ContentDialog { - public TermsOfUseContentDialog(ContentPresenter contentPresenter) + public TermsOfUseContentDialog(ContentPresenter? contentPresenter) : base(contentPresenter) { InitializeComponent(); @@ -23,9 +23,8 @@ protected override void OnButtonClick(ContentDialogButton button) base.OnButtonClick(button); return; } - ; - TextBlock.Visibility = Visibility.Visible; - CheckBox.Focus(); + TextBlock.SetCurrentValue(VisibilityProperty, Visibility.Visible); + _ = CheckBox.Focus(); } } diff --git a/src/Wpf.Ui.Gallery/Controls/TypographyControl.xaml.cs b/src/Wpf.Ui.Gallery/Controls/TypographyControl.xaml.cs index bea28d2e3..0f423a69a 100644 --- a/src/Wpf.Ui.Gallery/Controls/TypographyControl.xaml.cs +++ b/src/Wpf.Ui.Gallery/Controls/TypographyControl.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Windows; using System.Windows.Controls; using Wpf.Ui.Controls; @@ -11,6 +10,7 @@ namespace Wpf.Ui.Gallery.Controls; public class TypographyControl : Control { + /// Identifies the dependency property. public static readonly DependencyProperty ExampleProperty = DependencyProperty.Register( nameof(Example), typeof(string), @@ -18,6 +18,7 @@ public class TypographyControl : Control new PropertyMetadata(string.Empty) ); + /// Identifies the dependency property. public static readonly DependencyProperty ExampleFontTypographyProperty = DependencyProperty.Register( nameof(ExampleFontTypography), typeof(FontTypography), @@ -25,10 +26,13 @@ public class TypographyControl : Control new PropertyMetadata( FontTypography.Body, static (o, args) => - ((TypographyControl)o).OnExampleFontTypographyChanged((FontTypography)args.NewValue) + { + ((TypographyControl)o).OnExampleFontTypographyChanged((FontTypography)args.NewValue); + } ) ); + /// Identifies the dependency property. public static readonly DependencyProperty VariableFontProperty = DependencyProperty.Register( nameof(VariableFont), typeof(string), @@ -36,6 +40,7 @@ public class TypographyControl : Control new PropertyMetadata(string.Empty) ); + /// Identifies the dependency property. public static readonly DependencyProperty SizeLinHeightProperty = DependencyProperty.Register( nameof(SizeLinHeight), typeof(string), @@ -43,6 +48,7 @@ public class TypographyControl : Control new PropertyMetadata(string.Empty) ); + /// Identifies the dependency property. public static readonly DependencyProperty FontTypographyStyleProperty = DependencyProperty.Register( nameof(FontTypographyStyle), typeof(string), @@ -70,7 +76,7 @@ public string VariableFont public string SizeLinHeight { - get => (string)GetValue(VariableFontProperty); + get => (string)GetValue(SizeLinHeightProperty); set => SetValue(SizeLinHeightProperty, value); } @@ -82,6 +88,6 @@ public string FontTypographyStyle private void OnExampleFontTypographyChanged(FontTypography fontTypography) { - FontTypographyStyle = fontTypography.ToString(); + SetCurrentValue(FontTypographyStyleProperty, fontTypography.ToString()); } } diff --git a/src/Wpf.Ui.Gallery/ControlsLookup/ControlPages.cs b/src/Wpf.Ui.Gallery/ControlsLookup/ControlPages.cs index 48c4a0cb6..f22583fef 100644 --- a/src/Wpf.Ui.Gallery/ControlsLookup/ControlPages.cs +++ b/src/Wpf.Ui.Gallery/ControlsLookup/ControlPages.cs @@ -5,24 +5,25 @@ namespace Wpf.Ui.Gallery.ControlsLookup; -static class ControlPages +internal static class ControlPages { private const string PageSuffix = "Page"; public static IEnumerable All() { foreach ( - var type in GalleryAssembly + Type? type in GalleryAssembly .Asssembly.GetTypes() .Where(t => t.IsDefined(typeof(GalleryPageAttribute))) ) { - var galleryPageAttribute = type.GetCustomAttributes().FirstOrDefault(); + GalleryPageAttribute? galleryPageAttribute = type.GetCustomAttributes() + .FirstOrDefault(); if (galleryPageAttribute is not null) { yield return new GalleryPage( - type.Name.Substring(0, type.Name.LastIndexOf(PageSuffix)), + type.Name[..type.Name.LastIndexOf(PageSuffix)], galleryPageAttribute.Description, galleryPageAttribute.Icon, type diff --git a/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPage.cs b/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPage.cs index 119ba603d..10cd73160 100644 --- a/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPage.cs +++ b/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPage.cs @@ -7,4 +7,4 @@ namespace Wpf.Ui.Gallery.ControlsLookup; -record GalleryPage(string Name, string Description, SymbolRegular Icon, Type PageType); +internal record GalleryPage(string Name, string Description, SymbolRegular Icon, Type PageType); diff --git a/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPageAttribute.cs b/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPageAttribute.cs index 95bea27a6..e1596b0c6 100644 --- a/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPageAttribute.cs +++ b/src/Wpf.Ui.Gallery/ControlsLookup/GalleryPageAttribute.cs @@ -8,14 +8,9 @@ namespace Wpf.Ui.Gallery.ControlsLookup; [AttributeUsage(AttributeTargets.Class)] -class GalleryPageAttribute : Attribute +internal sealed class GalleryPageAttribute(string description, SymbolRegular icon) : Attribute { - public string Description { get; } - public SymbolRegular Icon { get; } + public string Description { get; } = description; - public GalleryPageAttribute(string description, SymbolRegular icon) - { - Description = description; - Icon = icon; - } + public SymbolRegular Icon { get; } = icon; } diff --git a/src/Wpf.Ui.Gallery/DependencyModel/ServiceCollectionExtensions.cs b/src/Wpf.Ui.Gallery/DependencyModel/ServiceCollectionExtensions.cs index 4ff90aee8..41bbfadef 100644 --- a/src/Wpf.Ui.Gallery/DependencyModel/ServiceCollectionExtensions.cs +++ b/src/Wpf.Ui.Gallery/DependencyModel/ServiceCollectionExtensions.cs @@ -3,6 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using Wpf.Ui.Gallery.ViewModels; + namespace Wpf.Ui.Gallery.DependencyModel; internal static class ServiceCollectionExtensions @@ -26,6 +28,11 @@ params Assembly[] assemblies { if (services.All(x => x.ServiceType != type)) { + if (type == typeof(ViewModel)) + { + continue; + } + _ = services.AddTransient(type); } } diff --git a/src/Wpf.Ui.Gallery/GalleryAssembly.cs b/src/Wpf.Ui.Gallery/GalleryAssembly.cs index c78340ba0..5173a2183 100644 --- a/src/Wpf.Ui.Gallery/GalleryAssembly.cs +++ b/src/Wpf.Ui.Gallery/GalleryAssembly.cs @@ -5,7 +5,7 @@ namespace Wpf.Ui.Gallery; -class GalleryAssembly +public class GalleryAssembly { public static Assembly Asssembly => Assembly.GetExecutingAssembly(); } diff --git a/src/Wpf.Ui.Gallery/Usings.cs b/src/Wpf.Ui.Gallery/GlobalUsings.cs similarity index 96% rename from src/Wpf.Ui.Gallery/Usings.cs rename to src/Wpf.Ui.Gallery/GlobalUsings.cs index bb18e5018..c26fd1471 100644 --- a/src/Wpf.Ui.Gallery/Usings.cs +++ b/src/Wpf.Ui.Gallery/GlobalUsings.cs @@ -25,3 +25,4 @@ global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Hosting; +global using Wpf.Ui.Abstractions.Controls; diff --git a/src/Wpf.Ui.Gallery/Helpers/NameToPageTypeConverter.cs b/src/Wpf.Ui.Gallery/Helpers/NameToPageTypeConverter.cs index 39fb2f648..20c610ffd 100644 --- a/src/Wpf.Ui.Gallery/Helpers/NameToPageTypeConverter.cs +++ b/src/Wpf.Ui.Gallery/Helpers/NameToPageTypeConverter.cs @@ -17,6 +17,8 @@ internal sealed class NameToPageTypeConverter { pageName = pageName.Trim().ToLower() + "page"; - return PageTypes.FirstOrDefault(singlePageType => singlePageType.Name.ToLower() == pageName); + return PageTypes.FirstOrDefault(singlePageType => + singlePageType.Name.Equals(pageName, StringComparison.CurrentCultureIgnoreCase) + ); } } diff --git a/src/Wpf.Ui.Gallery/Helpers/PaneDisplayModeToIndexConverter.cs b/src/Wpf.Ui.Gallery/Helpers/PaneDisplayModeToIndexConverter.cs index 6117988c5..23bbf4a9e 100644 --- a/src/Wpf.Ui.Gallery/Helpers/PaneDisplayModeToIndexConverter.cs +++ b/src/Wpf.Ui.Gallery/Helpers/PaneDisplayModeToIndexConverter.cs @@ -11,41 +11,23 @@ internal sealed class PaneDisplayModeToIndexConverter : IValueConverter { public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - if (value is NavigationViewPaneDisplayMode.LeftFluent) + return value switch { - return 1; - } - - if (value is NavigationViewPaneDisplayMode.Top) - { - return 2; - } - - if (value is NavigationViewPaneDisplayMode.Bottom) - { - return 3; - } - - return 0; + NavigationViewPaneDisplayMode.LeftFluent => 1, + NavigationViewPaneDisplayMode.Top => 2, + NavigationViewPaneDisplayMode.Bottom => 3, + _ => 0 + }; } public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { - if (value is 1) + return value switch { - return NavigationViewPaneDisplayMode.LeftFluent; - } - - if (value is 2) - { - return NavigationViewPaneDisplayMode.Top; - } - - if (value is 3) - { - return NavigationViewPaneDisplayMode.Bottom; - } - - return NavigationViewPaneDisplayMode.Left; + 1 => NavigationViewPaneDisplayMode.LeftFluent, + 2 => NavigationViewPaneDisplayMode.Top, + 3 => NavigationViewPaneDisplayMode.Bottom, + _ => NavigationViewPaneDisplayMode.Left + }; } } diff --git a/src/Wpf.Ui.Gallery/Models/Monaco/MonacoTheme.cs b/src/Wpf.Ui.Gallery/Models/Monaco/MonacoTheme.cs index 7a947e9ec..d0972bab8 100644 --- a/src/Wpf.Ui.Gallery/Models/Monaco/MonacoTheme.cs +++ b/src/Wpf.Ui.Gallery/Models/Monaco/MonacoTheme.cs @@ -8,11 +8,11 @@ namespace Wpf.Ui.Gallery.Models.Monaco; [Serializable] public record MonacoTheme { - public string Base { get; init; } + public string? Base { get; init; } public bool Inherit { get; init; } - public IDictionary Rules { get; init; } + public IDictionary? Rules { get; init; } - public IDictionary Colors { get; init; } + public IDictionary? Colors { get; init; } } diff --git a/src/Wpf.Ui.Gallery/Models/NavigationCard.cs b/src/Wpf.Ui.Gallery/Models/NavigationCard.cs index 55c9ca28b..5eaa79941 100644 --- a/src/Wpf.Ui.Gallery/Models/NavigationCard.cs +++ b/src/Wpf.Ui.Gallery/Models/NavigationCard.cs @@ -9,11 +9,11 @@ namespace Wpf.Ui.Gallery.Models; public record NavigationCard { - public string Name { get; init; } + public string? Name { get; init; } public SymbolRegular Icon { get; init; } - public string Description { get; init; } + public string? Description { get; init; } - public Type PageType { get; init; } + public Type? PageType { get; init; } } diff --git a/src/Wpf.Ui.Gallery/Models/Person.cs b/src/Wpf.Ui.Gallery/Models/Person.cs index 4c7416f17..11dbd7fdd 100644 --- a/src/Wpf.Ui.Gallery/Models/Person.cs +++ b/src/Wpf.Ui.Gallery/Models/Person.cs @@ -11,7 +11,7 @@ public record Person public string LastName { get; init; } - public string Name => FirstName + " " + LastName; + public string Name => $"{FirstName} {LastName}"; public string Company { get; init; } diff --git a/src/Wpf.Ui.Gallery/Models/Product.cs b/src/Wpf.Ui.Gallery/Models/Product.cs index 4fed12368..b574c6a02 100644 --- a/src/Wpf.Ui.Gallery/Models/Product.cs +++ b/src/Wpf.Ui.Gallery/Models/Product.cs @@ -11,9 +11,11 @@ public class Product public int ProductCode { get; set; } - public string ProductName { get; set; } + public string? ProductName { get; set; } - public string QuantityPerUnit { get; set; } + public string? QuantityPerUnit { get; set; } + + public Unit Unit { get; set; } public double UnitPrice { get; set; } diff --git a/src/Wpf.Ui.Demo.Mvvm/Models/AppConfig.cs b/src/Wpf.Ui.Gallery/Models/Unit.cs similarity index 62% rename from src/Wpf.Ui.Demo.Mvvm/Models/AppConfig.cs rename to src/Wpf.Ui.Gallery/Models/Unit.cs index 7e437257d..6144ab902 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Models/AppConfig.cs +++ b/src/Wpf.Ui.Gallery/Models/Unit.cs @@ -3,11 +3,11 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -namespace Wpf.Ui.Demo.Mvvm.Models; +namespace Wpf.Ui.Gallery.Models; -public class AppConfig +public enum Unit { - public string ConfigurationsFolder { get; set; } - - public string AppPropertiesFileName { get; set; } + Grams, + Kilograms, + Milliliters } diff --git a/src/Wpf.Ui.Gallery/Resources/Translations.cs b/src/Wpf.Ui.Gallery/Resources/Translations.cs new file mode 100644 index 000000000..273c6012d --- /dev/null +++ b/src/Wpf.Ui.Gallery/Resources/Translations.cs @@ -0,0 +1,8 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Gallery.Resources; + +public partial class Translations; diff --git a/src/Wpf.Ui.Gallery/Resources/Translations.pl-PL.Designer.cs b/src/Wpf.Ui.Gallery/Resources/Translations.pl-PL.Designer.cs new file mode 100644 index 000000000..4c5543244 --- /dev/null +++ b/src/Wpf.Ui.Gallery/Resources/Translations.pl-PL.Designer.cs @@ -0,0 +1,80 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Wpf.Ui.Gallery.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Translations_pl_PL { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Translations_pl_PL() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Wpf.Ui.Gallery.Resources.Translations.pl-PL", typeof(Translations_pl_PL).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Szukaj. + /// + internal static string Search { + get { + return ResourceManager.GetString("Search", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WPF UI Galeria. + /// + internal static string WPF_UI_Gallery { + get { + return ResourceManager.GetString("WPF UI Gallery", resourceCulture); + } + } + } +} diff --git a/src/Wpf.Ui.Gallery/Resources/Translations.pl-PL.resx b/src/Wpf.Ui.Gallery/Resources/Translations.pl-PL.resx new file mode 100644 index 000000000..f24f175a5 --- /dev/null +++ b/src/Wpf.Ui.Gallery/Resources/Translations.pl-PL.resx @@ -0,0 +1,27 @@ + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Szukaj + + + WPF UI Galeria + + \ No newline at end of file diff --git a/src/Wpf.Ui.Gallery/Services/WindowsProviderService.cs b/src/Wpf.Ui.Gallery/Services/WindowsProviderService.cs index 6195d9340..a3230f315 100644 --- a/src/Wpf.Ui.Gallery/Services/WindowsProviderService.cs +++ b/src/Wpf.Ui.Gallery/Services/WindowsProviderService.cs @@ -18,13 +18,13 @@ public void Show() where T : class { if (!typeof(Window).IsAssignableFrom(typeof(T))) + { throw new InvalidOperationException($"The window class should be derived from {typeof(Window)}."); + } - var windowInstance = _serviceProvider.GetService() as Window; - - if (windowInstance == null) - throw new InvalidOperationException("Window is not registered as service."); - + Window windowInstance = + _serviceProvider.GetService() as Window + ?? throw new InvalidOperationException("Window is not registered as service."); windowInstance.Owner = Application.Current.MainWindow; windowInstance.Show(); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/AllControlsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/AllControlsViewModel.cs index b42fa064b..8aae53d39 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/AllControlsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/AllControlsViewModel.cs @@ -8,7 +8,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages; -public partial class AllControlsViewModel : ObservableObject +public partial class AllControlsViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/AnchorViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/AnchorViewModel.cs index e2e32330a..1e3a12ec5 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/AnchorViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/AnchorViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class AnchorViewModel : ObservableObject +public partial class AnchorViewModel : ViewModel { [ObservableProperty] private bool _isAnchorEnabled = true; @@ -16,7 +16,9 @@ public partial class AnchorViewModel : ObservableObject private void OnAnchorCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsAnchorEnabled = !(checkbox?.IsChecked ?? false); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/BasicInputViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/BasicInputViewModel.cs index 0fbe0b6aa..01e60cf6d 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/BasicInputViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/BasicInputViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class BasicInputViewModel : ObservableObject +public partial class BasicInputViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ButtonViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ButtonViewModel.cs index 3355c06e3..21b8ac12f 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ButtonViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ButtonViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class ButtonViewModel : ObservableObject +public partial class ButtonViewModel : ViewModel { [ObservableProperty] private bool _isSimpleButtonEnabled = true; @@ -19,7 +19,9 @@ public partial class ButtonViewModel : ObservableObject private void OnSimpleButtonCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsSimpleButtonEnabled = !(checkbox?.IsChecked ?? false); } @@ -28,7 +30,9 @@ private void OnSimpleButtonCheckboxChecked(object sender) private void OnUiButtonCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsUiButtonEnabled = !(checkbox?.IsChecked ?? false); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/CheckBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/CheckBoxViewModel.cs index 6e50f3837..ab53742e4 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/CheckBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/CheckBoxViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class CheckBoxViewModel : ObservableObject +public partial class CheckBoxViewModel : ViewModel { [ObservableProperty] private bool? _selectAllCheckBoxChecked = null; @@ -25,12 +25,12 @@ public partial class CheckBoxViewModel : ObservableObject private void OnSelectAllChecked(object sender) { if (sender is not CheckBox checkBox) + { return; + } - if (checkBox.IsChecked == null) - checkBox.IsChecked = !( - OptionOneCheckBoxChecked && OptionTwoCheckBoxChecked && OptionThreeCheckBoxChecked - ); + checkBox.IsChecked ??= + !OptionOneCheckBoxChecked || !OptionTwoCheckBoxChecked || !OptionThreeCheckBoxChecked; if (checkBox.IsChecked == true) { @@ -49,11 +49,14 @@ private void OnSelectAllChecked(object sender) [RelayCommand] private void OnSingleChecked(string option) { - if (OptionOneCheckBoxChecked && OptionTwoCheckBoxChecked && OptionThreeCheckBoxChecked) - SelectAllCheckBoxChecked = true; - else if (!OptionOneCheckBoxChecked && !OptionTwoCheckBoxChecked && !OptionThreeCheckBoxChecked) - SelectAllCheckBoxChecked = false; - else - SelectAllCheckBoxChecked = null; + bool allChecked = OptionOneCheckBoxChecked && OptionTwoCheckBoxChecked && OptionThreeCheckBoxChecked; + bool allUnchecked = + !OptionOneCheckBoxChecked && !OptionTwoCheckBoxChecked && !OptionThreeCheckBoxChecked; + + SelectAllCheckBoxChecked = allChecked + ? true + : allUnchecked + ? false + : (bool?)null; } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ComboBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ComboBoxViewModel.cs index 6e0d1b4ed..d2a941272 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ComboBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ComboBoxViewModel.cs @@ -5,20 +5,20 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class ComboBoxViewModel : ObservableObject +public partial class ComboBoxViewModel : ViewModel { [ObservableProperty] - private IList _comboBoxFontFamilies = new ObservableCollection - { + private ObservableCollection _comboBoxFontFamilies = + [ "Arial", "Comic Sans MS", "Segoe UI", "Times New Roman" - }; + ]; [ObservableProperty] - private IList _comboBoxFontSizes = new ObservableCollection - { + private ObservableCollection _comboBoxFontSizes = + [ 8, 9, 10, @@ -33,5 +33,5 @@ public partial class ComboBoxViewModel : ObservableObject 36, 48, 72 - }; + ]; } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/DropDownButtonViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/DropDownButtonViewModel.cs index 50c132a15..4faf3293d 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/DropDownButtonViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/DropDownButtonViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class DropDownButtonViewModel : ObservableObject { } +public partial class DropDownButtonViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/HyperlinkButtonViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/HyperlinkButtonViewModel.cs index 4152768a5..2f6669d6a 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/HyperlinkButtonViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/HyperlinkButtonViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class HyperlinkButtonViewModel : ObservableObject +public partial class HyperlinkButtonViewModel : ViewModel { [ObservableProperty] private bool _isHyperlinkEnabled = true; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RadioButtonViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RadioButtonViewModel.cs index e08251a0a..0f8ede55c 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RadioButtonViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RadioButtonViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class RadioButtonViewModel : ObservableObject +public partial class RadioButtonViewModel : ViewModel { [ObservableProperty] private bool _isRadioButtonEnabled = true; @@ -16,7 +16,9 @@ public partial class RadioButtonViewModel : ObservableObject private void OnRadioButtonCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsRadioButtonEnabled = !(checkbox?.IsChecked ?? false); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RatingViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RatingViewModel.cs index 6b336dca3..8df95640c 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RatingViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/RatingViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class RatingViewModel : ObservableObject +public partial class RatingViewModel : ViewModel { [ObservableProperty] private bool _isFirstRatingEnabled = true; @@ -25,7 +25,9 @@ public partial class RatingViewModel : ObservableObject private void OnFirstRatingCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsFirstRatingEnabled = !(checkbox?.IsChecked ?? false); } @@ -34,7 +36,9 @@ private void OnFirstRatingCheckboxChecked(object sender) private void OnSecondRatingCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsSecondRatingEnabled = !(checkbox?.IsChecked ?? false); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SliderViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SliderViewModel.cs index c4142e7c8..f3214a91b 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SliderViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SliderViewModel.cs @@ -5,7 +5,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class SliderViewModel : ObservableObject +public partial class SliderViewModel : ViewModel { [ObservableProperty] private int _simpleSliderValue = 0; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SplitButtonViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SplitButtonViewModel.cs index 5e189cf8b..7ea893c78 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SplitButtonViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/SplitButtonViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class SplitButtonViewModel : ObservableObject { } +public partial class SplitButtonViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ThumbRateViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ThumbRateViewModel.cs index 89c1951b9..1253e33fd 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ThumbRateViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ThumbRateViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class ThumbRateViewModel : ObservableObject +public partial class ThumbRateViewModel : ViewModel { [ObservableProperty] private string _thumRateStateText = "Liked"; @@ -16,13 +16,12 @@ public partial class ThumbRateViewModel : ObservableObject private string _thumRateStateCodeText = ""; private ThumbRateState _thumbRateState = ThumbRateState.Liked; + public ThumbRateState ThumbRateState { get => _thumbRateState; set { - SetProperty(ref _thumbRateState, value); - ThumRateStateText = value switch { ThumbRateState.Liked => "Liked", @@ -30,13 +29,8 @@ public ThumbRateState ThumbRateState _ => "None" }; - ThumRateStateCodeText = - $" "Liked", - ThumbRateState.Disliked => "Disliked", - _ => "None" - })}\" />"; + ThumRateStateCodeText = $""; + _ = SetProperty(ref _thumbRateState, value); } } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleButtonViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleButtonViewModel.cs index 015b7f12a..c73c965db 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleButtonViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleButtonViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class ToggleButtonViewModel : ObservableObject +public partial class ToggleButtonViewModel : ViewModel { [ObservableProperty] private bool _isToggleButtonEnabled = true; @@ -16,7 +16,9 @@ public partial class ToggleButtonViewModel : ObservableObject private void OnToggleButtonCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsToggleButtonEnabled = !(checkbox?.IsChecked ?? false); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleSwitchViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleSwitchViewModel.cs index 53b67d545..2ed86672c 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleSwitchViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/BasicInput/ToggleSwitchViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.BasicInput; -public partial class ToggleSwitchViewModel : ObservableObject +public partial class ToggleSwitchViewModel : ViewModel { [ObservableProperty] private bool _isToggleSwitchEnabled = true; @@ -16,7 +16,9 @@ public partial class ToggleSwitchViewModel : ObservableObject private void OnToggleSwitchCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsToggleSwitchEnabled = !(checkbox?.IsChecked ?? false); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/CollectionsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/CollectionsViewModel.cs index ac2b78c44..823ff479b 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/CollectionsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/CollectionsViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Collections; -public partial class CollectionsViewModel : ObservableObject +public partial class CollectionsViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/DataGridViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/DataGridViewModel.cs index 70a4e4156..fa30d78bc 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/DataGridViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/DataGridViewModel.cs @@ -7,24 +7,19 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Collections; -public partial class DataGridViewModel : ObservableObject +public partial class DataGridViewModel : ViewModel { [ObservableProperty] - private ObservableCollection _productsCollection; + private ObservableCollection _productsCollection = GenerateProducts(); - public DataGridViewModel() - { - _productsCollection = GenerateProducts(); - } - - private ObservableCollection GenerateProducts() + private static ObservableCollection GenerateProducts() { var random = new Random(); var products = new ObservableCollection { }; var adjectives = new[] { "Red", "Blueberry" }; var names = new[] { "Marmalade", "Dumplings", "Soup" }; - var units = new[] { "grams", "kilograms", "milliliters" }; + Unit[] units = [Unit.Grams, Unit.Kilograms, Unit.Milliliters]; for (int i = 0; i < 50; i++) { @@ -37,6 +32,7 @@ private ObservableCollection GenerateProducts() adjectives[random.Next(0, adjectives.Length)] + " " + names[random.Next(0, names.Length)], + Unit = units[random.Next(0, units.Length)], UnitPrice = Math.Round(random.NextDouble() * 20.0, 3), UnitsInStock = random.Next(0, 100), IsVirtual = random.Next(0, 2) == 1 diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListBoxViewModel.cs index 4a82a5c23..78ff39e9b 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListBoxViewModel.cs @@ -5,20 +5,15 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Collections; -public partial class ListBoxViewModel : ObservableObject +public partial class ListBoxViewModel : ViewModel { [ObservableProperty] - private ObservableCollection _listBoxItems; - - public ListBoxViewModel() - { - _listBoxItems = new ObservableCollection - { - "Arial", - "Comic Sans MS", - "Courier New", - "Segoe UI", - "Times New Roman" - }; - } + private ObservableCollection _listBoxItems = + [ + "Arial", + "Comic Sans MS", + "Courier New", + "Segoe UI", + "Times New Roman" + ]; } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListViewViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListViewViewModel.cs index 5099d5819..fb6a222e5 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListViewViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/ListViewViewModel.cs @@ -8,7 +8,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Collections; -public partial class ListViewViewModel : ObservableObject +public partial class ListViewViewModel : ViewModel { private int _listViewSelectionModeComboBoxSelectedIndex = 0; @@ -17,7 +17,7 @@ public int ListViewSelectionModeComboBoxSelectedIndex get => _listViewSelectionModeComboBoxSelectedIndex; set { - SetProperty(ref _listViewSelectionModeComboBoxSelectedIndex, value); + _ = SetProperty(ref _listViewSelectionModeComboBoxSelectedIndex, value); UpdateListViewSelectionMode(value); } } @@ -26,14 +26,9 @@ public int ListViewSelectionModeComboBoxSelectedIndex private SelectionMode _listViewSelectionMode = SelectionMode.Single; [ObservableProperty] - private ObservableCollection _basicListViewItems; + private ObservableCollection _basicListViewItems = GeneratePersons(); - public ListViewViewModel() - { - _basicListViewItems = GeneratePersons(); - } - - private ObservableCollection GeneratePersons() + private static ObservableCollection GeneratePersons() { var random = new Random(); var persons = new ObservableCollection(); @@ -83,6 +78,7 @@ private ObservableCollection GeneratePersons() }; for (int i = 0; i < 50; i++) + { persons.Add( new Person( names[random.Next(0, names.Length)], @@ -90,6 +86,7 @@ private ObservableCollection GeneratePersons() companies[random.Next(0, companies.Length)] ) ); + } return persons; } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeListViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeListViewModel.cs index 31a630050..a2c224309 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeListViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeListViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Collections; -public partial class TreeListViewModel : ObservableObject { } +public partial class TreeListViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeViewViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeViewViewModel.cs index a4ecfe629..7ac2971af 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeViewViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Collections/TreeViewViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Collections; -public partial class TreeViewViewModel : ObservableObject { } +public partial class TreeViewViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DashboardViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DashboardViewModel.cs index 4aaacf993..7e613a4af 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DashboardViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DashboardViewModel.cs @@ -7,19 +7,12 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages; -public partial class DashboardViewModel : ObservableObject +public partial class DashboardViewModel(INavigationService navigationService) : ViewModel { - private readonly INavigationService _navigationService; - - public DashboardViewModel(INavigationService navigationService) - { - _navigationService = navigationService; - } - [RelayCommand] private void OnCardClick(string parameter) { - if (String.IsNullOrWhiteSpace(parameter)) + if (string.IsNullOrWhiteSpace(parameter)) { return; } @@ -31,6 +24,6 @@ private void OnCardClick(string parameter) return; } - _ = _navigationService.Navigate(pageType); + _ = navigationService.Navigate(pageType); } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarDatePickerViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarDatePickerViewModel.cs index 2a70e5f3d..270e413a7 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarDatePickerViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarDatePickerViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DateAndTime; -public partial class CalendarDatePickerViewModel : ObservableObject { } +public partial class CalendarDatePickerViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarViewModel.cs index 2fc89d297..35a2c6cdd 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/CalendarViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DateAndTime; -public partial class CalendarViewModel : ObservableObject { } +public partial class CalendarViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DateAndTimeViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DateAndTimeViewModel.cs index c49bd9cbd..166dd1870 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DateAndTimeViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DateAndTimeViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DateAndTime; -public partial class DateAndTimeViewModel : ObservableObject +public partial class DateAndTimeViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DatePickerViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DatePickerViewModel.cs index abc8ce110..aaab6ce6c 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DatePickerViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/DatePickerViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DateAndTime; -public partial class DatePickerViewModel : ObservableObject { } +public partial class DatePickerViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/TimePickerViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/TimePickerViewModel.cs index 0cd7c902d..9eda433b1 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/TimePickerViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DateAndTime/TimePickerViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DateAndTime; -public partial class TimePickerViewModel : ObservableObject { } +public partial class TimePickerViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/ColorsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/ColorsViewModel.cs index 8fdadc0ba..d3e551289 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/ColorsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/ColorsViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DesignGuidance; -public partial class ColorsViewModel : ObservableObject { } +public partial class ColorsViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/IconsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/IconsViewModel.cs index 796604395..51a3a97de 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/IconsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/IconsViewModel.cs @@ -9,45 +9,45 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DesignGuidance; -public partial class IconsViewModel : ObservableObject, INavigationAware +public partial class IconsViewModel : ViewModel { private int _selectedIconId = 0; - private string _autoSuggestBoxText = String.Empty; + private string _autoSuggestBoxText = string.Empty; [ObservableProperty] private SymbolRegular _selectedSymbol = SymbolRegular.Empty; [ObservableProperty] - private string _selectedSymbolName = String.Empty; + private string _selectedSymbolName = string.Empty; [ObservableProperty] - private string _selectedSymbolUnicodePoint = String.Empty; + private string _selectedSymbolUnicodePoint = string.Empty; [ObservableProperty] - private string _selectedSymbolTextGlyph = String.Empty; + private string _selectedSymbolTextGlyph = string.Empty; [ObservableProperty] - private string _selectedSymbolXaml = String.Empty; + private string _selectedSymbolXaml = string.Empty; [ObservableProperty] private bool _isIconFilled = false; [ObservableProperty] - private ICollection _iconsCollection = new List(); + private List _iconsCollection = []; [ObservableProperty] - private ICollection _filteredIconsCollection = new DisplayableIcon[] { }; + private List _filteredIconsCollection = []; [ObservableProperty] - private ICollection _iconNames = new string[] { }; + private List _iconNames = []; public string AutoSuggestBoxText { get => _autoSuggestBoxText; set { - SetProperty(ref _autoSuggestBoxText, value); + _ = SetProperty(ref _autoSuggestBoxText, value); UpdateSearchResults(value); } } @@ -64,7 +64,7 @@ public IconsViewModel() foreach (string iconName in names) { - var icon = SymbolGlyph.Parse(iconName); + SymbolRegular icon = SymbolGlyph.Parse(iconName); icons.Add( new DisplayableIcon @@ -80,7 +80,7 @@ public IconsViewModel() IconsCollection = icons; FilteredIconsCollection = icons; - IconNames = icons.Select(icon => icon.Name).ToArray(); + IconNames = icons.Select(icon => icon.Name).ToList(); if (icons.Count > 4) { @@ -91,10 +91,6 @@ public IconsViewModel() }); } - public void OnNavigatedTo() { } - - public void OnNavigatedFrom() { } - [RelayCommand] public void OnIconSelected(int parameter) { @@ -107,7 +103,9 @@ public void OnIconSelected(int parameter) public void OnCheckboxChecked(object sender) { if (sender is not CheckBox checkbox) + { return; + } IsIconFilled = checkbox?.IsChecked ?? false; @@ -117,23 +115,25 @@ public void OnCheckboxChecked(object sender) private void UpdateSymbolData() { if (IconsCollection.Count - 1 < _selectedIconId) + { return; + } - var selectedSymbol = IconsCollection.FirstOrDefault(sym => sym.Id == _selectedIconId); + DisplayableIcon selectedSymbol = IconsCollection.FirstOrDefault(sym => sym.Id == _selectedIconId); SelectedSymbol = selectedSymbol.Icon; SelectedSymbolName = selectedSymbol.Name; SelectedSymbolUnicodePoint = selectedSymbol.Code; SelectedSymbolTextGlyph = $"&#x{selectedSymbol.Code};"; SelectedSymbolXaml = - $""; + $""; } private void UpdateSearchResults(string searchedText) { _ = Task.Run(() => { - if (String.IsNullOrEmpty(searchedText)) + if (string.IsNullOrEmpty(searchedText)) { FilteredIconsCollection = IconsCollection; @@ -143,8 +143,8 @@ private void UpdateSearchResults(string searchedText) var formattedText = searchedText.ToLower().Trim(); FilteredIconsCollection = IconsCollection - .Where(icon => icon.Name.ToLower().Contains(formattedText)) - .ToArray(); + .Where(icon => icon.Name.Contains(formattedText, StringComparison.OrdinalIgnoreCase)) + .ToList(); return true; }); diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/TypographyViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/TypographyViewModel.cs index be9d040e1..a52880457 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/TypographyViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DesignGuidance/TypographyViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DesignGuidance; -public partial class TypographyViewModel : ObservableObject { } +public partial class TypographyViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/ContentDialogViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/ContentDialogViewModel.cs index 18f425d81..66756260d 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/ContentDialogViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/ContentDialogViewModel.cs @@ -9,10 +9,10 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; -public partial class ContentDialogViewModel(IContentDialogService contentDialogService) : ObservableObject +public partial class ContentDialogViewModel(IContentDialogService contentDialogService) : ViewModel { [ObservableProperty] - private string _dialogResultText = String.Empty; + private string _dialogResultText = string.Empty; [RelayCommand] private async Task OnShowDialog(object content) @@ -39,7 +39,7 @@ private async Task OnShowDialog(object content) [RelayCommand] private async Task OnShowSignInContentDialog() { - var termsOfUseContentDialog = new TermsOfUseContentDialog(contentDialogService.GetContentPresenter()); + var termsOfUseContentDialog = new TermsOfUseContentDialog(contentDialogService.GetDialogHost()); _ = await termsOfUseContentDialog.ShowAsync(); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/DialogsAndFlyoutsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/DialogsAndFlyoutsViewModel.cs index 5496721df..892da7468 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/DialogsAndFlyoutsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/DialogsAndFlyoutsViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; -public partial class DialogsAndFlyoutsViewModel : ObservableObject +public partial class DialogsAndFlyoutsViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/FlyoutViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/FlyoutViewModel.cs index e9a1d3814..6f798d5a1 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/FlyoutViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/FlyoutViewModel.cs @@ -5,7 +5,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; -public partial class FlyoutViewModel : ObservableObject +public partial class FlyoutViewModel : ViewModel { [ObservableProperty] private bool _isFlyoutOpen = false; @@ -14,6 +14,8 @@ public partial class FlyoutViewModel : ObservableObject private void OnButtonClick(object sender) { if (!IsFlyoutOpen) + { IsFlyoutOpen = true; + } } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/MessageBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/MessageBoxViewModel.cs index 719779f30..940d50429 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/MessageBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/MessageBoxViewModel.cs @@ -3,18 +3,22 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Diagnostics.CodeAnalysis; + namespace Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; -public partial class MessageBoxViewModel : ObservableObject +public partial class MessageBoxViewModel : ViewModel { + [SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "relay command")] [RelayCommand] private void OnOpenStandardMessageBox(object sender) { - System.Windows.MessageBox.Show("Something about to happen", "I can feel it"); + _ = MessageBox.Show("Something about to happen", "I can feel it"); } + [SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "relay command")] [RelayCommand] - private async void OnOpenCustomMessageBox(object sender) + private async Task OnOpenCustomMessageBox(object sender) { var uiMessageBox = new Wpf.Ui.Controls.MessageBox { @@ -23,6 +27,6 @@ private async void OnOpenCustomMessageBox(object sender) "Never gonna give you up, never gonna let you down Never gonna run around and desert you Never gonna make you cry, never gonna say goodbye", }; - var result = await uiMessageBox.ShowDialogAsync(); + _ = await uiMessageBox.ShowDialogAsync(); } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/SnackbarViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/SnackbarViewModel.cs index 9738cf04d..7b8db4ece 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/SnackbarViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/DialogsAndFlyouts/SnackbarViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; -public partial class SnackbarViewModel(ISnackbarService snackbarService) : ObservableObject +public partial class SnackbarViewModel(ISnackbarService snackbarService) : ViewModel { private ControlAppearance _snackbarAppearance = ControlAppearance.Secondary; @@ -21,7 +21,7 @@ public int SnackbarAppearanceComboBoxSelectedIndex get => _snackbarAppearanceComboBoxSelectedIndex; set { - SetProperty(ref _snackbarAppearanceComboBoxSelectedIndex, value); + _ = SetProperty(ref _snackbarAppearanceComboBoxSelectedIndex, value); UpdateSnackbarAppearance(value); } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardActionViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardActionViewModel.cs index a2db63988..1fac5dd3d 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardActionViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardActionViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Layout; -public partial class CardActionViewModel : ObservableObject { } +public partial class CardActionViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardControlViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardControlViewModel.cs index 216b6f369..1ecff8842 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardControlViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/CardControlViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Layout; -public partial class CardControlViewModel : ObservableObject { } +public partial class CardControlViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/ExpanderViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/ExpanderViewModel.cs index 5bb9e42d0..a815cd09a 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/ExpanderViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/ExpanderViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Layout; -public partial class ExpanderViewModel : ObservableObject { } +public partial class ExpanderViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/LayoutViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/LayoutViewModel.cs index a046d5665..975aff3be 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/LayoutViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Layout/LayoutViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Layout; -public partial class LayoutViewModel : ObservableObject +public partial class LayoutViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/CanvasViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/CanvasViewModel.cs index 55ea703d7..ab429e686 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/CanvasViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/CanvasViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Media; -public partial class CanvasViewModel : ObservableObject { } +public partial class CanvasViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/ImageViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/ImageViewModel.cs index 5acb9a60a..5d2b166e8 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/ImageViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/ImageViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Media; -public partial class ImageViewModel : ObservableObject { } +public partial class ImageViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/MediaViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/MediaViewModel.cs index f5c08dad0..527a880e7 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/MediaViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/MediaViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Media; -public partial class MediaViewModel : ObservableObject +public partial class MediaViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebBrowserViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebBrowserViewModel.cs index 6915162df..6a7090b1a 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebBrowserViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebBrowserViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Media; -public partial class WebBrowserViewModel : ObservableObject { } +public partial class WebBrowserViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebViewViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebViewViewModel.cs index 84dc06d76..0aee24dab 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebViewViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Media/WebViewViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Media; -public partial class WebViewViewModel : ObservableObject { } +public partial class WebViewViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/BreadcrumbBarViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/BreadcrumbBarViewModel.cs index 922cb1026..9bf739c56 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/BreadcrumbBarViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/BreadcrumbBarViewModel.cs @@ -7,19 +7,19 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Navigation; -public partial class BreadcrumbBarViewModel : ObservableObject +public partial class BreadcrumbBarViewModel : ViewModel { - private readonly IEnumerable _baseFoldersCollection = new Folder[] - { + private readonly Folder[] _baseFoldersCollection = + [ new("Home"), new("Folder1"), new("Folder2"), new("Folder3"), - }; + ]; [ObservableProperty] - private ObservableCollection _strings = new ObservableCollection - { + private ObservableCollection _strings = + [ "Home", "Document", "Design", @@ -28,10 +28,10 @@ public partial class BreadcrumbBarViewModel : ObservableObject "Folder1", "Folder2", "Folder3" - }; + ]; [ObservableProperty] - private ObservableCollection _folders = new ObservableCollection { }; + private ObservableCollection _folders = new(); public BreadcrumbBarViewModel() { @@ -45,17 +45,21 @@ private void OnStringSelected(object item) { } private void OnFolderSelected(object item) { if (item is not Folder selectedFolder) + { return; + } var index = Folders.IndexOf(selectedFolder); Folders.Clear(); var counter = 0; - foreach (var folder in _baseFoldersCollection) + foreach (Folder folder in _baseFoldersCollection) { if (counter++ > index) + { break; + } Folders.Add(folder); } @@ -71,7 +75,9 @@ private void ResetFoldersCollection() { Folders.Clear(); - foreach (var folder in _baseFoldersCollection) + foreach (Folder folder in _baseFoldersCollection) + { Folders.Add(folder); + } } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/MenuViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/MenuViewModel.cs index 91b5e88da..caab2d093 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/MenuViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/MenuViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Navigation; -public partial class MenuViewModel : ObservableObject { } +public partial class MenuViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewModel.cs index e71e83dcb..cfb96f614 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Navigation; -public partial class NavigationViewModel : ObservableObject +public partial class NavigationViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewViewModel.cs index b995686d1..e46369ce5 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/NavigationViewViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Navigation; -public partial class NavigationViewViewModel : ObservableObject { } +public partial class NavigationViewViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabControlViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabControlViewModel.cs index e08cba718..cdb2979d8 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabControlViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabControlViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Navigation; -public partial class TabControlViewModel : ObservableObject { } +public partial class TabControlViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabViewViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabViewViewModel.cs index 0b0521b52..ed0253452 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabViewViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Navigation/TabViewViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Navigation; -public partial class TabViewViewModel : ObservableObject { } +public partial class TabViewViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/ClipboardViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/ClipboardViewModel.cs index 3d7cca1e3..1ef8495c8 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/ClipboardViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/ClipboardViewModel.cs @@ -5,7 +5,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.OpSystem; -public partial class ClipboardViewModel : ObservableObject +public partial class ClipboardViewModel : ViewModel { [ObservableProperty] private string _textToCopy = "This text will be copied to the clipboard."; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/FilePickerViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/FilePickerViewModel.cs index 2ab878efd..5414ae842 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/FilePickerViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/FilePickerViewModel.cs @@ -7,43 +7,43 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.OpSystem; -public partial class FilePickerViewModel : ObservableObject +public partial class FilePickerViewModel : ViewModel { [ObservableProperty] private Visibility _openedFilePathVisibility = Visibility.Collapsed; [ObservableProperty] - private string _openedFilePath = String.Empty; + private string _openedFilePath = string.Empty; [ObservableProperty] private Visibility _openedPicturePathVisibility = Visibility.Collapsed; [ObservableProperty] - private string _openedPicturePath = String.Empty; + private string _openedPicturePath = string.Empty; [ObservableProperty] private Visibility _openedMultiplePathVisibility = Visibility.Collapsed; [ObservableProperty] - private string _openedMultiplePath = String.Empty; + private string _openedMultiplePath = string.Empty; [ObservableProperty] private Visibility _openedFolderPathVisibility = Visibility.Collapsed; [ObservableProperty] - private string _openedFolderPath = String.Empty; + private string _openedFolderPath = string.Empty; [ObservableProperty] - private string _fileToSaveName = String.Empty; + private string _fileToSaveName = string.Empty; [ObservableProperty] - private string _fileToSaveContents = String.Empty; + private string _fileToSaveContents = string.Empty; [ObservableProperty] private Visibility _savedFileNoticeVisibility = Visibility.Collapsed; [ObservableProperty] - private string _savedFileNotice = String.Empty; + private string _savedFileNotice = string.Empty; [RelayCommand] public void OnOpenFile() @@ -122,7 +122,7 @@ public void OnOpenMultiple() var fileNames = openFileDialog.FileNames; - OpenedMultiplePath = String.Join("\n", fileNames); + OpenedMultiplePath = string.Join("\n", fileNames); OpenedMultiplePathVisibility = Visibility.Visible; } @@ -149,7 +149,7 @@ public void OnOpenFolder() return; } - OpenedFolderPath = String.Join("\n", openFolderDialog.FolderNames); + OpenedFolderPath = string.Join("\n", openFolderDialog.FolderNames); OpenedFolderPathVisibility = Visibility.Visible; #else OpenedFolderPath = "OpenFolderDialog requires .NET 8 or newer"; @@ -169,13 +169,12 @@ public async Task OnSaveFile(CancellationToken cancellation) InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; - if (!String.IsNullOrEmpty(FileToSaveName)) + if (!string.IsNullOrEmpty(FileToSaveName)) { var invalidChars = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); - saveFileDialog.FileName = String - .Join( + saveFileDialog.FileName = string.Join( "_", FileToSaveName.Split(invalidChars.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) ) diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/OpSystemViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/OpSystemViewModel.cs index c291816b2..d52cd68fb 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/OpSystemViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/OpSystem/OpSystemViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.OpSystem; -public partial class OpSystemViewModel : ObservableObject +public partial class OpSystemViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs index 59b3c2556..b3c693d58 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs @@ -9,14 +9,12 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages; -public sealed partial class SettingsViewModel : ObservableObject, INavigationAware +public sealed partial class SettingsViewModel(INavigationService navigationService) : ViewModel { - private readonly INavigationService _navigationService; - private bool _isInitialized = false; [ObservableProperty] - private string _appVersion = String.Empty; + private string _appVersion = string.Empty; [ObservableProperty] private ApplicationTheme _currentApplicationTheme = ApplicationTheme.Unknown; @@ -25,12 +23,7 @@ public sealed partial class SettingsViewModel : ObservableObject, INavigationAwa private NavigationViewPaneDisplayMode _currentApplicationNavigationStyle = NavigationViewPaneDisplayMode.Left; - public SettingsViewModel(INavigationService navigationService) - { - _navigationService = navigationService; - } - - public void OnNavigatedTo() + public override void OnNavigatedTo() { if (!_isInitialized) { @@ -38,8 +31,6 @@ public void OnNavigatedTo() } } - public void OnNavigatedFrom() { } - partial void OnCurrentApplicationThemeChanged(ApplicationTheme oldValue, ApplicationTheme newValue) { ApplicationThemeManager.Apply(newValue); @@ -50,7 +41,7 @@ partial void OnCurrentApplicationNavigationStyleChanged( NavigationViewPaneDisplayMode newValue ) { - _ = _navigationService.SetPaneDisplayMode(newValue); + _ = navigationService.SetPaneDisplayMode(newValue); } private void InitializeViewModel() @@ -72,8 +63,8 @@ private void OnThemeChanged(ApplicationTheme currentApplicationTheme, Color syst } } - private string GetAssemblyVersion() + private static string GetAssemblyVersion() { - return Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; + return Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? string.Empty; } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBadgeViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBadgeViewModel.cs index e0066d79b..309f99cd0 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBadgeViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBadgeViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.StatusAndInfo; -public partial class InfoBadgeViewModel : ObservableObject +public partial class InfoBadgeViewModel : ViewModel { [ObservableProperty] private InfoBadgeSeverity _infoBadgeSeverity = InfoBadgeSeverity.Attention; @@ -24,7 +24,7 @@ public int InfoBadgeSeverityComboBoxSelectedIndex } } - private InfoBadgeSeverity ConvertIndexToInfoBadgeSeverity(int value) + private static InfoBadgeSeverity ConvertIndexToInfoBadgeSeverity(int value) { return value switch { diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBarViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBarViewModel.cs index a2664617e..0ffae8af4 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBarViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/InfoBarViewModel.cs @@ -7,7 +7,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.StatusAndInfo; -public partial class InfoBarViewModel : ObservableObject +public partial class InfoBarViewModel : ViewModel { [ObservableProperty] private bool _isShortInfoBarOpened = true; @@ -22,30 +22,32 @@ public partial class InfoBarViewModel : ObservableObject private InfoBarSeverity _longInfoBarSeverity = InfoBarSeverity.Informational; private int _shortInfoBarSeverityComboBoxSelectedIndex = 0; + public int ShortInfoBarSeverityComboBoxSelectedIndex { get => _shortInfoBarSeverityComboBoxSelectedIndex; set { - SetProperty(ref _shortInfoBarSeverityComboBoxSelectedIndex, value); + _ = SetProperty(ref _shortInfoBarSeverityComboBoxSelectedIndex, value); ShortInfoBarSeverity = ConvertIndexToInfoBarSeverity(value); } } private int _longInfoBarSeverityComboBoxSelectedIndex = 0; + public int LongInfoBarSeverityComboBoxSelectedIndex { get => _longInfoBarSeverityComboBoxSelectedIndex; set { - SetProperty(ref _longInfoBarSeverityComboBoxSelectedIndex, value); + _ = SetProperty(ref _longInfoBarSeverityComboBoxSelectedIndex, value); LongInfoBarSeverity = ConvertIndexToInfoBarSeverity(value); } } - private InfoBarSeverity ConvertIndexToInfoBarSeverity(int value) + private static InfoBarSeverity ConvertIndexToInfoBarSeverity(int value) { return value switch { diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressBarViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressBarViewModel.cs index de6d7cae9..202ff974f 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressBarViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressBarViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.StatusAndInfo; -public partial class ProgressBarViewModel : ObservableObject { } +public partial class ProgressBarViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressRingViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressRingViewModel.cs index 99947d80a..fe5271f23 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressRingViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ProgressRingViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.StatusAndInfo; -public partial class ProgressRingViewModel : ObservableObject { } +public partial class ProgressRingViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/StatusAndInfoViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/StatusAndInfoViewModel.cs index c3bc9e8af..1fafb8ddc 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/StatusAndInfoViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/StatusAndInfoViewModel.cs @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.StatusAndInfo; -public partial class StatusAndInfoViewModel : ObservableObject +public partial class StatusAndInfoViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ToolTipViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ToolTipViewModel.cs index bbd848216..b706e4329 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ToolTipViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/StatusAndInfo/ToolTipViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.StatusAndInfo; -public partial class ToolTipViewModel : ObservableObject { } +public partial class ToolTipViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/AutoSuggestBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/AutoSuggestBoxViewModel.cs index 2dc435802..932cc4f20 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/AutoSuggestBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/AutoSuggestBoxViewModel.cs @@ -5,24 +5,25 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class AutoSuggestBoxViewModel : ObservableObject +public partial class AutoSuggestBoxViewModel : ViewModel { [ObservableProperty] - private IEnumerable _autoSuggestBoxSuggestions = new[] - { - "John", - "Winston", - "Adrianna", - "Spencer", - "Phoebe", - "Lucas", - "Carl", - "Marissa", - "Brandon", - "Antoine", - "Arielle", - "Arielle", - "Jamie", - "Alexzander" - }; + private List _autoSuggestBoxSuggestions = + new() + { + "John", + "Winston", + "Adrianna", + "Spencer", + "Phoebe", + "Lucas", + "Carl", + "Marissa", + "Brandon", + "Antoine", + "Arielle", + "Arielle", + "Jamie", + "Alexzander" + }; } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/LabelViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/LabelViewModel.cs index 897f59184..ac8f086d6 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/LabelViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/LabelViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class LabelViewModel : ObservableObject { } +public partial class LabelViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/NumberBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/NumberBoxViewModel.cs index c39fc7f40..2203f05bc 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/NumberBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/NumberBoxViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class NumberBoxViewModel : ObservableObject { } +public partial class NumberBoxViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/PasswordBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/PasswordBoxViewModel.cs index 17949e1f0..cb6bdea9c 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/PasswordBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/PasswordBoxViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class PasswordBoxViewModel : ObservableObject { } +public partial class PasswordBoxViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/RichTextBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/RichTextBoxViewModel.cs index 423af0ef1..7a40cc12e 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/RichTextBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/RichTextBoxViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class RichTextBoxViewModel : ObservableObject { } +public partial class RichTextBoxViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBlockViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBlockViewModel.cs index 55a784a6e..849b86adb 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBlockViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBlockViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class TextBlockViewModel : ObservableObject { } +public partial class TextBlockViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBoxViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBoxViewModel.cs index 24f490b85..4a54d5d1c 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBoxViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextBoxViewModel.cs @@ -5,4 +5,4 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class TextBoxViewModel : ObservableObject { } +public partial class TextBoxViewModel : ViewModel; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextViewModel.cs index 96f1144a3..f2b533ae2 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Text/TextViewModel.cs @@ -1,4 +1,4 @@ -// This Source Code Form is subject to the terms of the MIT License. +// This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. @@ -9,7 +9,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Text; -public partial class TextViewModel : ObservableObject +public partial class TextViewModel : ViewModel { [ObservableProperty] private ICollection _navigationCards = new ObservableCollection( diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/Windows/WindowsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/Windows/WindowsViewModel.cs index 79a265891..94a161b52 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/Windows/WindowsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/Windows/WindowsViewModel.cs @@ -10,22 +10,22 @@ namespace Wpf.Ui.Gallery.ViewModels.Pages.Windows; -public partial class WindowsViewModel(WindowsProviderService windowsProviderService) : ObservableObject +public partial class WindowsViewModel(WindowsProviderService windowsProviderService) : ViewModel { [ObservableProperty] - private IEnumerable _windowCards = new WindowCard[] - { + private WindowCard[] _windowCards = + [ new("Monaco", "Visual Studio Code in your WPF app.", SymbolRegular.CodeBlock24, "monaco"), new("Editor", "Text editor with tabbed background.", SymbolRegular.ScanText24, "editor"), #if DEBUG new("Sandbox", "Sandbox for controls testing.", SymbolRegular.ScanText24, "sandbox"), #endif - }; + ]; [RelayCommand] public void OnOpenWindow(string value) { - if (String.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) { return; } diff --git a/src/Wpf.Ui.Gallery/ViewModels/ViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/ViewModel.cs new file mode 100644 index 000000000..d82d5a5e3 --- /dev/null +++ b/src/Wpf.Ui.Gallery/ViewModels/ViewModel.cs @@ -0,0 +1,37 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +namespace Wpf.Ui.Gallery.ViewModels; + +public abstract partial class ViewModel : ObservableObject, INavigationAware +{ + /// + public virtual Task OnNavigatedToAsync() + { + OnNavigatedTo(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired after the component is navigated to. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedTo() { } + + /// + public virtual Task OnNavigatedFromAsync() + { + OnNavigatedFrom(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired before the component is navigated from. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedFrom() { } +} diff --git a/src/Wpf.Ui.Gallery/ViewModels/Windows/EditorWindowViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Windows/EditorWindowViewModel.cs index c7051b616..5b5b61f0c 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Windows/EditorWindowViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Windows/EditorWindowViewModel.cs @@ -5,7 +5,7 @@ namespace Wpf.Ui.Gallery.ViewModels.Windows; -public partial class EditorWindowViewModel : ObservableObject +public partial class EditorWindowViewModel : ViewModel { [ObservableProperty] private bool _isWordWrapEnbaled = false; diff --git a/src/Wpf.Ui.Gallery/ViewModels/Windows/MainWindowViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Windows/MainWindowViewModel.cs index e45879a95..c6101117e 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Windows/MainWindowViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Windows/MainWindowViewModel.cs @@ -5,7 +5,9 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; +using Microsoft.Extensions.Localization; using Wpf.Ui.Controls; +using Wpf.Ui.Gallery.Resources; using Wpf.Ui.Gallery.Views.Pages; using Wpf.Ui.Gallery.Views.Pages.BasicInput; using Wpf.Ui.Gallery.Views.Pages.Collections; @@ -22,14 +24,14 @@ namespace Wpf.Ui.Gallery.ViewModels.Windows; -public partial class MainWindowViewModel : ObservableObject +public partial class MainWindowViewModel(IStringLocalizer localizer) : ViewModel { [ObservableProperty] - private string _applicationTitle = "WPF UI Gallery"; + private string _applicationTitle = localizer["WPF UI Gallery"]; [ObservableProperty] - private ICollection _menuItems = new ObservableCollection - { + private ObservableCollection _menuItems = + [ new NavigationViewItem("Home", SymbolRegular.Home24, typeof(DashboardPage)), new NavigationViewItem() { @@ -171,19 +173,18 @@ public partial class MainWindowViewModel : ObservableObject } }, new NavigationViewItem("Windows", SymbolRegular.WindowApps24, typeof(WindowsPage)) - }; + ]; [ObservableProperty] - private ICollection _footerMenuItems = new ObservableCollection() - { + private ObservableCollection _footerMenuItems = + [ new NavigationViewItem("Settings", SymbolRegular.Settings24, typeof(SettingsPage)) - }; + ]; [ObservableProperty] private ObservableCollection _trayMenuItems = - new() - { - new Wpf.Ui.Controls.MenuItem { Header = "Home", Tag = "tray_home" }, - new Wpf.Ui.Controls.MenuItem { Header = "Close", Tag = "tray_close" } - }; + [ + new Wpf.Ui.Controls.MenuItem { Header = "Home", Tag = "tray_home" }, + new Wpf.Ui.Controls.MenuItem { Header = "Close", Tag = "tray_close" } + ]; } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Windows/MonacoWindowViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Windows/MonacoWindowViewModel.cs index 1517e700c..554e6a95e 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Windows/MonacoWindowViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Windows/MonacoWindowViewModel.cs @@ -3,24 +3,29 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Windows.Threading; using Microsoft.Web.WebView2.Wpf; using Wpf.Ui.Gallery.Controllers; using Wpf.Ui.Gallery.Models.Monaco; namespace Wpf.Ui.Gallery.ViewModels.Windows; -public partial class MonacoWindowViewModel : ObservableObject +public partial class MonacoWindowViewModel : ViewModel { private MonacoController? _monacoController; public void SetWebView(WebView2 webView) { webView.NavigationCompleted += OnWebViewNavigationCompleted; - webView.UseLayoutRounding = true; - webView.DefaultBackgroundColor = System.Drawing.Color.Transparent; - webView.Source = new Uri( - System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"Assets\Monaco\index.html") + webView.SetCurrentValue(FrameworkElement.UseLayoutRoundingProperty, true); + webView.SetCurrentValue(WebView2.DefaultBackgroundColorProperty, System.Drawing.Color.Transparent); + webView.SetCurrentValue( + WebView2.SourceProperty, + new Uri( + System.IO.Path.Combine( + System.AppDomain.CurrentDomain.BaseDirectory, + @"Assets\Monaco\index.html" + ) + ) ); _monacoController = new MonacoController(webView); @@ -52,7 +57,7 @@ Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e DispatchAsync(InitializeEditorAsync); } - private DispatcherOperation DispatchAsync(Func callback) + private static DispatcherOperation DispatchAsync(Func callback) { return Application.Current.Dispatcher.InvokeAsync(callback); } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Windows/SandboxWindowViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Windows/SandboxWindowViewModel.cs index 57011bb4a..6d2ec409b 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Windows/SandboxWindowViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Windows/SandboxWindowViewModel.cs @@ -5,8 +5,8 @@ namespace Wpf.Ui.Gallery.ViewModels.Windows; -public partial class SandboxWindowViewModel : ObservableObject +public partial class SandboxWindowViewModel : ViewModel { [ObservableProperty] - public string? _autoSuggestBoxText; + private string? _autoSuggestBoxText; } diff --git a/src/Wpf.Ui.Gallery/Views/Pages/AllControlsPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/AllControlsPage.xaml.cs index d6dcf1e34..866dcab3e 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/AllControlsPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/AllControlsPage.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ViewModels.Pages; namespace Wpf.Ui.Gallery.Views.Pages; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/AnchorPage.xaml b/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/AnchorPage.xaml index b8fc460f8..ba92319b8 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/AnchorPage.xaml +++ b/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/AnchorPage.xaml @@ -34,7 +34,7 @@ Content="WPF UI anchor" Icon="{ui:SymbolIcon Link24}" IsEnabled="{Binding ViewModel.IsAnchorEnabled, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:AnchorPage}, Mode=OneWay}" - NavigateUri="https://dev.lepo.co/" /> + NavigateUri="https://lepo.co/" /> + NavigateUri="https://lepo.co/" /> + NavigateUri="https://lepo.co/" /> + NavigateUri="https://lepo.co/" /> diff --git a/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/RadioButtonPage.xaml b/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/RadioButtonPage.xaml index 36caf2865..899985fea 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/RadioButtonPage.xaml +++ b/src/Wpf.Ui.Gallery/Views/Pages/BasicInput/RadioButtonPage.xaml @@ -46,7 +46,7 @@ Grid.Column="1" Command="{Binding ViewModel.RadioButtonCheckboxCheckedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:RadioButtonPage}, Mode=OneWay}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Mode=OneWay}" - Content="Disable RadioButton's" /> + Content="Disable radio buttons" /> diff --git a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialog.xaml b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialogPage.xaml similarity index 100% rename from src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialog.xaml rename to src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialogPage.xaml diff --git a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialog.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialogPage.xaml.cs similarity index 99% rename from src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialog.xaml.cs rename to src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialogPage.xaml.cs index be60b6e58..ce58619bd 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialog.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/ContentDialogPage.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. - using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ControlsLookup; using Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/DialogsAndFlyoutsPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/DialogsAndFlyoutsPage.xaml.cs index f1c0640b0..66a162779 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/DialogsAndFlyoutsPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/DialogsAndFlyoutsPage.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. - using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/FlyoutPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/FlyoutPage.xaml.cs index c7d3b6625..463f5bd36 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/FlyoutPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/FlyoutPage.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. - using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ControlsLookup; using Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/MessageBoxPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/MessageBoxPage.xaml.cs index 9f69c5b96..5fc81e8d1 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/MessageBoxPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/MessageBoxPage.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. - using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ControlsLookup; using Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/SnackbarPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/SnackbarPage.xaml.cs index 33c1b8662..cdf8ea319 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/SnackbarPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/DialogsAndFlyouts/SnackbarPage.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. - using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ViewModels.Pages.DialogsAndFlyouts; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/Layout/CardActionPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/Layout/CardActionPage.xaml.cs index 4715e9817..ab41da6d3 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/Layout/CardActionPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/Layout/CardActionPage.xaml.cs @@ -3,20 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ControlsLookup; using Wpf.Ui.Gallery.ViewModels.Pages.Layout; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/Layout/ExpanderPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/Layout/ExpanderPage.xaml.cs index 89af1d655..5dbf69feb 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/Layout/ExpanderPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/Layout/ExpanderPage.xaml.cs @@ -1,4 +1,9 @@ -using Wpf.Ui.Controls; +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ControlsLookup; using Wpf.Ui.Gallery.ViewModels.Pages.Layout; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/Layout/LayoutPage.xaml.cs b/src/Wpf.Ui.Gallery/Views/Pages/Layout/LayoutPage.xaml.cs index 125c16a9b..c5a7469e7 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/Layout/LayoutPage.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Pages/Layout/LayoutPage.xaml.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. - using Wpf.Ui.Controls; using Wpf.Ui.Gallery.ViewModels.Pages.Layout; diff --git a/src/Wpf.Ui.Gallery/Views/Pages/SettingsPage.xaml b/src/Wpf.Ui.Gallery/Views/Pages/SettingsPage.xaml index 6d28b61c7..100ca7b04 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/SettingsPage.xaml +++ b/src/Wpf.Ui.Gallery/Views/Pages/SettingsPage.xaml @@ -91,7 +91,7 @@ Grid.Row="1" Grid.Column="0" Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}" - Text="© 2023 lepo.co | Leszek Pomianowski & WPF UI Contributors" /> + Text="© 2024 lepo.co | Leszek Pomianowski & WPF UI Contributors" /> _line; - // set - // { - // if (value == _line) - // return; - // _line = value; - // OnPropertyChanged(nameof(Line)); - // } - // } - - // public int Character - // { - // get => _character; - // set - // { - // if (value == _character) - // return; - // _character = value; - // OnPropertyChanged(nameof(Character)); - // } - // } - - // public int Progress - // { - // get => _progress; - // set - // { - // if (value == _progress) - // return; - // _progress = value; - // OnPropertyChanged(nameof(Progress)); - // } - // } - - // public string File - // { - // get => _file; - // set - // { - // if (value == _file) - // return; - // _file = value; - // OnPropertyChanged(nameof(File)); - // } - // } - // } - - // private EditorDataStack DataStack = new(); - - // public string Line { get; set; } = "0"; - - // public EditorWindow(EditorWindowViewModel viewModel) - // { - // ViewModel = viewModel; - - // InitializeComponent(); - - // DataContext = DataStack; - // } - - // private void MenuItem_OnClick(object sender, RoutedEventArgs e) - // { - // if (sender is not MenuItem item) - // return; - - // string tag = item?.Tag as string ?? String.Empty; - - //#if DEBUG - // System.Diagnostics.Debug.WriteLine("DEBUG | Clicked: " + tag, "Wpf.Ui.Demo"); - //#endif - - // switch (tag) - // { - // case "exit": - // Close(); - - // break; - - // case "save": - // Save(); - - // break; - - // case "open": - // Open(); - - // break; - - // case "new_file": - // RootTextBox.Document = new(); - // DataStack.File = "Draft"; - - // break; - - // case "new_window": - // EditorWindow editorWindow = new(ViewModel); - // editorWindow.Owner = this; - // editorWindow.Show(); - - // break; - - // case "word_wrap": - // RootSnackbar.Title = "Word wrapping changed!"; - // RootSnackbar.Message = "Currently word wrapping is " + (item.IsChecked ? "Enabled" : "Disabled"); - // RootSnackbar.Show(); - - // break; - - // case "status_bar": - // RootStatusBar.Visibility = item.IsChecked ? Visibility.Visible : Visibility.Collapsed; - - // break; - - // default: - // ActionDialog.Show(); - - // break; - // } - // } - - // private void Save() - // { - // OpenFileDialog openFileDialog = new OpenFileDialog(); - // if (openFileDialog.ShowDialog() == true) - // { - // DataStack.File = openFileDialog.FileName; - // // Save - // } - // } - - // private void Open() - // { - // OpenFileDialog openFileDialog = new OpenFileDialog(); - // if (openFileDialog.ShowDialog() == true) - // { - // DataStack.File = openFileDialog.FileName; - // // Load - // } - // } - - // private void UpdateLine() - // { - // TextPointer caretPosition = RootTextBox.CaretPosition; - // TextPointer p = RootTextBox.Document.ContentStart.GetLineStartPosition(0); - - // RootTextBox.CaretPosition.GetLineStartPosition(-Int32.MaxValue, out int lineMoved); + /* + internal class EditorDataStack : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged(string name) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); + } + + private int + _line = 1, + _character = 0, + _progress = 80; + + private string _file = "Draft"; + + public int Line + { + get => _line; + set + { + if (value == _line) + return; + _line = value; + OnPropertyChanged(nameof(Line)); + } + } + + public int Character + { + get => _character; + set + { + if (value == _character) + return; + _character = value; + OnPropertyChanged(nameof(Character)); + } + } + + public int Progress + { + get => _progress; + set + { + if (value == _progress) + return; + _progress = value; + OnPropertyChanged(nameof(Progress)); + } + } + + public string File + { + get => _file; + set + { + if (value == _file) + return; + _file = value; + OnPropertyChanged(nameof(File)); + } + } + } + + private EditorDataStack DataStack = new(); + + public string Line { get; set; } = "0"; + + public EditorWindow(EditorWindowViewModel viewModel) + { + ViewModel = viewModel; + + InitializeComponent(); + + DataContext = DataStack; + } + + private void MenuItem_OnClick(object sender, RoutedEventArgs e) + { + if (sender is not MenuItem item) + return; + + string tag = item?.Tag as string ?? String.Empty; + + System.Diagnostics.Debug.WriteLine("DEBUG | Clicked: " + tag, "Wpf.Ui.Demo"); + + switch (tag) + { + case "exit": + Close(); + + break; + + case "save": + Save(); + + break; + + case "open": + Open(); + + break; + + case "new_file": + RootTextBox.Document = new(); + DataStack.File = "Draft"; + + break; + + case "new_window": + EditorWindow editorWindow = new(ViewModel); + editorWindow.Owner = this; + editorWindow.Show(); + + break; + + case "word_wrap": + RootSnackbar.Title = "Word wrapping changed!"; + RootSnackbar.Message = "Currently word wrapping is " + (item.IsChecked ? "Enabled" : "Disabled"); + RootSnackbar.Show(); + + break; - // DataStack.Line = -lineMoved; - // DataStack.Character = Math.Max(p.GetOffsetToPosition(caretPosition) - 1, 0); - // } - - // private void RootTextBox_OnGotFocus(object sender, RoutedEventArgs e) - // { - //#if DEBUG - // System.Diagnostics.Debug.WriteLine("DEBUG | Editor got focus", "Wpf.Ui.Demo.Editor"); - //#endif - // UpdateLine(); - // } - - // private void RootTextBox_OnPreviewMouseDown(object sender, MouseButtonEventArgs e) - // { - // if (e.ClickCount > 2) - // return; - //#if DEBUG - // System.Diagnostics.Debug.WriteLine("DEBUG | Editor mouse down", "Wpf.Ui.Demo.Editor"); - //#endif - // UpdateLine(); - // } - - // private void RootTextBox_OnPreviewKeyUp(object sender, KeyEventArgs e) - // { - //#if DEBUG - // System.Diagnostics.Debug.WriteLine("DEBUG | Editor key up", "Wpf.Ui.Demo.Editor"); - //#endif - // UpdateLine(); - // } - - // private void ActionDialog_OnButtonRightClick(object sender, RoutedEventArgs e) - // { - // ActionDialog.Hide(); - // } + case "status_bar": + RootStatusBar.Visibility = item.IsChecked ? Visibility.Visible : Visibility.Collapsed; + + break; + + default: + ActionDialog.Show(); + + break; + } + } + + private void Save() + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + if (openFileDialog.ShowDialog() == true) + { + DataStack.File = openFileDialog.FileName; + // Save + } + } + + private void Open() + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + if (openFileDialog.ShowDialog() == true) + { + DataStack.File = openFileDialog.FileName; + // Load + } + } + + private void UpdateLine() + { + TextPointer caretPosition = RootTextBox.CaretPosition; + TextPointer p = RootTextBox.Document.ContentStart.GetLineStartPosition(0); + + RootTextBox.CaretPosition.GetLineStartPosition(-Int32.MaxValue, out int lineMoved); + + DataStack.Line = -lineMoved; + DataStack.Character = Math.Max(p.GetOffsetToPosition(caretPosition) - 1, 0); + } + + private void RootTextBox_OnGotFocus(object sender, RoutedEventArgs e) + { + System.Diagnostics.Debug.WriteLine("DEBUG | Editor got focus", "Wpf.Ui.Demo.Editor"); + UpdateLine(); + } + + private void RootTextBox_OnPreviewMouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ClickCount > 2) + return; + System.Diagnostics.Debug.WriteLine("DEBUG | Editor mouse down", "Wpf.Ui.Demo.Editor"); + UpdateLine(); + } + + private void RootTextBox_OnPreviewKeyUp(object sender, KeyEventArgs e) + { + System.Diagnostics.Debug.WriteLine("DEBUG | Editor key up", "Wpf.Ui.Demo.Editor"); + UpdateLine(); + } + + private void ActionDialog_OnButtonRightClick(object sender, RoutedEventArgs e) + { + ActionDialog.Hide(); + } + */ } diff --git a/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml b/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml index 8bdf9a37a..a6a9607a2 100644 --- a/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml +++ b/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml @@ -4,6 +4,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:Wpf.Ui.Gallery.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:i18n="http://schemas.lepo.co/i18n/2022/xaml" xmlns:local="clr-namespace:Wpf.Ui.Gallery.Views.Windows" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:tray="http://schemas.lepo.co/wpfui/2022/xaml/tray" @@ -57,7 +58,7 @@ - + diff --git a/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml.cs b/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml.cs index c6162052f..cf2543f77 100644 --- a/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Windows/MainWindow.xaml.cs @@ -29,9 +29,7 @@ IContentDialogService contentDialogService snackbarService.SetSnackbarPresenter(SnackbarPresenter); navigationService.SetNavigationControl(NavigationView); - contentDialogService.SetContentPresenter(RootContentDialog); - - NavigationView.SetServiceProvider(serviceProvider); + contentDialogService.SetDialogHost(RootContentDialog); } public MainWindowViewModel ViewModel { get; } @@ -47,10 +45,12 @@ private void OnNavigationSelectionChanged(object sender, RoutedEventArgs e) return; } - NavigationView.HeaderVisibility = + NavigationView.SetCurrentValue( + NavigationView.HeaderVisibilityProperty, navigationView.SelectedItem?.TargetPageType != typeof(DashboardPage) ? Visibility.Visible - : Visibility.Collapsed; + : Visibility.Collapsed + ); } private void MainWindow_OnSizeChanged(object sender, SizeChangedEventArgs e) @@ -61,7 +61,7 @@ private void MainWindow_OnSizeChanged(object sender, SizeChangedEventArgs e) } _isPaneOpenedOrClosedFromCode = true; - NavigationView.IsPaneOpen = !(e.NewSize.Width <= 1200); + NavigationView.SetCurrentValue(NavigationView.IsPaneOpenProperty, e.NewSize.Width > 1200); _isPaneOpenedOrClosedFromCode = false; } diff --git a/src/Wpf.Ui.Gallery/Views/Windows/SandboxWindow.xaml.cs b/src/Wpf.Ui.Gallery/Views/Windows/SandboxWindow.xaml.cs index 9200ac630..1046f73bb 100644 --- a/src/Wpf.Ui.Gallery/Views/Windows/SandboxWindow.xaml.cs +++ b/src/Wpf.Ui.Gallery/Views/Windows/SandboxWindow.xaml.cs @@ -22,16 +22,19 @@ public SandboxWindow(SandboxWindowViewModel viewModel) MyTestNavigationView.Loaded += (sender, args) => { - MyTestNavigationView.MenuItemsSource = new ObservableCollection() - { - new NavigationViewItem("Home", SymbolRegular.Home24, typeof(SamplePage1)) - }; + MyTestNavigationView.SetCurrentValue( + NavigationView.MenuItemsSourceProperty, + new ObservableCollection() + { + new NavigationViewItem("Home", SymbolRegular.Home24, typeof(SamplePage1)) + } + ); var configurationBasedLogic = true; if (configurationBasedLogic) { - MyTestNavigationView.MenuItems.Add( + _ = MyTestNavigationView.MenuItems.Add( new NavigationViewItem("Test", SymbolRegular.Home24, typeof(SamplePage2)) ); } diff --git a/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj b/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj index 24c428ff6..68ecff1ff 100644 --- a/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj +++ b/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj @@ -1,17 +1,16 @@ + Wpf.Ui.Gallery WinExe - net8.0-windows10.0.22621.0 - enable - enable + net9.0-windows10.0.22621.0 + 10.0.18362.0 true + true wpfui.ico app.manifest - Wpf.Ui.Gallery - AnyCPU;x64;x86 - 10.0.18362.0 $(NoWarn);SA1601 + True @@ -19,24 +18,18 @@ + + + + - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + @@ -74,4 +67,30 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + ResXFileCodeGenerator + Translations.pl-PL.Designer.cs + + + + + + True + True + Translations.pl-PL.resx + + + diff --git a/src/Wpf.Ui.Gallery/app.manifest b/src/Wpf.Ui.Gallery/app.manifest index 6bde500ce..82b7dfb2b 100644 --- a/src/Wpf.Ui.Gallery/app.manifest +++ b/src/Wpf.Ui.Gallery/app.manifest @@ -1,6 +1,6 @@ - + - + diff --git a/src/Wpf.Ui.SyntaxHighlight/Controls/CodeBlock.cs b/src/Wpf.Ui.SyntaxHighlight/Controls/CodeBlock.cs index 356091c82..924712579 100644 --- a/src/Wpf.Ui.SyntaxHighlight/Controls/CodeBlock.cs +++ b/src/Wpf.Ui.SyntaxHighlight/Controls/CodeBlock.cs @@ -16,11 +16,9 @@ namespace Wpf.Ui.SyntaxHighlight.Controls; /// /// Formats and display a fragment of the source code. /// -//[ToolboxItem(true)] -//[ToolboxBitmap(typeof(CodeBlock), "CodeBlock.bmp")] public class CodeBlock : System.Windows.Controls.ContentControl { - private string _sourceCode = String.Empty; + private string _sourceCode = string.Empty; /// /// Property for . diff --git a/src/Wpf.Ui.SyntaxHighlight/Highlighter.cs b/src/Wpf.Ui.SyntaxHighlight/Highlighter.cs index 498d5d709..73d4391be 100644 --- a/src/Wpf.Ui.SyntaxHighlight/Highlighter.cs +++ b/src/Wpf.Ui.SyntaxHighlight/Highlighter.cs @@ -3,6 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +// TODO: This class is work in progress. + using System; using System.Linq; using System.Text.RegularExpressions; @@ -12,8 +14,6 @@ namespace Wpf.Ui.SyntaxHighlight; -// TODO: This class is work in progress. - /// /// Formats a string of code into control. /// Implementation and regex patterns inspired by . @@ -38,17 +38,17 @@ internal static class Highlighter private const string EntityPattern = /* language=regex */ @"(&[a-zA-Z0-9#]+;)"; - private const string PunctuationPattern = /* language=regex */ - @"(!==?|(?:[[\\] ()\{\}.:;,+\\-?=!]|<|>)+|&&|\\|\\|)"; + //private const string PunctuationPattern = /* language=regex */ + // @"(!==?|(?:[[\\] ()\{\}.:;,+\\-?=!]|<|>)+|&&|\\|\\|)"; - private const string NumberPattern = /* language=regex */ - @"(-? (?:\.\d+|\d+(?:\.\d+)?))"; + //private const string NumberPattern = /* language=regex */ + // @"(-? (?:\.\d+|\d+(?:\.\d+)?))"; - private const string BooleanPattern = /* language=regex */ - "\b(true|false)\b"; + //private const string BooleanPattern = /* language=regex */ + // "\b(true|false)\b"; - private const string AttributePattern = /* language=regex */ - "(\\s*)([a-zA-Z\\d\\-:]+)=(\" | ')(.*?)\\3"; + //private const string AttributePattern = /* language=regex */ + // "(\\s*)([a-zA-Z\\d\\-:]+)=(\" | ')(.*?)\\3"; public static Paragraph FormatAsParagraph( string code, @@ -60,22 +60,26 @@ public static Paragraph FormatAsParagraph( bool lightTheme = IsLightTheme(); - foreach (Match match in rgx.Matches(code)) + foreach (Match match in rgx.Matches(code).Cast()) { foreach (object group in match.Groups) { // Remove whole matches if (group is Match) + { continue; + } // Cast to group Group codeMatched = (Group)group; // Remove empty groups - if (String.IsNullOrEmpty(codeMatched.Value)) + if (string.IsNullOrEmpty(codeMatched.Value)) + { continue; + } - if (codeMatched.Value.Contains("\t")) + if (codeMatched.Value.Contains('\t')) { paragraph.Inlines.Add(Line(" ", Brushes.Transparent)); } @@ -83,13 +87,13 @@ public static Paragraph FormatAsParagraph( { paragraph.Inlines.Add(Line(codeMatched.Value, Brushes.Orange)); } - else if (codeMatched.Value.Contains("<") || codeMatched.Value.Contains(">")) + else if (codeMatched.Value.Contains('<') || codeMatched.Value.Contains('>')) { paragraph.Inlines.Add( Line(codeMatched.Value, lightTheme ? Brushes.DarkCyan : Brushes.CornflowerBlue) ); } - else if (codeMatched.Value.Contains("\"")) + else if (codeMatched.Value.Contains('"')) { string[] attributeArray = codeMatched.Value.Split('"'); attributeArray = attributeArray.Where(x => !string.IsNullOrEmpty(x.Trim())).ToArray(); @@ -120,7 +124,7 @@ public static Paragraph FormatAsParagraph( ); } } - else if (codeMatched.Value.Contains("'")) + else if (codeMatched.Value.Contains('\'')) { string[] attributeArray = codeMatched.Value.Split('\''); attributeArray = attributeArray.Where(x => !string.IsNullOrEmpty(x.Trim())).ToArray(); @@ -186,18 +190,27 @@ private static bool IsLightTheme() return Appearance.ApplicationThemeManager.GetAppTheme() == ApplicationTheme.Light; } + /* private static string GetPattern(SyntaxLanguage language) { - return GetPattern(language, String.Empty); + return GetPattern(language, string.Empty); } + */ + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Style", + "IDE0060:Remove unused parameter", + Justification = "WIP" + )] private static string GetPattern(SyntaxLanguage language, string code) { - var pattern = String.Empty; + var pattern = string.Empty; // TODO: Auto detected if (language == SyntaxLanguage.Autodetect) + { language = SyntaxLanguage.XAML; + } switch (language) { diff --git a/src/Wpf.Ui.SyntaxHighlight/Wpf.Ui.SyntaxHighlight.csproj b/src/Wpf.Ui.SyntaxHighlight/Wpf.Ui.SyntaxHighlight.csproj index 6280ccf76..0b7080a5f 100644 --- a/src/Wpf.Ui.SyntaxHighlight/Wpf.Ui.SyntaxHighlight.csproj +++ b/src/Wpf.Ui.SyntaxHighlight/Wpf.Ui.SyntaxHighlight.csproj @@ -1,25 +1,15 @@ - $(PackagesCommonFrameworks) - Library - Properties - Wpf.Ui.SyntaxHighlight - Wpf.Ui.SyntaxHighlight WPF-UI.SyntaxHighlight - Wpf.Ui.SyntaxHighlight - Wpf.Ui.SyntaxHighlight - en-US - enable + net462;net472;net481;net6.0-windows;net8.0-windows;net9.0-windows + Native tast notification support for WPF using the WPF UI library. + $(CommonTags);syntax;highlight true - true - true + true + true - - - - @@ -39,4 +29,23 @@ + + + + + + + all + build; analyzers + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/src/Wpf.Ui.Demo.Mvvm/Usings.cs b/src/Wpf.Ui.ToastNotifications/GlobalUsings.cs similarity index 76% rename from src/Wpf.Ui.Demo.Mvvm/Usings.cs rename to src/Wpf.Ui.ToastNotifications/GlobalUsings.cs index 47e40908a..b9c34f23d 100644 --- a/src/Wpf.Ui.Demo.Mvvm/Usings.cs +++ b/src/Wpf.Ui.ToastNotifications/GlobalUsings.cs @@ -3,6 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +global using System; +global using System.Runtime.InteropServices; global using System.Windows; -global using CommunityToolkit.Mvvm.ComponentModel; -global using CommunityToolkit.Mvvm.Input; diff --git a/src/Wpf.Ui.ToastNotifications/Properties/AssemblyInfo.cs b/src/Wpf.Ui.ToastNotifications/Properties/AssemblyInfo.cs index 876def21c..1736da5b8 100644 --- a/src/Wpf.Ui.ToastNotifications/Properties/AssemblyInfo.cs +++ b/src/Wpf.Ui.ToastNotifications/Properties/AssemblyInfo.cs @@ -3,8 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Runtime.InteropServices; -using System.Windows; using System.Windows.Markup; [assembly: ComVisible(false)] diff --git a/src/Wpf.Ui.ToastNotifications/Toast.cs b/src/Wpf.Ui.ToastNotifications/Toast.cs index c90fc816c..cc91e3981 100644 --- a/src/Wpf.Ui.ToastNotifications/Toast.cs +++ b/src/Wpf.Ui.ToastNotifications/Toast.cs @@ -3,8 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; - namespace Wpf.Ui.ToastNotifications; /// diff --git a/src/Wpf.Ui.ToastNotifications/Wpf.Ui.ToastNotifications.csproj b/src/Wpf.Ui.ToastNotifications/Wpf.Ui.ToastNotifications.csproj index b6a4fe510..0d5648e1b 100644 --- a/src/Wpf.Ui.ToastNotifications/Wpf.Ui.ToastNotifications.csproj +++ b/src/Wpf.Ui.ToastNotifications/Wpf.Ui.ToastNotifications.csproj @@ -1,74 +1,36 @@ - $(PackagesCommonFrameworks) - Library - Properties - Wpf.Ui.ToastNotifications - Wpf.Ui.ToastNotifications WPF-UI.ToastNotifications - Wpf.Ui.ToastNotifications - Wpf.Ui.ToastNotifications - en-US - enable - true - true - true - true + net462;net472;net481;net6.0-windows;net8.0-windows;net9.0-windows Native tast notification support for WPF using the WPF UI library. - wpf tray notify notifications icons icon notifyicon menu ui wpfui fluent design winui windows controls - - - - true - true - wpfui.png + $(CommonTags);toast;notifications + true + true + true - - - True - - - - - - true - - - - - - - - true - snupkg - true - true - false - - all - runtime; build; native; contentfiles; analyzers; buildtransitive + build; analyzers - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - \ No newline at end of file + diff --git a/src/Wpf.Ui.Tray/Controls/NotifyIcon.cs b/src/Wpf.Ui.Tray/Controls/NotifyIcon.cs index 0c187ef16..e99643035 100644 --- a/src/Wpf.Ui.Tray/Controls/NotifyIcon.cs +++ b/src/Wpf.Ui.Tray/Controls/NotifyIcon.cs @@ -3,10 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; using System.Windows; using System.Windows.Controls; -using System.Windows.Interop; using System.Windows.Media; namespace Wpf.Ui.Tray.Controls; @@ -28,50 +26,35 @@ namespace Wpf.Ui.Tray.Controls; /// </tray:NotifyIcon> /// /// -//[ToolboxItem(true)] -//[ToolboxBitmap(typeof(NotifyIcon), "NotifyIcon.bmp")] -public class NotifyIcon : System.Windows.FrameworkElement +public class NotifyIcon : System.Windows.FrameworkElement, IDisposable { private readonly Wpf.Ui.Tray.Internal.InternalNotifyIconManager internalNotifyIconManager; /// - /// Whether the control is disposed. + /// Gets or sets a value indicating whether the control is disposed. /// - protected bool Disposed = false; + protected bool Disposed { get; set; } = false; - #region Public variables - - /// - public int Id => this.internalNotifyIconManager.Id; + public int Id => internalNotifyIconManager.Id; /// - /// Whether the icon is registered in the tray menu. + /// Gets a value indicating whether the icon is registered in the tray menu. /// - public bool IsRegistered => this.internalNotifyIconManager.IsRegistered; + public bool IsRegistered => internalNotifyIconManager.IsRegistered; - /// public HwndSource? HookWindow { get; set; } - /// public IntPtr ParentHandle { get; set; } - #endregion - - #region Properties - - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty TooltipTextProperty = DependencyProperty.Register( nameof(TooltipText), typeof(string), typeof(NotifyIcon), - new PropertyMetadata(String.Empty, OnTooltipTextChanged) + new PropertyMetadata(string.Empty, OnTooltipTextChanged) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty FocusOnLeftClickProperty = DependencyProperty.Register( nameof(FocusOnLeftClick), typeof(bool), @@ -79,9 +62,7 @@ public class NotifyIcon : System.Windows.FrameworkElement new PropertyMetadata(true, OnFocusOnLeftClickChanged) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty MenuOnRightClickProperty = DependencyProperty.Register( nameof(MenuOnRightClick), typeof(bool), @@ -89,9 +70,7 @@ public class NotifyIcon : System.Windows.FrameworkElement new PropertyMetadata(true, OnMenuOnRightClickChanged) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty IconProperty = DependencyProperty.Register( nameof(Icon), typeof(ImageSource), @@ -99,9 +78,7 @@ public class NotifyIcon : System.Windows.FrameworkElement new PropertyMetadata((ImageSource)null!, OnIconChanged) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty MenuProperty = DependencyProperty.Register( nameof(Menu), typeof(ContextMenu), @@ -109,9 +86,7 @@ public class NotifyIcon : System.Windows.FrameworkElement new PropertyMetadata(null, OnMenuChanged) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty MenuFontSizeProperty = DependencyProperty.Register( nameof(MenuFontSize), typeof(double), @@ -119,7 +94,6 @@ public class NotifyIcon : System.Windows.FrameworkElement new PropertyMetadata(14d) ); - /// public string TooltipText { get => (string)GetValue(TooltipTextProperty); @@ -127,7 +101,7 @@ public string TooltipText } /// - /// Gets or sets the value indicating whether to show the on single right click. + /// Gets or sets a value indicating whether to show the on single right click. /// public bool MenuOnRightClick { @@ -136,7 +110,7 @@ public bool MenuOnRightClick } /// - /// Gets or sets the value indicating whether to focus the on single left click. + /// Gets or sets a value indicating whether to focus the on single left click. /// public bool FocusOnLeftClick { @@ -144,7 +118,6 @@ public bool FocusOnLeftClick set => SetValue(FocusOnLeftClickProperty, value); } - /// public ImageSource Icon { get => (ImageSource)GetValue(IconProperty); @@ -152,11 +125,11 @@ public ImageSource Icon } /// - /// Context menu. + /// Gets or sets the context menu. /// - public ContextMenu Menu + public ContextMenu? Menu { - get => (ContextMenu)GetValue(MenuProperty); + get => (ContextMenu?)GetValue(MenuProperty); set => SetValue(MenuProperty, value); } @@ -166,13 +139,7 @@ public double MenuFontSize set => SetValue(MenuFontSizeProperty, value); } - #endregion - - #region Events - - /// - /// Registration for . - /// + /// Identifies the routed event. public static readonly RoutedEvent LeftClickEvent = EventManager.RegisterRoutedEvent( nameof(LeftClick), RoutingStrategy.Bubble, @@ -180,9 +147,7 @@ public double MenuFontSize typeof(NotifyIcon) ); - /// - /// Registration for . - /// + /// Identifies the routed event. public static readonly RoutedEvent LeftDoubleClickEvent = EventManager.RegisterRoutedEvent( nameof(LeftDoubleClick), RoutingStrategy.Bubble, @@ -190,9 +155,7 @@ public double MenuFontSize typeof(NotifyIcon) ); - /// - /// Registration for . - /// + /// Identifies the routed event. public static readonly RoutedEvent RightClickEvent = EventManager.RegisterRoutedEvent( nameof(RightClick), RoutingStrategy.Bubble, @@ -200,9 +163,7 @@ public double MenuFontSize typeof(NotifyIcon) ); - /// - /// Registration for . - /// + /// Identifies the routed event. public static readonly RoutedEvent RightDoubleClickEvent = EventManager.RegisterRoutedEvent( nameof(RightDoubleClick), RoutingStrategy.Bubble, @@ -210,9 +171,7 @@ public double MenuFontSize typeof(NotifyIcon) ); - /// - /// Registration for . - /// + /// Identifies the routed event. public static readonly RoutedEvent MiddleClickEvent = EventManager.RegisterRoutedEvent( nameof(MiddleClick), RoutingStrategy.Bubble, @@ -220,9 +179,7 @@ public double MenuFontSize typeof(NotifyIcon) ); - /// - /// Registration for . - /// + /// Identifies the routed event. public static readonly RoutedEvent MiddleDoubleClickEvent = EventManager.RegisterRoutedEvent( nameof(MiddleDoubleClick), RoutingStrategy.Bubble, @@ -284,33 +241,28 @@ public event RoutedNotifyIconEvent MiddleDoubleClick remove => RemoveHandler(MiddleDoubleClickEvent, value); } - #endregion - - #region General methods - public NotifyIcon() { - this.internalNotifyIconManager = new Wpf.Ui.Tray.Internal.InternalNotifyIconManager(); + internalNotifyIconManager = new Wpf.Ui.Tray.Internal.InternalNotifyIconManager(); RegisterHandlers(); } /// - /// Control finalizer. + /// Finalizes an instance of the class. /// ~NotifyIcon() => Dispose(false); /// /// Tries to register the in the shell. /// - public void Register() => this.internalNotifyIconManager.Register(); + public void Register() => internalNotifyIconManager.Register(); /// /// Tries to unregister the from the shell. /// - public void Unregister() => this.internalNotifyIconManager.Unregister(); + public void Unregister() => internalNotifyIconManager.Unregister(); - /// public void Dispose() { Dispose(true); @@ -318,17 +270,15 @@ public void Dispose() GC.SuppressFinalize(this); } - #endregion - - #region Protected methods - /// protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); - if (this.internalNotifyIconManager.IsRegistered) + if (internalNotifyIconManager.IsRegistered) + { return; + } InitializeIcon(); @@ -400,32 +350,32 @@ protected virtual void OnMiddleDoubleClick() protected virtual void Dispose(bool disposing) { if (Disposed) + { return; + } Disposed = true; if (!disposing) + { return; + } -#if DEBUG System.Diagnostics.Debug.WriteLine($"INFO | {typeof(NotifyIcon)} disposed.", "Wpf.Ui.NotifyIcon"); -#endif Unregister(); - this.internalNotifyIconManager.Dispose(); + internalNotifyIconManager.Dispose(); } - #endregion - /// /// This virtual method is called when of is changed. /// /// New context menu object. protected virtual void OnMenuChanged(ContextMenu contextMenu) { - this.internalNotifyIconManager.ContextMenu = contextMenu; - this.internalNotifyIconManager.ContextMenu.FontSize = MenuFontSize; + internalNotifyIconManager.ContextMenu = contextMenu; + internalNotifyIconManager.ContextMenu.SetCurrentValue(Control.FontSizeProperty, MenuFontSize); } private static void OnTooltipTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) @@ -435,7 +385,9 @@ private static void OnTooltipTextChanged(DependencyObject d, DependencyPropertyC return; } - notifyIcon.TooltipText = e.NewValue as string ?? String.Empty; + notifyIcon.TooltipText = e.NewValue as string ?? string.Empty; + notifyIcon.internalNotifyIconManager.TooltipText = notifyIcon.TooltipText; + _ = notifyIcon.internalNotifyIconManager.ModifyToolTip(); } private static void OnIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) @@ -446,13 +398,15 @@ private static void OnIconChanged(DependencyObject d, DependencyPropertyChangedE } notifyIcon.internalNotifyIconManager.Icon = e.NewValue as ImageSource; - notifyIcon.internalNotifyIconManager.ModifyIcon(); + _ = notifyIcon.internalNotifyIconManager.ModifyIcon(); } private static void OnFocusOnLeftClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not NotifyIcon notifyIcon) + { return; + } if (e.NewValue is not bool newValue) { @@ -467,7 +421,9 @@ private static void OnFocusOnLeftClickChanged(DependencyObject d, DependencyProp private static void OnMenuOnRightClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not NotifyIcon notifyIcon) + { return; + } if (e.NewValue is not bool newValue) { @@ -482,29 +438,33 @@ private static void OnMenuOnRightClickChanged(DependencyObject d, DependencyProp private static void OnMenuChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not NotifyIcon notifyIcon) + { return; + } if (e.NewValue is not ContextMenu contextMenu) + { return; + } notifyIcon.OnMenuChanged(contextMenu); } private void InitializeIcon() { - this.internalNotifyIconManager.TooltipText = TooltipText; - this.internalNotifyIconManager.Icon = Icon; - this.internalNotifyIconManager.MenuOnRightClick = MenuOnRightClick; - this.internalNotifyIconManager.FocusOnLeftClick = FocusOnLeftClick; + internalNotifyIconManager.TooltipText = TooltipText; + internalNotifyIconManager.Icon = Icon; + internalNotifyIconManager.MenuOnRightClick = MenuOnRightClick; + internalNotifyIconManager.FocusOnLeftClick = FocusOnLeftClick; } private void RegisterHandlers() { - this.internalNotifyIconManager.LeftClick += OnLeftClick; - this.internalNotifyIconManager.LeftDoubleClick += OnLeftDoubleClick; - this.internalNotifyIconManager.RightClick += OnRightClick; - this.internalNotifyIconManager.RightDoubleClick += OnRightDoubleClick; - this.internalNotifyIconManager.MiddleClick += OnMiddleClick; - this.internalNotifyIconManager.MiddleDoubleClick += OnMiddleDoubleClick; + internalNotifyIconManager.LeftClick += OnLeftClick; + internalNotifyIconManager.LeftDoubleClick += OnLeftDoubleClick; + internalNotifyIconManager.RightClick += OnRightClick; + internalNotifyIconManager.RightDoubleClick += OnRightDoubleClick; + internalNotifyIconManager.MiddleClick += OnMiddleClick; + internalNotifyIconManager.MiddleDoubleClick += OnMiddleDoubleClick; } } diff --git a/src/Wpf.Ui.Tray/GlobalUsings.cs b/src/Wpf.Ui.Tray/GlobalUsings.cs new file mode 100644 index 000000000..e3ba42fb6 --- /dev/null +++ b/src/Wpf.Ui.Tray/GlobalUsings.cs @@ -0,0 +1,12 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +global using System; +global using System.Collections.Generic; +global using System.ComponentModel; +global using System.Diagnostics; +global using System.Diagnostics.CodeAnalysis; +global using System.Runtime.InteropServices; +global using System.Windows.Interop; diff --git a/src/Wpf.Ui.Tray/Hicon.cs b/src/Wpf.Ui.Tray/Hicon.cs index c676177f0..16ec08f89 100644 --- a/src/Wpf.Ui.Tray/Hicon.cs +++ b/src/Wpf.Ui.Tray/Hicon.cs @@ -3,17 +3,15 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; -using System.Diagnostics; +// TODO: This class is the only reason for using System.Drawing.Common. +// It is worth looking for a way to get hIcon without using it. + using System.Drawing; -using System.Runtime.InteropServices; using System.Windows.Media; using System.Windows.Media.Imaging; namespace Wpf.Ui.Tray; -// TODO: This class is the only reason for using System.Drawing.Common. It is worth looking for a way to get hIcon without using it. - /// /// Facilitates the creation of a hIcon. /// @@ -22,14 +20,13 @@ internal static class Hicon /// /// Tries to take the icon pointer assigned to the application. /// - /// public static IntPtr FromApp() { try { var processName = Process.GetCurrentProcess().MainModule?.FileName; - if (String.IsNullOrEmpty(processName)) + if (string.IsNullOrEmpty(processName)) { return IntPtr.Zero; } @@ -41,17 +38,17 @@ public static IntPtr FromApp() return IntPtr.Zero; } - //appIconsExtractIcon.ToBitmap(); + /*appIconsExtractIcon.ToBitmap();*/ return appIconsExtractIcon.Handle; } catch (Exception e) { -#if DEBUG System.Diagnostics.Debug.WriteLine( $"ERROR | Unable to get application hIcon - {e}", "Wpf.Ui.Hicon" ); +#if DEBUG throw; #else return IntPtr.Zero; @@ -65,19 +62,16 @@ public static IntPtr FromApp() /// Image source. public static IntPtr FromSource(ImageSource source) { - var hIcon = IntPtr.Zero; - var bitmapSource = source as BitmapSource; + IntPtr hIcon = IntPtr.Zero; var bitmapFrame = source as BitmapFrame; - if (bitmapSource == null) + if (source is not BitmapSource bitmapSource) { -#if DEBUG System.Diagnostics.Debug.WriteLine( $"ERROR | Unable to allocate hIcon, ImageSource is not a BitmapSource", "Wpf.Ui.Hicon" ); -#endif - return IntPtr.Zero; + return hIcon; } if ((bitmapFrame?.Decoder?.Frames?.Count ?? 0) > 1) @@ -96,14 +90,11 @@ public static IntPtr FromSource(ImageSource source) if (!gcHandle.IsAllocated) { -#if DEBUG System.Diagnostics.Debug.WriteLine( $"ERROR | Unable to allocate hIcon, allocation failed.", "Wpf.Ui.Hicon" ); -#endif - - return IntPtr.Zero; + return hIcon; } // Specifies that the format is 32 bits per pixel; 8 bits each are used for the alpha, red, green, and blue components. diff --git a/src/Wpf.Ui.Tray/INotifyIcon.cs b/src/Wpf.Ui.Tray/INotifyIcon.cs index d822713b6..a5cc138c9 100644 --- a/src/Wpf.Ui.Tray/INotifyIcon.cs +++ b/src/Wpf.Ui.Tray/INotifyIcon.cs @@ -3,10 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; using System.Windows; using System.Windows.Controls; -using System.Windows.Interop; using System.Windows.Media; namespace Wpf.Ui.Tray; @@ -17,17 +15,17 @@ namespace Wpf.Ui.Tray; internal interface INotifyIcon { /// - /// Notify icon shell data. + /// Gets or sets the notify icon shell data. /// public Interop.Shell32.NOTIFYICONDATA ShellIconData { get; set; } /// - /// Whether the icon is currently registered in the tray area. + /// Gets or sets a value indicating whether the icon is currently registered in the tray area. /// bool IsRegistered { get; set; } /// - /// Gets the Shell identifier of the icon. + /// Gets or sets the Shell identifier of the icon. /// int Id { get; set; } @@ -49,15 +47,15 @@ internal interface INotifyIcon /// /// Gets or sets the menu displayed when the icon is right-clicked. /// - ContextMenu ContextMenu { get; set; } + ContextMenu? ContextMenu { get; set; } /// - /// Gets or sets the value indicating whether to focus the on single left click. + /// Gets or sets a value indicating whether to focus the on single left click. /// bool FocusOnLeftClick { get; set; } /// - /// Gets or sets the value indicating whether to show the on single right click. + /// Gets or sets a value indicating whether to show the on single right click. /// bool MenuOnRightClick { get; set; } @@ -82,6 +80,11 @@ internal interface INotifyIcon /// bool ModifyIcon(); + /// + /// Tries to modify the tooltip of the in the shell. + /// + bool ModifyToolTip(); + /// /// Tries to remove the from the shell. /// diff --git a/src/Wpf.Ui.Tray/INotifyIconService.cs b/src/Wpf.Ui.Tray/INotifyIconService.cs index 66a13e964..27cab614a 100644 --- a/src/Wpf.Ui.Tray/INotifyIconService.cs +++ b/src/Wpf.Ui.Tray/INotifyIconService.cs @@ -15,12 +15,12 @@ namespace Wpf.Ui.Tray; public interface INotifyIconService { /// - /// Whether the notify icon is registered in the tray. + /// Gets the notify icon id. /// public int Id { get; } /// - /// Whether the notify icon is registered in the tray. + /// Gets a value indicating whether the notify icon is registered in the tray. /// public bool IsRegistered { get; } @@ -30,14 +30,14 @@ public interface INotifyIconService public string TooltipText { get; set; } /// - /// Context menu displayed after clicking the icon. + /// Gets or sets the context menu displayed after clicking the icon. /// - ContextMenu ContextMenu { get; set; } + ContextMenu? ContextMenu { get; set; } /// /// Gets or sets the of the tray icon. /// - public ImageSource Icon { get; set; } + public ImageSource? Icon { get; set; } /// /// Tries to register the Notify Icon in the shell. diff --git a/src/Wpf.Ui.Tray/Internal/InternalNotifyIconManager.cs b/src/Wpf.Ui.Tray/Internal/InternalNotifyIconManager.cs index 8e00c0c2a..213b4f9a6 100644 --- a/src/Wpf.Ui.Tray/Internal/InternalNotifyIconManager.cs +++ b/src/Wpf.Ui.Tray/Internal/InternalNotifyIconManager.cs @@ -3,11 +3,9 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; -using System.Windows.Interop; using System.Windows.Media; using Wpf.Ui.Appearance; @@ -30,7 +28,7 @@ internal class InternalNotifyIconManager : IDisposable, INotifyIcon public bool IsRegistered { get; set; } /// - public string TooltipText { get; set; } = String.Empty; + public string TooltipText { get; set; } = string.Empty; /// public ImageSource? Icon { get; set; } = default!; @@ -104,6 +102,12 @@ public virtual bool ModifyIcon() return TrayManager.ModifyIcon(this); } + /// + public virtual bool ModifyToolTip() + { + return TrayManager.ModifyToolTip(this); + } + /// public virtual bool Unregister() { @@ -124,13 +128,12 @@ protected virtual void OnThemeChanged(ApplicationTheme currentApplicationTheme, /// protected virtual void FocusApp() { -#if DEBUG - System.Diagnostics.Debug.WriteLine( + Debug.WriteLine( $"INFO | {typeof(TrayHandler)} invoked {nameof(FocusApp)} method.", "Wpf.Ui.NotifyIcon" ); -#endif - Window mainWindow = Application.Current.MainWindow; + + Window? mainWindow = Application.Current.MainWindow; if (mainWindow == null) { @@ -155,7 +158,7 @@ protected virtual void FocusApp() mainWindow.Topmost = false; } - mainWindow.Focus(); + _ = mainWindow.Focus(); } /// @@ -163,12 +166,11 @@ protected virtual void FocusApp() /// protected virtual void OpenMenu() { -#if DEBUG - System.Diagnostics.Debug.WriteLine( + Debug.WriteLine( $"INFO | {typeof(TrayHandler)} invoked {nameof(OpenMenu)} method.", "Wpf.Ui.NotifyIcon" ); -#endif + if (ContextMenu is null) { return; @@ -252,12 +254,10 @@ protected virtual void Dispose(bool disposing) return; } -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {typeof(NotifyIconService)} disposed.", "Wpf.Ui.NotifyIcon" ); -#endif Unregister(); } @@ -270,12 +270,10 @@ public IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bo switch (uMsg) { case Interop.User32.WM.DESTROY: -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {typeof(TrayHandler)} received {uMsg} message.", "Wpf.Ui.NotifyIcon" ); -#endif Dispose(); handled = true; @@ -283,23 +281,19 @@ public IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bo return IntPtr.Zero; case Interop.User32.WM.NCDESTROY: -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {typeof(TrayHandler)} received {uMsg} message.", "Wpf.Ui.NotifyIcon" ); -#endif handled = false; return IntPtr.Zero; case Interop.User32.WM.CLOSE: -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {typeof(TrayHandler)} received {uMsg} message.", "Wpf.Ui.NotifyIcon" ); -#endif handled = true; return IntPtr.Zero; diff --git a/src/Wpf.Ui.Tray/Interop/Shell32.cs b/src/Wpf.Ui.Tray/Interop/Shell32.cs index ebcd71a7a..594e563e0 100644 --- a/src/Wpf.Ui.Tray/Interop/Shell32.cs +++ b/src/Wpf.Ui.Tray/Interop/Shell32.cs @@ -3,17 +3,18 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; -using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; namespace Wpf.Ui.Tray.Interop; +// ReSharper disable IdentifierTypo +// ReSharper disable InconsistentNaming +#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter +#pragma warning disable SA1401 // Fields should be private + /// /// The Windows UI provides users with access to a wide variety of objects necessary to run applications and manage the operating system. /// -// ReSharper disable IdentifierTypo -// ReSharper disable InconsistentNaming internal static class Shell32 { /// @@ -105,7 +106,7 @@ public class NOTIFYICONDATA /// 0x00000004. The szTip member is valid. /// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x80)] // 128 - public string szTip; + public string? szTip; /// /// The state of the icon. There are two flags that can be set independently. @@ -117,7 +118,7 @@ public class NOTIFYICONDATA public uint dwStateMask; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x100)] // 256 - public string szInfo; + public string? szInfo; /// /// Prior to Vista this was a union of uTimeout and uVersion. As of Vista, uTimeout has been deprecated. @@ -125,14 +126,14 @@ public class NOTIFYICONDATA public uint uVersion; // Used with Shell_NotifyIcon flag NIM_SETVERSION. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)] // 64 - public string szInfoTitle; + public string? szInfoTitle; public uint dwInfoFlags; public Guid guidItem; // Vista only - IntPtr hBalloonIcon; + public IntPtr hBalloonIcon; } [DllImport(Libraries.Shell32, PreserveSig = false)] @@ -158,7 +159,7 @@ public static extern int SHCreateItemFromParsingName( /// /// Sets the User Model AppID for the current process, enabling Windows to retrieve this ID /// - /// + /// The string ID to be assigned [DllImport(Libraries.Shell32, PreserveSig = false)] public static extern void SetCurrentProcessExplicitAppUserModelID( [MarshalAs(UnmanagedType.LPWStr)] string AppID @@ -167,9 +168,13 @@ public static extern void SetCurrentProcessExplicitAppUserModelID( /// /// Retrieves the User Model AppID that has been explicitly set for the current process via SetCurrentProcessExplicitAppUserModelID /// - /// + /// Out parameter that receives the string ID. + /// An HRESULT indicating success (S_OK) or failure of the operation. If the function fails, the returned AppID is null. [DllImport(Libraries.Shell32)] public static extern int GetCurrentProcessExplicitAppUserModelID( [Out, MarshalAs(UnmanagedType.LPWStr)] out string AppID ); } + +#pragma warning restore SA1307 // Accessible fields should begin with upper-case letter +#pragma warning restore SA1401 // Fields should be private diff --git a/src/Wpf.Ui.Tray/Interop/User32.cs b/src/Wpf.Ui.Tray/Interop/User32.cs index 86397e655..1a1482e79 100644 --- a/src/Wpf.Ui.Tray/Interop/User32.cs +++ b/src/Wpf.Ui.Tray/Interop/User32.cs @@ -3,21 +3,18 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; using System.Windows; namespace Wpf.Ui.Tray.Interop; -/// -/// USER procedure declarations, constant definitions and macros. -/// // ReSharper disable IdentifierTypo // ReSharper disable InconsistentNaming #pragma warning disable SA1300 // Element should begin with upper-case letter #pragma warning disable SA1307 // Accessible fields should begin with upper-case letter -#pragma warning disable SA1401 // Fields should be private + +/// +/// USER procedure declarations, constant definitions and macros. +/// internal static class User32 { /// @@ -29,14 +26,14 @@ public enum SWP ASYNCWINDOWPOS = 0x4000, DEFERERASE = 0x2000, DRAWFRAME = 0x0020, - FRAMECHANGED = 0x0020, + FRAMECHANGED = DRAWFRAME, HIDEWINDOW = 0x0080, NOACTIVATE = 0x0010, NOCOPYBITS = 0x0100, NOMOVE = 0x0002, NOOWNERZORDER = 0x0200, NOREDRAW = 0x0008, - NOREPOSITION = 0x0200, + NOREPOSITION = NOOWNERZORDER, NOSENDCHANGING = 0x0400, NOSIZE = 0x0001, NOZORDER = 0x0004, @@ -54,7 +51,7 @@ public enum MF : uint /// DOES_NOT_EXIST = unchecked((uint)-1), ENABLED = 0, - BYCOMMAND = 0, + BYCOMMAND = ENABLED, GRAYED = 1, DISABLED = 2, } @@ -430,7 +427,7 @@ public enum WM SHOWWINDOW = 0x0018, CTLCOLOR = 0x0019, WININICHANGE = 0x001A, - SETTINGCHANGE = 0x001A, + SETTINGCHANGE = WININICHANGE, ACTIVATEAPP = 0x001C, SETCURSOR = 0x0020, MOUSEACTIVATE = 0x0021, @@ -511,7 +508,7 @@ public enum WM TABLET_DEFBASE = 0x02C0, - //WM_TABLET_MAXOFFSET = 0x20, + /*WM_TABLET_MAXOFFSET = 0x20,*/ TABLET_ADDED = TABLET_DEFBASE + 8, TABLET_DELETED = TABLET_DEFBASE + 9, @@ -549,20 +546,17 @@ public enum WM GETTITLEBARINFOEX = 0x033F, - #region Windows 7 - + // Windows 7 DWMSENDICONICTHUMBNAIL = 0x0323, DWMSENDICONICLIVEPREVIEWBITMAP = 0x0326, - #endregion - USER = 0x0400, /// /// This is the hard-coded message value used by WinForms for Shell_NotifyIcon. /// It's relatively safe to reuse. /// - TRAYMOUSEMESSAGE = 0x800, //WM_USER + 1024 + TRAYMOUSEMESSAGE = 0x800, // WM_USER + 1024 APP = 0x8000, } @@ -590,16 +584,16 @@ public enum WS : long GROUP = 0x00020000, TABSTOP = 0x00010000, - MINIMIZEBOX = 0x00020000, - MAXIMIZEBOX = 0x00010000, + MINIMIZEBOX = GROUP, + MAXIMIZEBOX = TABSTOP, CAPTION = BORDER | DLGFRAME, TILED = OVERLAPPED, ICONIC = MINIMIZE, SIZEBOX = THICKFRAME, + OVERLAPPEDWINDOW = OVERLAPPED | CAPTION | SYSMENU | THICKFRAME | MINIMIZEBOX | MAXIMIZEBOX, TILEDWINDOW = OVERLAPPEDWINDOW, - OVERLAPPEDWINDOW = OVERLAPPED | CAPTION | SYSMENU | THICKFRAME | MINIMIZEBOX | MAXIMIZEBOX, POPUPWINDOW = POPUP | BORDER | SYSMENU, CHILDWINDOW = CHILD, } @@ -622,11 +616,11 @@ public enum WS_EX : long CLIENTEDGE = 0x00000200, CONTEXTHELP = 0x00000400, RIGHT = 0x00001000, - LEFT = 0x00000000, + LEFT = NONE, RTLREADING = 0x00002000, - LTRREADING = 0x00000000, + LTRREADING = NONE, LEFTSCROLLBAR = 0x00004000, - RIGHTSCROLLBAR = 0x00000000, + RIGHTSCROLLBAR = NONE, CONTROLPARENT = 0x00010000, STATICEDGE = 0x00020000, APPWINDOW = 0x00040000, @@ -738,10 +732,10 @@ public enum SW { HIDE = 0, SHOWNORMAL = 1, - NORMAL = 1, + NORMAL = SHOWNORMAL, SHOWMINIMIZED = 2, SHOWMAXIMIZED = 3, - MAXIMIZE = 3, + MAXIMIZE = SHOWMAXIMIZED, SHOWNOACTIVATE = 4, SHOW = 5, MINIMIZE = 6, @@ -899,7 +893,7 @@ public static extern bool ChangeWindowMessageFilterEx( /// A handle to the window whose window procedure is to receive the message. /// The message to be posted. /// Additional message-specific information. - /// Additional message-specific information. + /// Additional message-specific information.~ /// If the function succeeds, the return value is nonzero. [DllImport(Libraries.User32, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] @@ -917,7 +911,7 @@ [In] IntPtr lParam /// A handle to the window whose window procedure is to receive the message. /// The message to be posted. /// Additional message-specific information. - /// Additional message-specific information. + /// Additional message-specific information.~ /// If the function succeeds, the return value is nonzero. [DllImport(Libraries.User32, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] @@ -934,7 +928,7 @@ [In] IntPtr lParam /// A handle to the window whose window procedure is to receive the message. /// The message to be posted. /// Additional message-specific information. - /// Additional message-specific information. + /// Additional message-specific information.~ /// If the function succeeds, the return value is nonzero. [DllImport(Libraries.User32, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] @@ -951,7 +945,7 @@ [In] IntPtr lParam /// A handle to the window whose window procedure will receive the message. /// The message to be sent. /// Additional message-specific information. - /// Additional message-specific information. + /// Additional message-specific information.~ /// The return value specifies the result of the message processing; it depends on the message sent. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] public static extern int SendMessage( @@ -1028,7 +1022,7 @@ public static IntPtr CreateWindowEx( [In, Optional] IntPtr lpParam ) { - var ret = CreateWindowExW( + IntPtr ret = CreateWindowExW( dwExStyle, lpClassName, lpWindowName, @@ -1086,7 +1080,7 @@ public static IntPtr CreateWindowEx( /// A handle to the window procedure that received the message. /// The message. /// Additional message information. The content of this parameter depends on the value of the Msg parameter. - /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter.~ /// The return value is the result of the message processing and depends on the message. [DllImport(Libraries.User32, CharSet = CharSet.Unicode)] public static extern IntPtr DefWindowProcW( @@ -1104,7 +1098,7 @@ [In] IntPtr lParam /// A handle to the window procedure that received the message. /// The message. /// Additional message information. The content of this parameter depends on the value of the Msg parameter. - /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter.~ /// The return value is the result of the message processing and depends on the message. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] public static extern IntPtr DefWindowProcA( @@ -1121,7 +1115,7 @@ [In] IntPtr lParam /// A handle to the window procedure that received the message. /// The message. /// Additional message information. The content of this parameter depends on the value of the Msg parameter. - /// Additional message information. The content of this parameter depends on the value of the Msg parameter. + /// Additional message information. The content of this parameter depends on the value of the Msg parameter.~ /// The return value is the result of the message processing and depends on the message. [DllImport(Libraries.User32, CharSet = CharSet.Auto)] public static extern IntPtr DefWindowProc( @@ -1134,7 +1128,7 @@ [In] IntPtr lParam /// /// Retrieves information about the specified window. The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. /// If you are retrieving a pointer or a handle, this function has been superseded by the function. - /// Unicode declaration for + /// Unicode declaration for /// /// A handle to the window and, indirectly, the class to which the window belongs. /// The zero-based offset to the value to be retrieved. @@ -1145,7 +1139,7 @@ [In] IntPtr lParam /// /// Retrieves information about the specified window. The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. /// If you are retrieving a pointer or a handle, this function has been superseded by the function. - /// ANSI declaration for + /// ANSI declaration for /// /// A handle to the window and, indirectly, the class to which the window belongs. /// The zero-based offset to the value to be retrieved. @@ -1549,6 +1543,6 @@ public static extern int GetWindowCompositionAttribute( [DllImport(Libraries.User32, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)] public static extern uint GetDpiForWindow([In] HandleRef hwnd); } + #pragma warning restore SA1300 // Element should begin with upper-case letter #pragma warning restore SA1307 // Accessible fields should begin with upper-case letter -#pragma warning restore SA1401 // Fields should be private diff --git a/src/Wpf.Ui.Tray/NotifyIconEvent.cs b/src/Wpf.Ui.Tray/NotifyIconEventHandler.cs similarity index 100% rename from src/Wpf.Ui.Tray/NotifyIconEvent.cs rename to src/Wpf.Ui.Tray/NotifyIconEventHandler.cs diff --git a/src/Wpf.Ui.Tray/NotifyIconService.cs b/src/Wpf.Ui.Tray/NotifyIconService.cs index c4efcf659..41b8a078e 100644 --- a/src/Wpf.Ui.Tray/NotifyIconService.cs +++ b/src/Wpf.Ui.Tray/NotifyIconService.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Media; @@ -19,31 +18,31 @@ public class NotifyIconService : INotifyIconService public Window ParentWindow { get; internal set; } = null!; - public int Id => this.internalNotifyIconManager.Id; + public int Id => internalNotifyIconManager.Id; - public bool IsRegistered => this.internalNotifyIconManager.IsRegistered; + public bool IsRegistered => internalNotifyIconManager.IsRegistered; public string TooltipText { - get => this.internalNotifyIconManager.TooltipText; - set => this.internalNotifyIconManager.TooltipText = value; + get => internalNotifyIconManager.TooltipText; + set => internalNotifyIconManager.TooltipText = value; } - public ContextMenu ContextMenu + public ContextMenu? ContextMenu { - get => this.internalNotifyIconManager.ContextMenu; - set => this.internalNotifyIconManager.ContextMenu = value; + get => internalNotifyIconManager.ContextMenu; + set => internalNotifyIconManager.ContextMenu = value; } - public ImageSource Icon + public ImageSource? Icon { - get => this.internalNotifyIconManager.Icon; - set => this.internalNotifyIconManager.Icon = value; + get => internalNotifyIconManager.Icon; + set => internalNotifyIconManager.Icon = value; } public NotifyIconService() { - this.internalNotifyIconManager = new Internal.InternalNotifyIconManager(); + internalNotifyIconManager = new Internal.InternalNotifyIconManager(); RegisterHandlers(); } @@ -52,15 +51,15 @@ public bool Register() { if (ParentWindow is not null) { - return this.internalNotifyIconManager.Register(ParentWindow); + return internalNotifyIconManager.Register(ParentWindow); } - return this.internalNotifyIconManager.Register(); + return internalNotifyIconManager.Register(); } public bool Unregister() { - return this.internalNotifyIconManager.Unregister(); + return internalNotifyIconManager.Unregister(); } /// @@ -105,18 +104,18 @@ protected virtual void OnMiddleClick() { } /// protected virtual void OnMiddleDoubleClick() { } - private void OnParentWindowClosing(object sender, CancelEventArgs e) + private void OnParentWindowClosing(object? sender, CancelEventArgs e) { - this.internalNotifyIconManager.Dispose(); + internalNotifyIconManager.Dispose(); } private void RegisterHandlers() { - this.internalNotifyIconManager.LeftClick += OnLeftClick; - this.internalNotifyIconManager.LeftDoubleClick += OnLeftDoubleClick; - this.internalNotifyIconManager.RightClick += OnRightClick; - this.internalNotifyIconManager.RightDoubleClick += OnRightDoubleClick; - this.internalNotifyIconManager.MiddleClick += OnMiddleClick; - this.internalNotifyIconManager.MiddleDoubleClick += OnMiddleDoubleClick; + internalNotifyIconManager.LeftClick += OnLeftClick; + internalNotifyIconManager.LeftDoubleClick += OnLeftDoubleClick; + internalNotifyIconManager.RightClick += OnRightClick; + internalNotifyIconManager.RightDoubleClick += OnRightDoubleClick; + internalNotifyIconManager.MiddleClick += OnMiddleClick; + internalNotifyIconManager.MiddleDoubleClick += OnMiddleDoubleClick; } } diff --git a/src/Wpf.Ui.Tray/RoutedNotifyIconEvent.cs b/src/Wpf.Ui.Tray/RoutedNotifyIconEvent.cs index 399fa70fd..7f7b1377d 100644 --- a/src/Wpf.Ui.Tray/RoutedNotifyIconEvent.cs +++ b/src/Wpf.Ui.Tray/RoutedNotifyIconEvent.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Diagnostics.CodeAnalysis; using System.Windows; using Wpf.Ui.Tray.Controls; @@ -12,7 +11,8 @@ namespace Wpf.Ui.Tray; /// /// Event triggered on successful navigation. /// -/// Current navigation instance. +/// Source of the event, which should be the current navigation instance. +/// Event data containing information about the navigation event. #if NET5_0_OR_GREATER public delegate void RoutedNotifyIconEvent([NotNull] NotifyIcon sender, RoutedEventArgs e); #else diff --git a/src/Wpf.Ui.Tray/TrayData.cs b/src/Wpf.Ui.Tray/TrayData.cs index 791a5e84e..d10d367c3 100644 --- a/src/Wpf.Ui.Tray/TrayData.cs +++ b/src/Wpf.Ui.Tray/TrayData.cs @@ -3,8 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System.Collections.Generic; - namespace Wpf.Ui.Tray; /// @@ -13,7 +11,7 @@ namespace Wpf.Ui.Tray; internal static class TrayData { /// - /// Collection of registered tray icons. + /// Gets or sets the collection of registered tray icons. /// public static List NotifyIcons { get; set; } = new(); } diff --git a/src/Wpf.Ui.Tray/TrayHandler.cs b/src/Wpf.Ui.Tray/TrayHandler.cs index 1fcb0ef2e..b2c2c5012 100644 --- a/src/Wpf.Ui.Tray/TrayHandler.cs +++ b/src/Wpf.Ui.Tray/TrayHandler.cs @@ -3,9 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; -using System.Windows.Interop; - namespace Wpf.Ui.Tray; /// @@ -14,23 +11,21 @@ namespace Wpf.Ui.Tray; internal class TrayHandler : HwndSource { /// - /// Id of the hooked element. + /// Gets or sets the id of the hooked element. /// public int ElementId { get; internal set; } /// - /// Creates a new hWnd as a child with transparency parameters, no size and in the default position. Then, it attach the default delegation to the messages it receives. + /// Initializes a new instance of the class, creating a new hWnd as a child with transparency parameters, no size, and in the default position. It attaches the default delegation to the messages it receives. /// /// The name of the created window. /// Parent of the created window. public TrayHandler(string name, IntPtr parent) : base(0x0, 0x4000000, 0x80000 | 0x20 | 0x00000008 | 0x08000000, 0, 0, 0, 0, name, parent) { -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | New {typeof(TrayHandler)} registered with handle: #{Handle}, and parent: #{parent}", "Wpf.Ui.TrayHandler" ); -#endif } } diff --git a/src/Wpf.Ui.Tray/TrayManager.cs b/src/Wpf.Ui.Tray/TrayManager.cs index fea87fe21..2f1055429 100644 --- a/src/Wpf.Ui.Tray/TrayManager.cs +++ b/src/Wpf.Ui.Tray/TrayManager.cs @@ -3,9 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; using System.Windows; -using System.Windows.Interop; namespace Wpf.Ui.Tray; @@ -32,6 +30,11 @@ internal static class TrayManager { public static bool Register(INotifyIcon notifyIcon) { + if (notifyIcon is null) + { + return false; + } + return Register(notifyIcon, GetParentSource()); } @@ -45,7 +48,7 @@ public static bool Register(INotifyIcon notifyIcon, Window parentWindow) return Register(notifyIcon, (HwndSource)PresentationSource.FromVisual(parentWindow)); } - public static bool Register(INotifyIcon notifyIcon, HwndSource parentSource) + public static bool Register(INotifyIcon notifyIcon, HwndSource? parentSource) { if (parentSource is null) { @@ -54,7 +57,7 @@ public static bool Register(INotifyIcon notifyIcon, HwndSource parentSource) return false; } - Unregister(notifyIcon); + _ = Unregister(notifyIcon); return false; } @@ -66,7 +69,7 @@ public static bool Register(INotifyIcon notifyIcon, HwndSource parentSource) if (notifyIcon.IsRegistered) { - Unregister(notifyIcon); + _ = Unregister(notifyIcon); } notifyIcon.Id = TrayData.NotifyIcons.Count + 1; @@ -88,7 +91,7 @@ public static bool Register(INotifyIcon notifyIcon, HwndSource parentSource) dwState = 0x2 }; - if (!String.IsNullOrEmpty(notifyIcon.TooltipText)) + if (!string.IsNullOrEmpty(notifyIcon.TooltipText)) { notifyIcon.ShellIconData.szTip = notifyIcon.TooltipText; notifyIcon.ShellIconData.uFlags |= Interop.Shell32.NIF.TIP; @@ -98,7 +101,7 @@ public static bool Register(INotifyIcon notifyIcon, HwndSource parentSource) notifyIcon.HookWindow.AddHook(notifyIcon.WndProc); - Interop.Shell32.Shell_NotifyIcon(Interop.Shell32.NIM.ADD, notifyIcon.ShellIconData); + _ = Interop.Shell32.Shell_NotifyIcon(Interop.Shell32.NIM.ADD, notifyIcon.ShellIconData); TrayData.NotifyIcons.Add(notifyIcon); @@ -119,6 +122,19 @@ public static bool ModifyIcon(INotifyIcon notifyIcon) return Interop.Shell32.Shell_NotifyIcon(Interop.Shell32.NIM.MODIFY, notifyIcon.ShellIconData); } + public static bool ModifyToolTip(INotifyIcon notifyIcon) + { + if (!notifyIcon.IsRegistered) + { + return true; + } + + notifyIcon.ShellIconData.szTip = notifyIcon.TooltipText; + notifyIcon.ShellIconData.uFlags |= Interop.Shell32.NIF.TIP; + + return Interop.Shell32.Shell_NotifyIcon(Interop.Shell32.NIM.MODIFY, notifyIcon.ShellIconData); + } + /// /// Tries to remove the from the shell. /// @@ -129,7 +145,7 @@ public static bool Unregister(INotifyIcon notifyIcon) return false; } - Interop.Shell32.Shell_NotifyIcon(Interop.Shell32.NIM.DELETE, notifyIcon.ShellIconData); + _ = Interop.Shell32.Shell_NotifyIcon(Interop.Shell32.NIM.DELETE, notifyIcon.ShellIconData); notifyIcon.IsRegistered = false; @@ -139,7 +155,7 @@ public static bool Unregister(INotifyIcon notifyIcon) /// /// Gets application source. /// - private static HwndSource GetParentSource() + private static HwndSource? GetParentSource() { Window mainWindow = Application.Current.MainWindow; @@ -153,7 +169,7 @@ private static HwndSource GetParentSource() private static void ReloadHicon(INotifyIcon notifyIcon) { - var hIcon = IntPtr.Zero; + IntPtr hIcon = IntPtr.Zero; if (notifyIcon.Icon is not null) { diff --git a/src/Wpf.Ui.Tray/Wpf.Ui.Tray.csproj b/src/Wpf.Ui.Tray/Wpf.Ui.Tray.csproj index ac77b6eb5..b06f1e6d5 100644 --- a/src/Wpf.Ui.Tray/Wpf.Ui.Tray.csproj +++ b/src/Wpf.Ui.Tray/Wpf.Ui.Tray.csproj @@ -1,53 +1,27 @@ - $(PackagesCommonFrameworks) - Library - Properties - Wpf.Ui.Tray - Wpf.Ui.Tray WPF-UI.Tray - Wpf.Ui.Tray - Wpf.Ui.Tray - en-US - enable - true - true - true - true + net462;net472;net481;net6.0-windows;net8.0-windows;net9.0-windows Native tray menu icon support for WPF using the WPF UI library. - wpf tray notify notifications icons icon notifyicon menu ui wpfui fluent design winui windows controls - - - - true - true - wpfui.png + $(CommonTags);tray;notifyicon;notify + true + true + true - - - - - + - + - - True - - + - - true - - @@ -56,39 +30,23 @@ - - + + - - true - snupkg - true - true - false - - all - runtime; build; native; contentfiles; analyzers; buildtransitive + build; analyzers - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - diff --git a/src/Wpf.Ui/Animations/TransitionAnimationProvider.cs b/src/Wpf.Ui/Animations/TransitionAnimationProvider.cs index abbcfe58c..71edf8000 100644 --- a/src/Wpf.Ui/Animations/TransitionAnimationProvider.cs +++ b/src/Wpf.Ui/Animations/TransitionAnimationProvider.cs @@ -27,33 +27,19 @@ public static class TransitionAnimationProvider /// Selected transition type. /// Transition duration. /// Returns if the transition was applied. Otherwise . - public static bool ApplyTransition(object element, Transition type, int duration) + public static bool ApplyTransition(object? element, Transition type, int duration) { - if (type == Transition.None) + if ( + type == Transition.None + || !HardwareAcceleration.IsSupported(RenderingTier.PartialAcceleration) + || element is not UIElement uiElement + || duration < 10 + ) { return false; } - // Disable transitions for non-accelerated devices. - if (!HardwareAcceleration.IsSupported(RenderingTier.PartialAcceleration)) - { - return false; - } - - if (element is not UIElement uiElement) - { - return false; - } - - if (duration < 10) - { - return false; - } - - if (duration > 10000) - { - duration = 10000; - } + duration = duration > 10000 ? 10000 : duration; var timespanDuration = new Duration(TimeSpan.FromMilliseconds(duration)); diff --git a/src/Wpf.Ui/Appearance/ApplicationAccentColorManager.cs b/src/Wpf.Ui/Appearance/ApplicationAccentColorManager.cs index c969068a2..f9fd090a7 100644 --- a/src/Wpf.Ui/Appearance/ApplicationAccentColorManager.cs +++ b/src/Wpf.Ui/Appearance/ApplicationAccentColorManager.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Wpf.Ui.Extensions; using Wpf.Ui.Interop; namespace Wpf.Ui.Appearance; @@ -41,7 +40,7 @@ public static Color SystemAccent { get { - var resource = UiApplication.Current.Resources["SystemAccentColor"]; + object? resource = UiApplication.Current.Resources["SystemAccentColor"]; if (resource is Color color) { @@ -64,7 +63,7 @@ public static Color PrimaryAccent { get { - var resource = UiApplication.Current.Resources["SystemAccentColorPrimary"]; + object? resource = UiApplication.Current.Resources["SystemAccentColorPrimary"]; if (resource is Color color) { @@ -87,7 +86,7 @@ public static Color SecondaryAccent { get { - var resource = UiApplication.Current.Resources["SystemAccentColorSecondary"]; + object? resource = UiApplication.Current.Resources["SystemAccentColorSecondary"]; if (resource is Color color) { @@ -110,7 +109,7 @@ public static Color TertiaryAccent { get { - var resource = UiApplication.Current.Resources["SystemAccentColorTertiary"]; + object? resource = UiApplication.Current.Resources["SystemAccentColorTertiary"]; if (resource is Color color) { @@ -208,7 +207,6 @@ private static void UpdateColorResources( Color tertiaryAccent ) { -#if DEBUG System.Diagnostics.Debug.WriteLine("INFO | SystemAccentColor: " + systemAccent, "Wpf.Ui.Accent"); System.Diagnostics.Debug.WriteLine( "INFO | SystemAccentColorPrimary: " + primaryAccent, @@ -222,13 +220,10 @@ Color tertiaryAccent "INFO | SystemAccentColorTertiary: " + tertiaryAccent, "Wpf.Ui.Accent" ); -#endif if (secondaryAccent.GetBrightness() > BackgroundBrightnessThresholdValue) { -#if DEBUG System.Diagnostics.Debug.WriteLine("INFO | Text on accent is DARK", "Wpf.Ui.Accent"); -#endif UiApplication.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb( 0xFF, 0x00, @@ -262,9 +257,7 @@ Color tertiaryAccent } else { -#if DEBUG System.Diagnostics.Debug.WriteLine("INFO | Text on accent is LIGHT", "Wpf.Ui.Accent"); -#endif UiApplication.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb( 0xFF, 0xFF, diff --git a/src/Wpf.Ui/Appearance/ApplicationThemeManager.cs b/src/Wpf.Ui/Appearance/ApplicationThemeManager.cs index 539c5210d..74641fa12 100644 --- a/src/Wpf.Ui/Appearance/ApplicationThemeManager.cs +++ b/src/Wpf.Ui/Appearance/ApplicationThemeManager.cs @@ -62,12 +62,10 @@ public static class ApplicationThemeManager /// Theme to set. /// Whether the custom background effect should be applied. /// Whether the color accents should be changed. - /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. public static void Apply( ApplicationTheme applicationTheme, WindowBackdropType backgroundEffect = WindowBackdropType.Mica, - bool updateAccent = true, - bool forceBackground = false + bool updateAccent = true ) { if (updateAccent) @@ -84,9 +82,9 @@ public static void Apply( return; } - var appDictionaries = new ResourceDictionaryManager(LibraryNamespace); + ResourceDictionaryManager appDictionaries = new(LibraryNamespace); - var themeDictionaryName = "Light"; + string themeDictionaryName = "Light"; switch (applicationTheme) { @@ -94,23 +92,14 @@ public static void Apply( themeDictionaryName = "Dark"; break; case ApplicationTheme.HighContrast: - switch (ApplicationThemeManager.GetSystemTheme()) + themeDictionaryName = ApplicationThemeManager.GetSystemTheme() switch { - case SystemTheme.HC1: - themeDictionaryName = "HC1"; - break; - case SystemTheme.HC2: - themeDictionaryName = "HC2"; - break; - case SystemTheme.HCBlack: - themeDictionaryName = "HCBlack"; - break; - case SystemTheme.HCWhite: - default: - themeDictionaryName = "HCWhite"; - break; - } - + SystemTheme.HC1 => "HC1", + SystemTheme.HC2 => "HC2", + SystemTheme.HCBlack => "HCBlack", + SystemTheme.HCWhite => "HCWhite", + _ => "HCWhite", + }; break; } @@ -119,12 +108,11 @@ public static void Apply( new Uri(ThemesDictionaryPath + themeDictionaryName + ".xaml", UriKind.Absolute) ); -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {typeof(ApplicationThemeManager)} tries to update theme to {themeDictionaryName} ({applicationTheme}): {isUpdated}", nameof(ApplicationThemeManager) ); -#endif + if (!isUpdated) { return; @@ -138,12 +126,7 @@ public static void Apply( if (UiApplication.Current.MainWindow is Window mainWindow) { - WindowBackgroundManager.UpdateBackground( - mainWindow, - applicationTheme, - backgroundEffect, - forceBackground - ); + WindowBackgroundManager.UpdateBackground(mainWindow, applicationTheme, backgroundEffect); } } @@ -159,7 +142,7 @@ public static void Apply(FrameworkElement frameworkElement) ResourceDictionary[] resourcesRemove = frameworkElement .Resources.MergedDictionaries.Where(e => e.Source is not null) - .Where(e => e.Source.ToString().ToLower().Contains(LibraryNamespace)) + .Where(e => e.Source.ToString().Contains(LibraryNamespace, StringComparison.OrdinalIgnoreCase)) .ToArray(); foreach (ResourceDictionary? resource in UiApplication.Current.Resources.MergedDictionaries) @@ -305,19 +288,19 @@ private static void FetchApplicationTheme() return; } - string themeUri = themeDictionary.Source.ToString().Trim().ToLower(); + string themeUri = themeDictionary.Source.ToString(); - if (themeUri.Contains("light")) + if (themeUri.Contains("light", StringComparison.OrdinalIgnoreCase)) { _cachedApplicationTheme = ApplicationTheme.Light; } - if (themeUri.Contains("dark")) + if (themeUri.Contains("dark", StringComparison.OrdinalIgnoreCase)) { _cachedApplicationTheme = ApplicationTheme.Dark; } - if (themeUri.Contains("highcontrast")) + if (themeUri.Contains("highcontrast", StringComparison.OrdinalIgnoreCase)) { _cachedApplicationTheme = ApplicationTheme.HighContrast; } diff --git a/src/Wpf.Ui/Appearance/ObservedWindow.cs b/src/Wpf.Ui/Appearance/ObservedWindow.cs index 2febc935f..44e4c586c 100644 --- a/src/Wpf.Ui/Appearance/ObservedWindow.cs +++ b/src/Wpf.Ui/Appearance/ObservedWindow.cs @@ -7,40 +7,60 @@ namespace Wpf.Ui.Appearance; +/// +/// Represents a window that is being observed for changes in appearance. +/// internal class ObservedWindow { private readonly HwndSource _source; - public ObservedWindow( - IntPtr handle, - WindowBackdropType backdrop, - bool forceBackgroundReplace, - bool updateAccents - ) + /// + /// Initializes a new instance of the ObservedWindow class. + /// + /// The handle of the window. + /// The backdrop type of the window. + /// Indicates whether to update accents. + public ObservedWindow(IntPtr handle, WindowBackdropType backdrop, bool updateAccents) { Handle = handle; Backdrop = backdrop; - ForceBackgroundReplace = forceBackgroundReplace; UpdateAccents = updateAccents; HasHook = false; - var windowSource = HwndSource.FromHwnd(handle); + HwndSource? windowSource = HwndSource.FromHwnd(handle); _source = windowSource ?? throw new InvalidOperationException("Unable to determine the window source."); } + /// + /// Gets the root visual of the window. + /// public Window? RootVisual => (Window?)_source.RootVisual; + /// + /// Gets the handle of the window. + /// public IntPtr Handle { get; } + /// + /// Gets the backdrop type of the window. + /// public WindowBackdropType Backdrop { get; } - public bool ForceBackgroundReplace { get; } - + /// + /// Gets a value indicating whether to update accents. + /// public bool UpdateAccents { get; } + /// + /// Gets a value indicating whether the window has a hook. + /// public bool HasHook { get; private set; } + /// + /// Adds a hook to the window. + /// + /// The hook to add. public void AddHook(HwndSourceHook hook) { _source.AddHook(hook); @@ -48,6 +68,10 @@ public void AddHook(HwndSourceHook hook) HasHook = true; } + /// + /// Removes a hook from the window. + /// + /// The hook to remove. public void RemoveHook(HwndSourceHook hook) { _source.RemoveHook(hook); diff --git a/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs b/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs index 01f0afc29..db28301af 100644 --- a/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs +++ b/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs @@ -46,19 +46,17 @@ public bool HasDictionary(string resourceLookup) return null; } - resourceLookup = resourceLookup.ToLower().Trim(); - foreach (ResourceDictionary t in applicationDictionaries) { string resourceDictionaryUri; if (t?.Source != null) { - resourceDictionaryUri = t.Source.ToString().ToLower().Trim(); + resourceDictionaryUri = t.Source.ToString(); if ( - resourceDictionaryUri.Contains(SearchNamespace) - && resourceDictionaryUri.Contains(resourceLookup) + resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) + && resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase) ) { return t; @@ -72,11 +70,11 @@ public bool HasDictionary(string resourceLookup) continue; } - resourceDictionaryUri = t1.Source.ToString().ToLower().Trim(); + resourceDictionaryUri = t1.Source.ToString(); if ( - !resourceDictionaryUri.Contains(SearchNamespace) - || !resourceDictionaryUri.Contains(resourceLookup) + !resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) + || !resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase) ) { continue; @@ -107,17 +105,15 @@ public bool UpdateDictionary(string resourceLookup, Uri? newResourceUri) return false; } - resourceLookup = resourceLookup.ToLower().Trim(); - for (var i = 0; i < applicationDictionaries.Count; i++) { string sourceUri; if (applicationDictionaries[i]?.Source != null) { - sourceUri = applicationDictionaries[i].Source.ToString().ToLower().Trim(); + sourceUri = applicationDictionaries[i].Source.ToString(); - if (sourceUri.Contains(SearchNamespace) && sourceUri.Contains(resourceLookup)) + if (sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) && sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase)) { applicationDictionaries[i] = new() { Source = newResourceUri }; @@ -134,11 +130,10 @@ public bool UpdateDictionary(string resourceLookup, Uri? newResourceUri) sourceUri = applicationDictionaries[i] .MergedDictionaries[j] - .Source.ToString() - .ToLower() - .Trim(); + .Source + .ToString(); - if (!sourceUri.Contains(SearchNamespace) || !sourceUri.Contains(resourceLookup)) + if (!sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) || !sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase)) { continue; } diff --git a/src/Wpf.Ui/Appearance/SystemThemeManager.cs b/src/Wpf.Ui/Appearance/SystemThemeManager.cs index 4b48e1899..57945aa7d 100644 --- a/src/Wpf.Ui/Appearance/SystemThemeManager.cs +++ b/src/Wpf.Ui/Appearance/SystemThemeManager.cs @@ -65,71 +65,69 @@ private static SystemTheme GetCurrentSystemTheme() "CurrentTheme", "aero.theme" ) as string - ?? String.Empty; + ?? string.Empty; - if (!String.IsNullOrEmpty(currentTheme)) + if (!string.IsNullOrEmpty(currentTheme)) { - currentTheme = currentTheme.ToLower().Trim(); - // This may be changed in the next versions, check the Insider previews - if (currentTheme.Contains("basic.theme")) + if (currentTheme.Contains("basic.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.Light; } - if (currentTheme.Contains("aero.theme")) + if (currentTheme.Contains("aero.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.Light; } - if (currentTheme.Contains("dark.theme")) + if (currentTheme.Contains("dark.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.Dark; } - if (currentTheme.Contains("hcblack.theme")) + if (currentTheme.Contains("hcblack.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.HCBlack; } - if (currentTheme.Contains("hcwhite.theme")) + if (currentTheme.Contains("hcwhite.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.HCWhite; } - if (currentTheme.Contains("hc1.theme")) + if (currentTheme.Contains("hc1.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.HC1; } - if (currentTheme.Contains("hc2.theme")) + if (currentTheme.Contains("hc2.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.HC2; } - if (currentTheme.Contains("themea.theme")) + if (currentTheme.Contains("themea.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.Glow; } - if (currentTheme.Contains("themeb.theme")) + if (currentTheme.Contains("themeb.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.CapturedMotion; } - if (currentTheme.Contains("themec.theme")) + if (currentTheme.Contains("themec.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.Sunrise; } - if (currentTheme.Contains("themed.theme")) + if (currentTheme.Contains("themed.theme", StringComparison.OrdinalIgnoreCase)) { return SystemTheme.Flow; } } - //if (currentTheme.Contains("custom.theme")) - // return ; custom can be light or dark + /*if (currentTheme.Contains("custom.theme")) + return ; custom can be light or dark*/ var rawAppsUseLightTheme = Registry.GetValue( "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", "AppsUseLightTheme", diff --git a/src/Wpf.Ui/Appearance/SystemThemeWatcher.cs b/src/Wpf.Ui/Appearance/SystemThemeWatcher.cs index e68808789..7d300fe68 100644 --- a/src/Wpf.Ui/Appearance/SystemThemeWatcher.cs +++ b/src/Wpf.Ui/Appearance/SystemThemeWatcher.cs @@ -25,7 +25,7 @@ namespace Wpf.Ui.Appearance; /// public static class SystemThemeWatcher { - private static readonly ICollection _observedWindows = new List(); + private static readonly List _observedWindows = []; /// /// Watches the and applies the background effect and theme according to the system theme. @@ -33,12 +33,10 @@ public static class SystemThemeWatcher /// The window that will be updated. /// Background effect to be applied when changing the theme. /// If , the accents will be updated when the change is detected. - /// If , bypasses the app's theme compatibility check and tries to force the change of a background effect. public static void Watch( Window? window, WindowBackdropType backdrop = WindowBackdropType.Mica, - bool updateAccents = true, - bool forceBackgroundReplace = false + bool updateAccents = true ) { if (window is null) @@ -48,31 +46,24 @@ public static void Watch( if (window.IsLoaded) { - ObserveLoadedWindow(window, backdrop, updateAccents, forceBackgroundReplace); + ObserveLoadedWindow(window, backdrop, updateAccents); } else { - ObserveWindowWhenLoaded(window, backdrop, updateAccents, forceBackgroundReplace); + ObserveWindowWhenLoaded(window, backdrop, updateAccents); } - if (!_observedWindows.Any()) + if (_observedWindows.Count == 0) { -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {typeof(SystemThemeWatcher)} changed the app theme on initialization.", nameof(SystemThemeWatcher) ); -#endif ApplicationThemeManager.ApplySystemTheme(updateAccents); } } - private static void ObserveLoadedWindow( - Window window, - WindowBackdropType backdrop, - bool updateAccents, - bool forceBackgroundReplace - ) + private static void ObserveLoadedWindow(Window window, WindowBackdropType backdrop, bool updateAccents) { IntPtr hWnd = (hWnd = new WindowInteropHelper(window).Handle) == IntPtr.Zero @@ -84,14 +75,13 @@ bool forceBackgroundReplace throw new InvalidOperationException("Window handle cannot be empty"); } - ObserveLoadedHandle(new ObservedWindow(hWnd, backdrop, forceBackgroundReplace, updateAccents)); + ObserveLoadedHandle(new ObservedWindow(hWnd, backdrop, updateAccents)); } private static void ObserveWindowWhenLoaded( Window window, WindowBackdropType backdrop, - bool updateAccents, - bool forceBackgroundReplace + bool updateAccents ) { window.Loaded += (_, _) => @@ -106,7 +96,7 @@ bool forceBackgroundReplace throw new InvalidOperationException("Window handle cannot be empty"); } - ObserveLoadedHandle(new ObservedWindow(hWnd, backdrop, forceBackgroundReplace, updateAccents)); + ObserveLoadedHandle(new ObservedWindow(hWnd, backdrop, updateAccents)); }; } @@ -114,12 +104,10 @@ private static void ObserveLoadedHandle(ObservedWindow observedWindow) { if (!observedWindow.HasHook) { -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {observedWindow.Handle} ({observedWindow.RootVisual?.Title}) registered as watched window.", nameof(SystemThemeWatcher) ); -#endif observedWindow.AddHook(WndProc); _observedWindows.Add(observedWindow); } @@ -187,20 +175,17 @@ private static void UpdateObservedWindow(nint hWnd) ApplicationThemeManager.ApplySystemTheme(observedWindow.UpdateAccents); ApplicationTheme currentApplicationTheme = ApplicationThemeManager.GetAppTheme(); -#if DEBUG System.Diagnostics.Debug.WriteLine( $"INFO | {observedWindow.Handle} ({observedWindow.RootVisual?.Title}) triggered the application theme change to {ApplicationThemeManager.GetSystemTheme()}.", nameof(SystemThemeWatcher) ); -#endif if (observedWindow.RootVisual is not null) { WindowBackgroundManager.UpdateBackground( observedWindow.RootVisual, currentApplicationTheme, - observedWindow.Backdrop, - observedWindow.ForceBackgroundReplace + observedWindow.Backdrop ); } } diff --git a/src/Wpf.Ui/Appearance/WindowBackgroundManager.cs b/src/Wpf.Ui/Appearance/WindowBackgroundManager.cs index 5b573f818..769e888bc 100644 --- a/src/Wpf.Ui/Appearance/WindowBackgroundManager.cs +++ b/src/Wpf.Ui/Appearance/WindowBackgroundManager.cs @@ -16,8 +16,7 @@ namespace Wpf.Ui.Appearance; /// WindowBackgroundManager.UpdateBackground( /// observedWindow.RootVisual, /// currentApplicationTheme, -/// observedWindow.Backdrop, -/// observedWindow.ForceBackgroundReplace +/// observedWindow.Backdrop /// ); /// /// @@ -59,14 +58,24 @@ public static void RemoveDarkThemeFromWindow(Window? window) window.Loaded += (sender, _) => UnsafeNativeMethods.RemoveWindowDarkMode(sender as Window); } + [Obsolete("Use UpdateBackground(Window, ApplicationTheme, WindowBackdropType) instead.")] + public static void UpdateBackground( + Window? window, + ApplicationTheme applicationTheme, + WindowBackdropType backdrop, + bool forceBackground + ) + { + UpdateBackground(window, applicationTheme, backdrop); + } + /// /// Forces change to application background. Required if custom background effect was previously applied. /// public static void UpdateBackground( Window? window, ApplicationTheme applicationTheme, - WindowBackdropType backdrop, - bool forceBackground + WindowBackdropType backdrop ) { if (window is null) @@ -82,11 +91,16 @@ bool forceBackground } // This was required to update the background when moving from a HC theme to light/dark theme. However, this breaks theme proper light/dark theme changing on Windows 10. - // else - // { - // _ = WindowBackdrop.RemoveBackground(window); - // } + // But window backdrop effects are not applied when it has an opaque (or any) background on W11 (so removing this breaks backdrop effects when switching themes), however, for legacy MICA it may not be required + // using existing variable, though the OS build which (officially) supports setting DWM_SYSTEMBACKDROP_TYPE attribute is build 22621 + // source: https://learn.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwm_systembackdrop_type + if (Win32.Utilities.IsOSWindows11Insider1OrNewer && backdrop is not WindowBackdropType.None) + { + _ = WindowBackdrop.RemoveBackground(window); + } + _ = WindowBackdrop.ApplyBackdrop(window, backdrop); + if (applicationTheme is ApplicationTheme.Dark) { ApplyDarkThemeToWindow(window); @@ -96,6 +110,8 @@ bool forceBackground RemoveDarkThemeFromWindow(window); } + _ = WindowBackdrop.RemoveTitlebarBackground(window); + foreach (object? subWindow in window.OwnedWindows) { if (subWindow is Window windowSubWindow) @@ -110,6 +126,8 @@ bool forceBackground { RemoveDarkThemeFromWindow(windowSubWindow); } + + _ = WindowBackdrop.RemoveTitlebarBackground(window); } } } diff --git a/src/Wpf.Ui/AutomationPeers/CardControlAutomationPeer.cs b/src/Wpf.Ui/AutomationPeers/CardControlAutomationPeer.cs index a4f6dc739..185b09c78 100644 --- a/src/Wpf.Ui/AutomationPeers/CardControlAutomationPeer.cs +++ b/src/Wpf.Ui/AutomationPeers/CardControlAutomationPeer.cs @@ -9,16 +9,11 @@ namespace Wpf.Ui.AutomationPeers; -internal class CardControlAutomationPeer : FrameworkElementAutomationPeer +/// +/// Provides UI Automation peer for the CardControl. +/// +internal class CardControlAutomationPeer(CardControl owner) : FrameworkElementAutomationPeer(owner) { - private readonly CardControl _owner; - - public CardControlAutomationPeer(CardControl owner) - : base(owner) - { - _owner = owner; - } - protected override string GetClassNameCore() { return "CardControl"; @@ -41,7 +36,7 @@ public override object GetPattern(PatternInterface patternInterface) protected override AutomationPeer GetLabeledByCore() { - if (_owner.Header is UIElement element) + if (owner.Header is UIElement element) { return CreatePeerForElement(element); } @@ -51,19 +46,19 @@ protected override AutomationPeer GetLabeledByCore() protected override string GetNameCore() { - var result = base.GetNameCore() ?? String.Empty; + var result = base.GetNameCore() ?? string.Empty; - if (result == String.Empty) + if (result == string.Empty) { - result = AutomationProperties.GetName(_owner); + result = AutomationProperties.GetName(owner); } - if (result == String.Empty && _owner.Header is DependencyObject d) + if (result == string.Empty && owner.Header is DependencyObject d) { result = AutomationProperties.GetName(d); } - if (result == String.Empty && _owner.Header is string s) + if (result == string.Empty && owner.Header is string s) { result = s; } diff --git a/src/Wpf.Ui/ContentDialogService.cs b/src/Wpf.Ui/ContentDialogService.cs index 4be3b82a9..c0b9e3200 100644 --- a/src/Wpf.Ui/ContentDialogService.cs +++ b/src/Wpf.Ui/ContentDialogService.cs @@ -32,42 +32,49 @@ namespace Wpf.Ui; /// public class ContentDialogService : IContentDialogService { - private ContentPresenter? _contentPresenter; + private ContentPresenter? _dialogHost; - /// + [Obsolete("Use SetDialogHost instead.")] public void SetContentPresenter(ContentPresenter contentPresenter) { - _contentPresenter = contentPresenter; + SetDialogHost(contentPresenter); + } + + [Obsolete("Use GetDialogHost instead.")] + public ContentPresenter? GetContentPresenter() + { + return GetDialogHost(); } /// - public ContentPresenter GetContentPresenter() + public void SetDialogHost(ContentPresenter contentPresenter) { - if (_contentPresenter is null) - { - throw new ArgumentNullException($"The ContentPresenter didn't set previously."); - } + _dialogHost = contentPresenter; + } - return _contentPresenter; + /// + public ContentPresenter? GetDialogHost() + { + return _dialogHost; } /// public Task ShowAsync(ContentDialog dialog, CancellationToken cancellationToken) { - if (_contentPresenter is null) + if (_dialogHost == null) { - throw new ArgumentNullException($"The ContentPresenter didn't set previously."); + throw new InvalidOperationException("The DialogHost was never set."); } - dialog.ContentPresenter ??= _contentPresenter; - - if (dialog.ContentPresenter != _contentPresenter) + if (dialog.DialogHost != null && _dialogHost != dialog.DialogHost) { throw new InvalidOperationException( - $"The ContentPresenter is not the same as the previously set." + "The DialogHost is not the same as the one that was previously set." ); } + dialog.DialogHost = _dialogHost; + return dialog.ShowAsync(cancellationToken); } } diff --git a/src/Wpf.Ui/Controls/Anchor/Anchor.cs b/src/Wpf.Ui/Controls/Anchor/Anchor.cs index 033626ee0..207476f8a 100644 --- a/src/Wpf.Ui/Controls/Anchor/Anchor.cs +++ b/src/Wpf.Ui/Controls/Anchor/Anchor.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. - // https://docs.microsoft.com/en-us/fluent-ui/web-components/components/anchor // ReSharper disable once CheckNamespace @@ -15,9 +14,7 @@ namespace Wpf.Ui.Controls; /// /// /// <ui:Anchor -/// NavigateUri="https://dev.lepo.co/" /> +/// NavigateUri="https://lepo.co/" /> /// /// -//[ToolboxItem(true)] -//[ToolboxBitmap(typeof(Anchor), "Anchor.bmp")] public class Anchor : Wpf.Ui.Controls.HyperlinkButton { } diff --git a/src/Wpf.Ui/Controls/Arc/Arc.cs b/src/Wpf.Ui/Controls/Arc/Arc.cs index ef3d37b4c..c668584a7 100644 --- a/src/Wpf.Ui/Controls/Arc/Arc.cs +++ b/src/Wpf.Ui/Controls/Arc/Arc.cs @@ -3,10 +3,12 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Windows.Controls; +using System.Windows.Shapes; using Point = System.Windows.Point; using Size = System.Windows.Size; -// ReSharper disable once CheckNamespace +// ReSharper disable CheckNamespace namespace Wpf.Ui.Controls; /// @@ -22,13 +24,11 @@ namespace Wpf.Ui.Controls; /// Visibility="Visible" /> /// /// -// [ToolboxItem(true)] -// [ToolboxBitmap(typeof(Arc), "Arc.bmp")] -public class Arc : System.Windows.Shapes.Shape +public class Arc : Shape { - /// - /// Property for . - /// + private Viewbox? _rootLayout; + + /// Identifies the dependency property. public static readonly DependencyProperty StartAngleProperty = DependencyProperty.Register( nameof(StartAngle), typeof(double), @@ -36,9 +36,7 @@ public class Arc : System.Windows.Shapes.Shape new PropertyMetadata(0.0d, PropertyChangedCallback) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty EndAngleProperty = DependencyProperty.Register( nameof(EndAngle), typeof(double), @@ -46,6 +44,22 @@ public class Arc : System.Windows.Shapes.Shape new PropertyMetadata(0.0d, PropertyChangedCallback) ); + /// Identifies the dependency property. + public static readonly DependencyProperty SweepDirectionProperty = DependencyProperty.Register( + nameof(SweepDirection), + typeof(SweepDirection), + typeof(Arc), + new PropertyMetadata(SweepDirection.Clockwise, PropertyChangedCallback) + ); + + /// Identifies the dependency property. + public static readonly DependencyProperty StrokeStartLineCapProperty = DependencyProperty.Register( + nameof(StrokeStartLineCap), + typeof(PenLineCap), + typeof(Arc), + new PropertyMetadata(PenLineCap.Round, PropertyChangedCallback) + ); + /// /// Gets or sets the initial angle from which the arc will be drawn. /// @@ -65,37 +79,45 @@ public double EndAngle } /// - /// Gets a value indicating whether one of the two larger arc sweeps is chosen; otherwise, if is , one of the smaller arc sweeps is chosen. + /// Gets or sets the direction to where the arc will be drawn. /// - public bool IsLargeArc { get; internal set; } = false; + public SweepDirection SweepDirection + { + get => (SweepDirection)GetValue(SweepDirectionProperty); + set => SetValue(SweepDirectionProperty, value); + } - /// - protected override Geometry DefiningGeometry => GetDefiningGeometry(); + // TODO: Should we? + public new PenLineCap StrokeStartLineCap + { + get { return (PenLineCap)GetValue(StrokeStartLineCapProperty); } + set { SetValue(StrokeStartLineCapProperty, value); } + } /// - /// Initializes static members of the class. + /// Gets a value indicating whether one of the two larger arc sweeps is chosen; otherwise, if is , one of the smaller arc sweeps is chosen. /// - /// - /// Overrides default properties. - /// - static Arc() + public bool IsLargeArc { get; internal set; } = false; + + private void EnsureRootLayout() { - StrokeStartLineCapProperty.OverrideMetadata( - typeof(Arc), - new FrameworkPropertyMetadata(PenLineCap.Round) - ); + if (_rootLayout != null) + { + return; + } - StrokeEndLineCapProperty.OverrideMetadata( - typeof(Arc), - new FrameworkPropertyMetadata(PenLineCap.Round) - ); + _rootLayout = new Viewbox { SnapsToDevicePixels = true }; + AddVisualChild(_rootLayout); } + /// + protected override Geometry DefiningGeometry => DefinedGeometry(); + /// /// Get the geometry that defines this shape. /// Based on Mark Feldman implementation. /// - protected Geometry GetDefiningGeometry() + protected Geometry DefinedGeometry() { var geometryStream = new StreamGeometry(); var arcSize = new Size( @@ -103,20 +125,18 @@ protected Geometry GetDefiningGeometry() Math.Max(0, (RenderSize.Height - StrokeThickness) / 2) ); - using (StreamGeometryContext context = geometryStream.Open()) - { - context.BeginFigure(PointAtAngle(Math.Min(StartAngle, EndAngle)), false, false); - - context.ArcTo( - PointAtAngle(Math.Max(StartAngle, EndAngle)), - arcSize, - 0, - IsLargeArc, - SweepDirection.Counterclockwise, - true, - false - ); - } + using StreamGeometryContext context = geometryStream.Open(); + context.BeginFigure(PointAtAngle(Math.Min(StartAngle, EndAngle)), false, false); + + context.ArcTo( + PointAtAngle(Math.Max(StartAngle, EndAngle)), + arcSize, + 0, + IsLargeArc, + SweepDirection, + true, + false + ); geometryStream.Transform = new TranslateTransform(StrokeThickness / 2, StrokeThickness / 2); @@ -130,11 +150,42 @@ protected Geometry GetDefiningGeometry() /// The angle at which to create the point. protected Point PointAtAngle(double angle) { - var radAngle = angle * (Math.PI / 180); - var xRadius = (RenderSize.Width - StrokeThickness) / 2; - var yRadius = (RenderSize.Height - StrokeThickness) / 2; - - return new Point(xRadius + (xRadius * Math.Cos(radAngle)), yRadius - (yRadius * Math.Sin(radAngle))); + if (SweepDirection == SweepDirection.Counterclockwise) + { + angle += 90; + angle %= 360; + if (angle < 0) + { + angle += 360; + } + + var radAngle = angle * (Math.PI / 180); + var xRadius = (RenderSize.Width - StrokeThickness) / 2; + var yRadius = (RenderSize.Height - StrokeThickness) / 2; + + return new Point( + xRadius + (xRadius * Math.Cos(radAngle)), + yRadius - (yRadius * Math.Sin(radAngle)) + ); + } + else + { + angle -= 90; + angle %= 360; + if (angle < 0) + { + angle += 360; + } + + var radAngle = angle * (Math.PI / 180); + var xRadius = (RenderSize.Width - StrokeThickness) / 2; + var yRadius = (RenderSize.Height - StrokeThickness) / 2; + + return new Point( + xRadius + (xRadius * Math.Cos(-radAngle)), + yRadius - (yRadius * Math.Sin(-radAngle)) + ); + } } /// @@ -148,8 +199,49 @@ protected static void PropertyChangedCallback(DependencyObject d, DependencyProp } control.IsLargeArc = Math.Abs(control.EndAngle - control.StartAngle) > 180; - - // Force complete new layout pass control.InvalidateVisual(); } + + protected override Visual? GetVisualChild(int index) + { + if (index != 0) + { + throw new ArgumentOutOfRangeException(nameof(index), "Arc should have only 1 child"); + } + + EnsureRootLayout(); + + return _rootLayout; + } + + protected override Size MeasureOverride(Size availableSize) + { + EnsureRootLayout(); + + _rootLayout!.Measure(availableSize); + return _rootLayout.DesiredSize; + } + + protected override Size ArrangeOverride(Size finalSize) + { + EnsureRootLayout(); + + _rootLayout!.Arrange(new Rect(default, finalSize)); + return finalSize; + } + + /// Overrides the default OnRender method to draw the element. + /// A object that is drawn during the rendering pass of this . + protected override void OnRender(DrawingContext drawingContext) + { + base.OnRender(drawingContext); + Pen pen = + new(Stroke, StrokeThickness) + { + StartLineCap = StrokeStartLineCap, + EndLineCap = StrokeStartLineCap + }; + + drawingContext.DrawGeometry(Stroke, pen, DefinedGeometry()); + } } diff --git a/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.cs b/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.cs index 5c8ae6acb..bc80dd74e 100644 --- a/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.cs +++ b/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.cs @@ -27,22 +27,16 @@ namespace Wpf.Ui.Controls; /// </ui:AutoSuggestBox> /// /// -//[ToolboxItem(true)] -//[ToolboxBitmap(typeof(AutoSuggestBox), "AutoSuggestBox.bmp")] [TemplatePart(Name = ElementTextBox, Type = typeof(TextBox))] [TemplatePart(Name = ElementSuggestionsPopup, Type = typeof(Popup))] [TemplatePart(Name = ElementSuggestionsList, Type = typeof(ListView))] public class AutoSuggestBox : System.Windows.Controls.ItemsControl, IIconControl { protected const string ElementTextBox = "PART_TextBox"; - protected const string ElementSuggestionsPopup = "PART_SuggestionsPopup"; - protected const string ElementSuggestionsList = "PART_SuggestionsList"; - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty OriginalItemsSourceProperty = DependencyProperty.Register( nameof(OriginalItemsSource), typeof(IList), @@ -50,9 +44,7 @@ public class AutoSuggestBox : System.Windows.Controls.ItemsControl, IIconControl new PropertyMetadata(Array.Empty()) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty IsSuggestionListOpenProperty = DependencyProperty.Register( nameof(IsSuggestionListOpen), typeof(bool), @@ -60,29 +52,23 @@ public class AutoSuggestBox : System.Windows.Controls.ItemsControl, IIconControl new PropertyMetadata(false) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty TextProperty = DependencyProperty.Register( nameof(Text), typeof(string), typeof(AutoSuggestBox), - new PropertyMetadata(String.Empty, TextPropertyChangedCallback) + new PropertyMetadata(string.Empty, OnTextChanged) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty PlaceholderTextProperty = DependencyProperty.Register( nameof(PlaceholderText), typeof(string), typeof(AutoSuggestBox), - new PropertyMetadata(String.Empty) + new PropertyMetadata(string.Empty) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty UpdateTextOnSelectProperty = DependencyProperty.Register( nameof(UpdateTextOnSelect), typeof(bool), @@ -90,9 +76,7 @@ public class AutoSuggestBox : System.Windows.Controls.ItemsControl, IIconControl new PropertyMetadata(true) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty MaxSuggestionListHeightProperty = DependencyProperty.Register( nameof(MaxSuggestionListHeight), typeof(double), @@ -100,9 +84,7 @@ public class AutoSuggestBox : System.Windows.Controls.ItemsControl, IIconControl new PropertyMetadata(0d) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty IconProperty = DependencyProperty.Register( nameof(Icon), typeof(IconElement), @@ -110,9 +92,7 @@ public class AutoSuggestBox : System.Windows.Controls.ItemsControl, IIconControl new PropertyMetadata(null) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty FocusCommandProperty = DependencyProperty.Register( nameof(FocusCommand), typeof(ICommand), @@ -194,9 +174,7 @@ public IconElement? Icon /// public ICommand FocusCommand => (ICommand)GetValue(FocusCommandProperty); - /// - /// Routed event for . - /// + /// Identifies the routed event. public static readonly RoutedEvent QuerySubmittedEvent = EventManager.RegisterRoutedEvent( nameof(QuerySubmitted), RoutingStrategy.Bubble, @@ -204,9 +182,7 @@ public IconElement? Icon typeof(AutoSuggestBox) ); - /// - /// Routed event for . - /// + /// Identifies the routed event. public static readonly RoutedEvent SuggestionChosenEvent = EventManager.RegisterRoutedEvent( nameof(SuggestionChosen), RoutingStrategy.Bubble, @@ -214,9 +190,7 @@ public IconElement? Icon typeof(AutoSuggestBox) ); - /// - /// Routed event for . - /// + /// Identifies the routed event. public static readonly RoutedEvent TextChangedEvent = EventManager.RegisterRoutedEvent( nameof(TextChanged), RoutingStrategy.Bubble, @@ -251,18 +225,15 @@ public event TypedEventHandler RemoveHandler(TextChangedEvent, value); } - protected TextBox? TextBox = null; + protected TextBox? TextBox { get; set; } = null; - protected Popup SuggestionsPopup = null!; + protected Popup SuggestionsPopup { get; set; } = null!; - protected ListView? SuggestionsList = null!; + protected ListView? SuggestionsList { get; set; } = null!; private bool _changingTextAfterSuggestionChosen; - private bool _isChangedTextOutSideOfTextBox; - private object? _selectedItem; - private bool? _isHwndHookSubscribed; public AutoSuggestBox() @@ -297,9 +268,14 @@ public override void OnApplyTemplate() } /// - public new void Focus() + public new bool Focus() { - TextBox.Focus(); + if (TextBox is null) + { + return false; + } + + return TextBox.Focus(); } protected T GetTemplateChild(string name) @@ -433,16 +409,13 @@ private void TextBoxOnPreviewKeyDown(object sender, KeyEventArgs e) if (e.Key is Key.Escape) { SetCurrentValue(IsSuggestionListOpenProperty, false); - return; } if (e.Key is Key.Enter) { SetCurrentValue(IsSuggestionListOpenProperty, false); - - OnQuerySubmitted(TextBox.Text); - + OnQuerySubmitted(TextBox!.Text); return; } @@ -478,9 +451,9 @@ private void TextBoxOnTextChanged(object sender, TextChangedEventArgs e) changeReason = AutoSuggestionBoxTextChangeReason.ProgrammaticChange; } - OnTextChanged(changeReason, TextBox.Text); + OnTextChanged(changeReason, TextBox!.Text); - SuggestionsList.SetCurrentValue(Selector.SelectedItemProperty, null); + SuggestionsList!.SetCurrentValue(Selector.SelectedItemProperty, null); if (changeReason is not AutoSuggestionBoxTextChangeReason.UserInput) { @@ -509,12 +482,12 @@ private void SuggestionsListOnPreviewKeyDown(object sender, KeyEventArgs e) SetCurrentValue(IsSuggestionListOpenProperty, false); - OnSelectedChanged(SuggestionsList.SelectedItem); + OnSelectedChanged(SuggestionsList!.SelectedItem); } private void SuggestionsListOnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { - if (SuggestionsList.SelectedItem is not null) + if (SuggestionsList!.SelectedItem is not null) { return; } @@ -529,7 +502,7 @@ private void SuggestionsListOnPreviewMouseLeftButtonUp(object sender, MouseButto private void SuggestionsListOnSelectionChanged(object sender, SelectionChangedEventArgs e) { - if (SuggestionsList.SelectedItem is null) + if (SuggestionsList!.SelectedItem is null) { return; } @@ -565,61 +538,45 @@ private void UpdateTexBoxTextAfterSelection(object selectedObj) { _changingTextAfterSuggestionChosen = true; - TextBox.SetCurrentValue(System.Windows.Controls.TextBox.TextProperty, GetStringFromObj(selectedObj)); + TextBox!.SetCurrentValue(System.Windows.Controls.TextBox.TextProperty, GetStringFromObj(selectedObj)); _changingTextAfterSuggestionChosen = false; } private void DefaultFiltering(string text) { - if (String.IsNullOrEmpty(text)) + if (string.IsNullOrEmpty(text)) { SetCurrentValue(ItemsSourceProperty, OriginalItemsSource); - return; } - var suitableItems = new List(); - var splitText = text.ToLower().Split(' '); - - for (var i = 0; i < OriginalItemsSource.Count; i++) - { - var item = OriginalItemsSource[i]; - var itemText = GetStringFromObj(item); - - var found = splitText.All(key => itemText.ToLower().Contains(key)); - - if (found) + var splitText = text.Split(' '); + var suitableItems = OriginalItemsSource + .Cast() + .Where(item => { - suitableItems.Add(item); - } - } + var itemText = GetStringFromObj(item); + return splitText.All(key => itemText?.Contains(key, StringComparison.OrdinalIgnoreCase) ?? false); + }) + .ToList(); SetCurrentValue(ItemsSourceProperty, suitableItems); } private string? GetStringFromObj(object obj) { - var text = String.Empty; - - if (!String.IsNullOrEmpty(DisplayMemberPath)) - { - //Maybe it needs some optimization? - if (obj.GetType().GetProperty(DisplayMemberPath)?.GetValue(obj) is string value) - { - text = value; - } - } - - if (String.IsNullOrEmpty(text)) - { - text = obj as String ?? obj.ToString(); - } + // uses reflection. maybe it needs some optimization? + var displayMemberPathText = + !string.IsNullOrEmpty(DisplayMemberPath) + && obj.GetType().GetProperty(DisplayMemberPath)?.GetValue(obj) is string value + ? value + : null; - return text; + return displayMemberPathText ?? obj as string ?? obj.ToString(); } - private static void TextPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) + private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var self = (AutoSuggestBox)d; var newText = (string)e.NewValue; diff --git a/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.xaml b/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.xaml index 5465b4a70..823a16e18 100644 --- a/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.xaml +++ b/src/Wpf.Ui/Controls/AutoSuggestBox/AutoSuggestBox.xaml @@ -123,7 +123,7 @@ Icon="{TemplateBinding Icon}" IconPlacement="Right" PlaceholderText="{TemplateBinding PlaceholderText}" - Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" /> + Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> /// -//[ToolboxItem(true)] -//[ToolboxBitmap(typeof(Badge), "Badge.bmp")] public class Badge : System.Windows.Controls.ContentControl, IAppearanceControl { - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty AppearanceProperty = DependencyProperty.Register( nameof(Appearance), typeof(Controls.ControlAppearance), diff --git a/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBar.cs b/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBar.cs index cd592e864..d0d701788 100644 --- a/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBar.cs +++ b/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBar.cs @@ -3,8 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -// Based on Windows UI Library -// Copyright(c) Microsoft Corporation.All rights reserved. +/* Based on Windows UI Library + Copyright(c) Microsoft Corporation.All rights reserved. */ using System.Collections.Specialized; using System.Windows.Controls.Primitives; @@ -25,9 +25,7 @@ namespace Wpf.Ui.Controls; [StyleTypedProperty(Property = nameof(ItemContainerStyle), StyleTargetType = typeof(BreadcrumbBarItem))] public class BreadcrumbBar : System.Windows.Controls.ItemsControl { - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty CommandProperty = DependencyProperty.Register( nameof(Command), typeof(ICommand), @@ -35,9 +33,7 @@ public class BreadcrumbBar : System.Windows.Controls.ItemsControl new PropertyMetadata(null) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty TemplateButtonCommandProperty = DependencyProperty.Register( nameof(TemplateButtonCommand), typeof(IRelayCommand), @@ -50,10 +46,8 @@ public class BreadcrumbBar : System.Windows.Controls.ItemsControl /// public IRelayCommand TemplateButtonCommand => (IRelayCommand)GetValue(TemplateButtonCommandProperty); - /// - /// Property for . - /// - public static readonly RoutedEvent ItemClickedRoutedEvent = EventManager.RegisterRoutedEvent( + /// Identifies the routed event. + public static readonly RoutedEvent ItemClickedEvent = EventManager.RegisterRoutedEvent( nameof(ItemClicked), RoutingStrategy.Bubble, typeof(TypedEventHandler), @@ -66,9 +60,9 @@ public class BreadcrumbBar : System.Windows.Controls.ItemsControl [Bindable(true)] [Category("Action")] [Localizability(LocalizationCategory.NeverLocalize)] - public ICommand Command + public ICommand? Command { - get => (ICommand)GetValue(CommandProperty); + get => (ICommand?)GetValue(CommandProperty); set => SetValue(CommandProperty, value); } @@ -77,8 +71,8 @@ public ICommand Command /// public event TypedEventHandler ItemClicked { - add => AddHandler(ItemClickedRoutedEvent, value); - remove => RemoveHandler(ItemClickedRoutedEvent, value); + add => AddHandler(ItemClickedEvent, value); + remove => RemoveHandler(ItemClickedEvent, value); } /// @@ -94,7 +88,7 @@ public BreadcrumbBar() protected virtual void OnItemClicked(object item, int index) { - var args = new BreadcrumbBarItemClickedEventArgs(ItemClickedRoutedEvent, this, item, index); + var args = new BreadcrumbBarItemClickedEventArgs(ItemClickedEvent, this, item, index); RaiseEvent(args); if (Command?.CanExecute(item) ?? false) @@ -149,7 +143,10 @@ private void ItemContainerGeneratorOnStatusChanged(object? sender, EventArgs e) return; } - InteractWithItemContainer(2, static item => item.IsLast = false); + InteractWithItemContainer( + 2, + static item => item.SetCurrentValue(BreadcrumbBarItem.IsLastProperty, false) + ); UpdateLastContainer(); } @@ -179,7 +176,9 @@ private void OnTemplateButtonClick(object? obj) private void InteractWithItemContainer(int offsetFromEnd, Action action) { if (ItemContainerGenerator.Items.Count <= 0) + { return; + } var item = ItemContainerGenerator.Items[^offsetFromEnd]; var container = (BreadcrumbBarItem)ItemContainerGenerator.ContainerFromItem(item); @@ -187,5 +186,9 @@ private void InteractWithItemContainer(int offsetFromEnd, Action InteractWithItemContainer(1, static item => item.IsLast = true); + private void UpdateLastContainer() => + InteractWithItemContainer( + 1, + static item => item.SetCurrentValue(BreadcrumbBarItem.IsLastProperty, true) + ); } diff --git a/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBarItem.cs b/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBarItem.cs index d81c8059a..442354e00 100644 --- a/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBarItem.cs +++ b/src/Wpf.Ui/Controls/BreadcrumbBar/BreadcrumbBarItem.cs @@ -3,10 +3,9 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -// Based on Windows UI Library -// Copyright(c) Microsoft Corporation.All rights reserved. +/* Based on Windows UI Library */ + -using Wpf.Ui.Converters; // ReSharper disable once CheckNamespace namespace Wpf.Ui.Controls; @@ -16,19 +15,15 @@ namespace Wpf.Ui.Controls; /// public class BreadcrumbBarItem : System.Windows.Controls.ContentControl { - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty IconProperty = DependencyProperty.Register( nameof(Icon), typeof(IconElement), typeof(BreadcrumbBarItem), - new PropertyMetadata(null, null, IconSourceElementConverter.ConvertToIconElement) + new PropertyMetadata(null, null, IconElement.Coerce) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty IconMarginProperty = DependencyProperty.Register( nameof(IconMargin), typeof(Thickness), @@ -36,9 +31,7 @@ public class BreadcrumbBarItem : System.Windows.Controls.ContentControl new PropertyMetadata(new Thickness(0)) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty IsLastProperty = DependencyProperty.Register( nameof(IsLast), typeof(bool), @@ -51,12 +44,12 @@ public class BreadcrumbBarItem : System.Windows.Controls.ContentControl /// public IconElement? Icon { - get => (IconElement)GetValue(IconProperty); + get => (IconElement?)GetValue(IconProperty); set => SetValue(IconProperty, value); } /// - /// Get or sets margin for the + /// Gets or sets get or sets margin for the /// public Thickness IconMargin { @@ -65,7 +58,7 @@ public Thickness IconMargin } /// - /// Whether the current item is the last one. + /// Gets or sets a value indicating whether the current item is the last one. /// public bool IsLast { diff --git a/src/Wpf.Ui/Controls/Button/Button.cs b/src/Wpf.Ui/Controls/Button/Button.cs index 8da7aab40..fd14c98fa 100644 --- a/src/Wpf.Ui/Controls/Button/Button.cs +++ b/src/Wpf.Ui/Controls/Button/Button.cs @@ -4,7 +4,6 @@ // All Rights Reserved. using System.Windows.Controls; -using Wpf.Ui.Converters; // ReSharper disable once CheckNamespace namespace Wpf.Ui.Controls; @@ -31,19 +30,15 @@ namespace Wpf.Ui.Controls; /// public class Button : System.Windows.Controls.Button, IAppearanceControl, IIconControl { - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty IconProperty = DependencyProperty.Register( nameof(Icon), typeof(IconElement), typeof(Button), - new PropertyMetadata(null, null, IconSourceElementConverter.ConvertToIconElement) + new PropertyMetadata(null, null, IconElement.Coerce) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty AppearanceProperty = DependencyProperty.Register( nameof(Appearance), typeof(ControlAppearance), @@ -51,9 +46,7 @@ public class Button : System.Windows.Controls.Button, IAppearanceControl, IIconC new PropertyMetadata(ControlAppearance.Primary) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty MouseOverBackgroundProperty = DependencyProperty.Register( nameof(MouseOverBackground), typeof(Brush), @@ -61,9 +54,7 @@ public class Button : System.Windows.Controls.Button, IAppearanceControl, IIconC new PropertyMetadata(Border.BackgroundProperty.DefaultMetadata.DefaultValue) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty MouseOverBorderBrushProperty = DependencyProperty.Register( nameof(MouseOverBorderBrush), typeof(Brush), @@ -71,9 +62,7 @@ public class Button : System.Windows.Controls.Button, IAppearanceControl, IIconC new PropertyMetadata(Border.BorderBrushProperty.DefaultMetadata.DefaultValue) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty PressedForegroundProperty = DependencyProperty.Register( nameof(PressedForeground), typeof(Brush), @@ -84,9 +73,7 @@ public class Button : System.Windows.Controls.Button, IAppearanceControl, IIconC ) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty PressedBackgroundProperty = DependencyProperty.Register( nameof(PressedBackground), typeof(Brush), @@ -94,9 +81,7 @@ public class Button : System.Windows.Controls.Button, IAppearanceControl, IIconC new PropertyMetadata(Border.BackgroundProperty.DefaultMetadata.DefaultValue) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty PressedBorderBrushProperty = DependencyProperty.Register( nameof(PressedBorderBrush), typeof(Brush), @@ -104,33 +89,31 @@ public class Button : System.Windows.Controls.Button, IAppearanceControl, IIconC new PropertyMetadata(Border.BorderBrushProperty.DefaultMetadata.DefaultValue) ); - /// - /// Property for . - /// + /// Identifies the dependency property. public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.Register( nameof(CornerRadius), typeof(CornerRadius), typeof(Button), - (PropertyMetadata) - new FrameworkPropertyMetadata( - (object)new CornerRadius(), - FrameworkPropertyMetadataOptions.AffectsMeasure - | FrameworkPropertyMetadataOptions.AffectsRender - ) + new FrameworkPropertyMetadata( + default(CornerRadius), + FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender + ) ); /// /// Gets or sets displayed . /// - [Bindable(true), Category("Appearance")] + [Bindable(true)] + [Category("Appearance")] public IconElement? Icon { - get => (IconElement)GetValue(IconProperty); + get => (IconElement?)GetValue(IconProperty); set => SetValue(IconProperty, value); } /// - [Bindable(true), Category("Appearance")] + [Bindable(true)] + [Category("Appearance")] public ControlAppearance Appearance { get => (ControlAppearance)GetValue(AppearanceProperty); @@ -138,9 +121,10 @@ public ControlAppearance Appearance } /// - /// Background when the user interacts with an element with a pointing device. + /// Gets or sets background . /// - [Bindable(true), Category("Appearance")] + [Bindable(true)] + [Category("Appearance")] public Brush MouseOverBackground { get => (Brush)GetValue(MouseOverBackgroundProperty); @@ -148,9 +132,10 @@ public Brush MouseOverBackground } /// - /// Border when the user interacts with an element with a pointing device. + /// Gets or sets border when the user mouses over the button. /// - [Bindable(true), Category("Appearance")] + [Bindable(true)] + [Category("Appearance")] public Brush MouseOverBorderBrush { get => (Brush)GetValue(MouseOverBorderBrushProperty); @@ -158,9 +143,10 @@ public Brush MouseOverBorderBrush } /// - /// Foreground when pressed. + /// Gets or sets the foreground when the user clicks the button. /// - [Bindable(true), Category("Appearance")] + [Bindable(true)] + [Category("Appearance")] public Brush PressedForeground { get => (Brush)GetValue(PressedForegroundProperty); @@ -168,9 +154,10 @@ public Brush PressedForeground } /// - /// Background when the user clicks the button. + /// Gets or sets background when the user clicks the button. /// - [Bindable(true), Category("Appearance")] + [Bindable(true)] + [Category("Appearance")] public Brush PressedBackground { get => (Brush)GetValue(PressedBackgroundProperty); @@ -178,9 +165,10 @@ public Brush PressedBackground } /// - /// Border when the user clicks the button. + /// Gets or sets border when the user clicks the button. /// - [Bindable(true), Category("Appearance")] + [Bindable(true)] + [Category("Appearance")] public Brush PressedBorderBrush { get => (Brush)GetValue(PressedBorderBrushProperty); diff --git a/src/Wpf.Ui/Controls/Button/Button.xaml b/src/Wpf.Ui/Controls/Button/Button.xaml index 7214b0114..917df73e0 100644 --- a/src/Wpf.Ui/Controls/Button/Button.xaml +++ b/src/Wpf.Ui/Controls/Button/Button.xaml @@ -17,6 +17,78 @@ 1 0,0,8,0 + + + - - - - - - - #FFFF0000 + - 11,5,11,6 - 1 - 8,0,0,0 - 14 - 22 - 22 + - + + + + + +