From 44127f9027a4aa0af8d82abd79f2aed4b8bf910d Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sat, 2 May 2026 18:25:21 +0200 Subject: [PATCH 1/9] Update migration docs and redirects for Photino changes - Renamed `breaking-changes-from-photino` to `photino-breaking-changes` - Added a new `photino-backlog` migration page - Updated Docusaurus redirects, sidebars, README, and intro links for consistency - Disabled `respectPrefersColorScheme` in Docusaurus config --- README.md | 2 +- docs/docs/intro.md | 2 +- docs/docs/migration/photino-backlog.md | 46 +++++++++++++++++++ ...photino.md => photino-breaking-changes.md} | 0 docs/docusaurus.config.ts | 8 ++-- docs/sidebars.ts | 3 +- 6 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 docs/docs/migration/photino-backlog.md rename docs/docs/migration/{breaking-changes-from-photino.md => photino-breaking-changes.md} (100%) diff --git a/README.md b/README.md index 850aa0a2f..a91d9b358 100644 --- a/README.md +++ b/README.md @@ -178,7 +178,7 @@ dotnet tool run infiniframe-pack publish src/MyApp/MyApp.csproj --rid win-x64 ### Migration -- [Breaking Changes vs Photino.NET](https://docs.infiniframe.dev/migration/breaking-changes-from-photino) — +- [Breaking Changes vs Photino.NET](https://docs.infiniframe.dev/migration/photino-breaking-changes) — API, namespace, event system, and behavioral differences from the original Photino projects ### Build Docs Locally diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 14a4f5a7a..7a259f7d2 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -11,5 +11,5 @@ InfiniFrame documentation is organized into Guides, Concepts, and API references - [Guides](guides/getting-started.md) - [Scripts Reference](guides/scripts.md) - [Packaging Tool Guide](guides/pack-tool.md) -- [Migration Notes](migration/breaking-changes-from-photino.md) +- [Migration Notes](migration/photino-breaking-changes.md) - [API References](api.md) diff --git a/docs/docs/migration/photino-backlog.md b/docs/docs/migration/photino-backlog.md new file mode 100644 index 000000000..7efb0d3aa --- /dev/null +++ b/docs/docs/migration/photino-backlog.md @@ -0,0 +1,46 @@ +--- +title: Unimplemented / Pending Photino Features +description: Overview of features and issues across Photino repositories that are not yet fully implemented or still under discussion. +--- + +# Photino Feature Status Overview + +This page tracks features and issues mentioned across the Photino ecosystem that are not yet fully implemented or still under discussion in their respective libraries. + +**Table Legend** +- ✅ : Implemented +- 🚧 : Under construction +- ❓ : Under discussion / unclear if should be handled natively +- ❌ : Rejected for native implementation + +--- + +## Photino.Blazor + +| Feature | Repository & Issue Reference | Status | +|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------| +| Intercept `` navigation | [photino.Blazor#111](https://github.com/tryphotino/photino.Blazor/issues/111) | ✅ (no PR) | +| Proper disposal of services | [photino.Blazor#149](https://github.com/tryphotino/photino.Blazor/issues/149) | ✅ (no PR) | +| Usage of `wwwroot` | [photino.Blazor#152](https://github.com/tryphotino/photino.Blazor/issues/152) | ✅ (no PR) | +| .NET 10 support | [photino.Blazor#164](https://github.com/tryphotino/photino.Blazor/pull/164), [photino.Blazor#165](https://github.com/tryphotino/photino.Blazor/pull/165) | ✅ (handled via rework, no PR) | + +--- + +## Photino.Native + +| Feature | Repository & Issue Reference | Status | +|-----------------------------------|-------------------------------------------------------------------------------|--------| +| Ability to `.Focus()` on a window | [photino.Native#158](https://github.com/tryphotino/photino.Native/issues/158) | ✅ #42 | +| Fix memory leak | [photino.Native#165](https://github.com/tryphotino/photino.Native/issues/165) | ✅ #68 | + +--- + +## Photino.NET + +| Feature | Repository & Issue Reference | Status | +|------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| +| `ILogger` implementation | [photino.NET#257](https://github.com/tryphotino/photino.NET/issues/257) | ✅ (no PR) | +| Ability to reference fixed WebView2 runtime | [photino.NET#254](https://github.com/tryphotino/photino.NET/issues/254) | ❓ | +| Arbitrary JavaScript injection into WebView | [photino.NET#58](https://github.com/tryphotino/photino.NET/issues/58), [photino.NET#192](https://github.com/tryphotino/photino.NET/issues/192), [photino.NET#268](https://github.com/tryphotino/photino.NET/issues/268) | ❓ | +| Proper parent vs child window behavior | [photino.NET#269](https://github.com/tryphotino/photino.NET/issues/269) | ❓ | +| `SetIconFile` segfaults on Linux with relative paths | [photino.NET#272](https://github.com/tryphotino/photino.NET/issues/272) | ✅ #165 | diff --git a/docs/docs/migration/breaking-changes-from-photino.md b/docs/docs/migration/photino-breaking-changes.md similarity index 100% rename from docs/docs/migration/breaking-changes-from-photino.md rename to docs/docs/migration/photino-breaking-changes.md diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 2996ef6fb..aaf8023cb 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -47,7 +47,7 @@ const config: Config = { redirects: [ { from: ["/index.html"], to: "/" }, { from: ["/articles/guides"], to: "/guides/getting-started" }, - { from: ["/articles/concepts"], to: "/migration/breaking-changes-from-photino" }, + { from: ["/articles/concepts"], to: "/migration/photino-breaking-changes" }, { from: ["/articles/csharp"], to: "/csharp/code-style" }, { from: ["/articles/cpp"], to: "/cpp/native-cpp-api" }, { from: ["/articles/guides/getting-started", "/articles/guides/getting-started.html"], to: "/guides/getting-started" }, @@ -57,8 +57,8 @@ const config: Config = { { from: ["/articles/guides/web-server", "/articles/guides/web-server.html"], to: "/guides/web-server" }, { from: ["/articles/guides/javascript-interop", "/articles/guides/javascript-interop.html"], to: "/guides/javascript-interop" }, { from: ["/articles/guides/custom-window-chrome", "/articles/guides/custom-window-chrome.html"], to: "/guides/custom-window-chrome" }, - { from: ["/articles/concepts/breaking-changes-from-photino", "/articles/concepts/breaking-changes-from-photino.html"], to: "/migration/breaking-changes-from-photino" }, - { from: ["/concepts/breaking-changes-from-photino"], to: "/migration/breaking-changes-from-photino" }, + { from: ["/articles/concepts/photino-breaking-changes", "/articles/concepts/photino-breaking-changes.html"], to: "/migration/photino-breaking-changes" }, + { from: ["/concepts/photino-breaking-changes"], to: "/migration/photino-breaking-changes" }, { from: ["/articles/csharp/code-style", "/articles/csharp/code-style.html"], to: "/csharp/code-style" }, { from: ["/articles/cpp/native-cpp-api", "/articles/cpp/native-cpp-api.html"], to: "/cpp/native-cpp-api" }, { from: ["/articles/cpp/code-style", "/articles/cpp/code-style.html"], to: "/cpp/code-style" }, @@ -71,7 +71,7 @@ const config: Config = { colorMode: { defaultMode: 'dark', disableSwitch: false, - respectPrefersColorScheme: true, + respectPrefersColorScheme: false, }, navbar: { title: "InfiniFrame", diff --git a/docs/sidebars.ts b/docs/sidebars.ts index 45abdc59c..b471196e6 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -38,7 +38,8 @@ const sidebars: SidebarsConfig = { type: "category", label: "Migration", items: [ - "migration/breaking-changes-from-photino", + "migration/photino-breaking-changes", + "migration/photino-backlog" ], }, ], From 65614cae6169d837d1b3e948cfd865385a285909 Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sat, 2 May 2026 19:17:51 +0200 Subject: [PATCH 2/9] Update Photino migration backlog to include new features, issues, and status alignment across modules --- docs/docs/migration/photino-backlog.md | 66 +++++++++++++++++++------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/docs/docs/migration/photino-backlog.md b/docs/docs/migration/photino-backlog.md index 7efb0d3aa..05a68a2ad 100644 --- a/docs/docs/migration/photino-backlog.md +++ b/docs/docs/migration/photino-backlog.md @@ -17,30 +17,62 @@ This page tracks features and issues mentioned across the Photino ecosystem that ## Photino.Blazor -| Feature | Repository & Issue Reference | Status | -|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------| -| Intercept `` navigation | [photino.Blazor#111](https://github.com/tryphotino/photino.Blazor/issues/111) | ✅ (no PR) | -| Proper disposal of services | [photino.Blazor#149](https://github.com/tryphotino/photino.Blazor/issues/149) | ✅ (no PR) | -| Usage of `wwwroot` | [photino.Blazor#152](https://github.com/tryphotino/photino.Blazor/issues/152) | ✅ (no PR) | -| .NET 10 support | [photino.Blazor#164](https://github.com/tryphotino/photino.Blazor/pull/164), [photino.Blazor#165](https://github.com/tryphotino/photino.Blazor/pull/165) | ✅ (handled via rework, no PR) | +| Status | Feature | Links | InfiniFrame PR | +|:-------|:--------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------| +| ✅ | Intercept `` navigation | [photino.Blazor#111](https://github.com/tryphotino/photino.Blazor/issues/111) | | +| ✅ | Proper disposal of services | [photino.Blazor#149](https://github.com/tryphotino/photino.Blazor/issues/149) | | +| ✅ | Usage of `wwwroot` | [photino.Blazor#152](https://github.com/tryphotino/photino.Blazor/issues/152) | | +| ✅ | .NET 10 support | [photino.Blazor#164](https://github.com/tryphotino/photino.Blazor/pull/164), [photino.Blazor#165](https://github.com/tryphotino/photino.Blazor/pull/165) | | --- ## Photino.Native -| Feature | Repository & Issue Reference | Status | -|-----------------------------------|-------------------------------------------------------------------------------|--------| -| Ability to `.Focus()` on a window | [photino.Native#158](https://github.com/tryphotino/photino.Native/issues/158) | ✅ #42 | -| Fix memory leak | [photino.Native#165](https://github.com/tryphotino/photino.Native/issues/165) | ✅ #68 | +| Status | Feature | Links | InfiniFrame PR | +|:-------|:----------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------| +| ❓ | Add Window Management | [Photino.Native#27](https://github.com/tryphotino/photino.Native/issues/27) | | +| ❓ | Native Menu Support | [Photino.Native#44](https://github.com/tryphotino/photino.Native/issues/44) | | +| ❓ | dedicated scheme for logging from UI to host app | [Photino.Native#45](https://github.com/tryphotino/photino.Native/issues/45) | | +| ❌ | Windows x86 | [Photino.Native#53](https://github.com/tryphotino/photino.Native/issues/53) | | +| ❓ | RegisterWindowClosingHandler not working on linux (Debian) | [Photino.Native#75](https://github.com/tryphotino/photino.Native/issues/75) | | +| ❓ | Add SingleInstanceMode to Photino initialization | [Photino.Native#111](https://github.com/tryphotino/photino.Native/issues/111) | | +| ❓ | Android Support | [Photino.Native#115](https://github.com/tryphotino/photino.Native/issues/115) | | +| ❓ | Stack overflow. at Photino.NET.PhotinoWindow.Photino_WaitForExit(IntPtr) | [Photino.Native#141](https://github.com/tryphotino/photino.Native/issues/141) | | +| ❓ | Drag and Drop functionality doesnt work on Linux | [Photino.Native#152](https://github.com/tryphotino/photino.Native/issues/152) | | +| ❓ | Zooming and Scaling issues | [Photino.Native#153](https://github.com/tryphotino/photino.Native/issues/153) | | +| ✅ | `.Focus()` on window | [Photino.Native#158](https://github.com/tryphotino/photino.Native/issues/158) [Photino.Native#169](https://github.com/tryphotino/photino.Native/pull/169) | [InfiniFrame#42(https://github.com/InfiniLore/InfiniFrame/pull/42) | +| ❓ | nullptr reference crash in IsColorSchemeChange | [Photino.Native#162](https://github.com/tryphotino/photino.Native/pull/162) | | +| ❓ | SetWebView2RuntimePath UTF encoding issue after Photino.NET encoding update | [Photino.Native#163](https://github.com/tryphotino/photino.Native/pull/163) | | +| ✅ | Fix memory leak | [Photino.Native#165](https://github.com/tryphotino/photino.Native/issues/165) | [InfiniFrame#68](https://github.com/InfiniLore/InfiniFrame/pull/68) | +| ❓ | Add complex notifications | [Photino.Native#166](https://github.com/tryphotino/photino.Native/pull/166) | | +| ❓ | Add functions for dragging and resizing windows | [Photino.Native#167](https://github.com/tryphotino/photino.Native/pull/167) | | +| ❓ | Feature/taskbar flash progress | [Photino.Native#168](https://github.com/tryphotino/photino.Native/pull/168) | | +| ❓ | Memory and stability issues in long running Windows application | [Photino.Native#171](https://github.com/tryphotino/photino.Native/issues/171) | | +| ✅ | Custom scheme handlers broken on Windows | [Photino.Native#173](https://github.com/tryphotino/photino.Native/issues/173) [Photino.Native#174](https://github.com/tryphotino/photino.Native/pull/174) | | +| ✅ | SetTopmost/GetTopmost: incorrect style register on Windows | [Photino.Native#175](https://github.com/tryphotino/photino.Native/issues/175) [Photino.Native#176](https://github.com/tryphotino/photino.Native/pull/176) | [InfiniFrame#159(https://github.com/InfiniLore/InfiniFrame/pull/159) | --- ## Photino.NET -| Feature | Repository & Issue Reference | Status | -|------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| `ILogger` implementation | [photino.NET#257](https://github.com/tryphotino/photino.NET/issues/257) | ✅ (no PR) | -| Ability to reference fixed WebView2 runtime | [photino.NET#254](https://github.com/tryphotino/photino.NET/issues/254) | ❓ | -| Arbitrary JavaScript injection into WebView | [photino.NET#58](https://github.com/tryphotino/photino.NET/issues/58), [photino.NET#192](https://github.com/tryphotino/photino.NET/issues/192), [photino.NET#268](https://github.com/tryphotino/photino.NET/issues/268) | ❓ | -| Proper parent vs child window behavior | [photino.NET#269](https://github.com/tryphotino/photino.NET/issues/269) | ❓ | -| `SetIconFile` segfaults on Linux with relative paths | [photino.NET#272](https://github.com/tryphotino/photino.NET/issues/272) | ✅ #165 | +| Status | Feature | Links | InfiniFrame PR | +|:-------|:------------------------------------------------------------|:------------------------------------------------------------------------|:----------------------------------------------------------------------| +| ✅ | Problem with "insecure origins" | [Photino.NET#25](https://github.com/tryphotino/photino.NET/issues/25) | | +| ❓ | JS injection into WebView | [Photino.NET#58](https://github.com/tryphotino/photino.NET/issues/58) | | +| ❓ | Creating a 2nd PhotinoWindow after closing all others fails | [Photino.NET#59](https://github.com/tryphotino/photino.NET/issues/59) | | +| ❓ | Is there a way to bypass WebKits SSL check? | [Photino.NET#65](https://github.com/tryphotino/photino.NET/issues/65) | | +| ❓ | make window transparent | [Photino.NET#73(https://github.com/tryphotino/photino.NET/issues/73) | | +| ❓ | Javascript debugging | [Photino.NET#75](https://github.com/tryphotino/photino.NET/issues/75) | | +| ❓ | Chromeless Window | [Photino.NET#80](https://github.com/tryphotino/photino.NET/issues/80) | | +| ✅ | `ILogger` implementation | [Photino.NET#257](https://github.com/tryphotino/photino.NET/issues/257) | | +| ❓ | Fixed WebView2 runtime | [Photino.NET#254](https://github.com/tryphotino/photino.NET/issues/254) | | +| ❓ | Parent vs child window behavior | [Photino.NET#269](https://github.com/tryphotino/photino.NET/issues/269) | | +| ✅ | SetIconFile Linux crash | [Photino.NET#272](https://github.com/tryphotino/photino.NET/issues/272) | [InfiniFrame#165](https://github.com/InfiniLore/InfiniFrame/pull/165) | + +--- + +## Photino.NET.Server + +| Status | Feature | Links | InfiniFrame PR | +|:-------|:--------|:------|:---------------| +| | | | | \ No newline at end of file From d38f8a87a26bcb11512646efb2d54e06d12bd4ca Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sun, 3 May 2026 00:57:28 +0200 Subject: [PATCH 3/9] Update Photino migration backlog with additional features, issues, and status refinements across modules --- docs/docs/migration/photino-backlog.md | 123 ++++++++++++++++--------- 1 file changed, 79 insertions(+), 44 deletions(-) diff --git a/docs/docs/migration/photino-backlog.md b/docs/docs/migration/photino-backlog.md index 05a68a2ad..c90e7e9da 100644 --- a/docs/docs/migration/photino-backlog.md +++ b/docs/docs/migration/photino-backlog.md @@ -17,62 +17,97 @@ This page tracks features and issues mentioned across the Photino ecosystem that ## Photino.Blazor -| Status | Feature | Links | InfiniFrame PR | -|:-------|:--------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------| -| ✅ | Intercept `` navigation | [photino.Blazor#111](https://github.com/tryphotino/photino.Blazor/issues/111) | | -| ✅ | Proper disposal of services | [photino.Blazor#149](https://github.com/tryphotino/photino.Blazor/issues/149) | | -| ✅ | Usage of `wwwroot` | [photino.Blazor#152](https://github.com/tryphotino/photino.Blazor/issues/152) | | -| ✅ | .NET 10 support | [photino.Blazor#164](https://github.com/tryphotino/photino.Blazor/pull/164), [photino.Blazor#165](https://github.com/tryphotino/photino.Blazor/pull/165) | | +| Status | Feature | Links | InfiniFrame PR | +|:-------|:---------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------| +| ✅ | Need to call UseServiceProviderFactory | [photino.Blazor#83](https://github.com/tryphotino/photino.Blazor/issues/83) | | +| ✅ | Intercept `` navigation | [photino.Blazor#111](https://github.com/tryphotino/photino.Blazor/issues/111) | | +| ❓ | Does not work on wayland? | [photino.Blazor#138](https://github.com/tryphotino/photino.Blazor/issues/138) | | +| ✅ | Cannot publish nativeaot sample | [photino.Blazor#143](https://github.com/tryphotino/photino.Blazor/issues/143) | | +| ❓ | Set a splash screen | [photino.Blazor#144](https://github.com/tryphotino/photino.Blazor/issues/144) | | +| ✅ | Single File Publish - Embed MudBlazor's .\wwwroot\_content directory | [photino.Blazor#147](https://github.com/tryphotino/photino.Blazor/issues/147) | | +| ✅ | Proper disposal of services | [photino.Blazor#149](https://github.com/tryphotino/photino.Blazor/issues/149) | | +| ✅ | Sharing of `wwwroot` | [photino.Blazor#152](https://github.com/tryphotino/photino.Blazor/issues/152) | | +| ❓ | Ability to disable the url hover status indicator | [photino.Blazor#156](https://github.com/tryphotino/photino.Blazor/issues/156) | | +| ✅ | Services are not Disposed After App Shutdown | [photino.Blazor#158](https://github.com/tryphotino/photino.Blazor/issues/158) | | +| ❓ | Set icon in the taskbar on windows 11 | [photino.Blazor#161](https://github.com/tryphotino/photino.Blazor/issues/161) | | +| ✅ | .NET 10 support | [photino.Blazor#164](https://github.com/tryphotino/photino.Blazor/issues/164), [photino.Blazor#165](https://github.com/tryphotino/photino.Blazor/pull/165) | | +| ❓ | Fix handling of app:// URLs containing a #fragment | [photino.Blazor#166](https://github.com/tryphotino/photino.Blazor/pull/166) | | +| ❓ | Top Empty window caption appear in SetChromeless(true) | [photino.Blazor#167](https://github.com/tryphotino/photino.Blazor/issues/167) | | --- ## Photino.Native -| Status | Feature | Links | InfiniFrame PR | -|:-------|:----------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------| -| ❓ | Add Window Management | [Photino.Native#27](https://github.com/tryphotino/photino.Native/issues/27) | | -| ❓ | Native Menu Support | [Photino.Native#44](https://github.com/tryphotino/photino.Native/issues/44) | | -| ❓ | dedicated scheme for logging from UI to host app | [Photino.Native#45](https://github.com/tryphotino/photino.Native/issues/45) | | -| ❌ | Windows x86 | [Photino.Native#53](https://github.com/tryphotino/photino.Native/issues/53) | | -| ❓ | RegisterWindowClosingHandler not working on linux (Debian) | [Photino.Native#75](https://github.com/tryphotino/photino.Native/issues/75) | | -| ❓ | Add SingleInstanceMode to Photino initialization | [Photino.Native#111](https://github.com/tryphotino/photino.Native/issues/111) | | -| ❓ | Android Support | [Photino.Native#115](https://github.com/tryphotino/photino.Native/issues/115) | | -| ❓ | Stack overflow. at Photino.NET.PhotinoWindow.Photino_WaitForExit(IntPtr) | [Photino.Native#141](https://github.com/tryphotino/photino.Native/issues/141) | | -| ❓ | Drag and Drop functionality doesnt work on Linux | [Photino.Native#152](https://github.com/tryphotino/photino.Native/issues/152) | | -| ❓ | Zooming and Scaling issues | [Photino.Native#153](https://github.com/tryphotino/photino.Native/issues/153) | | -| ✅ | `.Focus()` on window | [Photino.Native#158](https://github.com/tryphotino/photino.Native/issues/158) [Photino.Native#169](https://github.com/tryphotino/photino.Native/pull/169) | [InfiniFrame#42(https://github.com/InfiniLore/InfiniFrame/pull/42) | -| ❓ | nullptr reference crash in IsColorSchemeChange | [Photino.Native#162](https://github.com/tryphotino/photino.Native/pull/162) | | -| ❓ | SetWebView2RuntimePath UTF encoding issue after Photino.NET encoding update | [Photino.Native#163](https://github.com/tryphotino/photino.Native/pull/163) | | -| ✅ | Fix memory leak | [Photino.Native#165](https://github.com/tryphotino/photino.Native/issues/165) | [InfiniFrame#68](https://github.com/InfiniLore/InfiniFrame/pull/68) | -| ❓ | Add complex notifications | [Photino.Native#166](https://github.com/tryphotino/photino.Native/pull/166) | | -| ❓ | Add functions for dragging and resizing windows | [Photino.Native#167](https://github.com/tryphotino/photino.Native/pull/167) | | -| ❓ | Feature/taskbar flash progress | [Photino.Native#168](https://github.com/tryphotino/photino.Native/pull/168) | | -| ❓ | Memory and stability issues in long running Windows application | [Photino.Native#171](https://github.com/tryphotino/photino.Native/issues/171) | | -| ✅ | Custom scheme handlers broken on Windows | [Photino.Native#173](https://github.com/tryphotino/photino.Native/issues/173) [Photino.Native#174](https://github.com/tryphotino/photino.Native/pull/174) | | -| ✅ | SetTopmost/GetTopmost: incorrect style register on Windows | [Photino.Native#175](https://github.com/tryphotino/photino.Native/issues/175) [Photino.Native#176](https://github.com/tryphotino/photino.Native/pull/176) | [InfiniFrame#159(https://github.com/InfiniLore/InfiniFrame/pull/159) | +| Status | Feature | Links | InfiniFrame PR | +|:-------|:----------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------| +| ❓ | Add Window Management | [Photino.Native#27](https://github.com/tryphotino/photino.Native/issues/27) | | +| ❓ | Native Menu Support | [Photino.Native#44](https://github.com/tryphotino/photino.Native/issues/44) | | +| ❓ | Dedicated scheme for logging from UI to host app | [Photino.Native#45](https://github.com/tryphotino/photino.Native/issues/45) | | +| ❌ | Windows x86 | [Photino.Native#53](https://github.com/tryphotino/photino.Native/issues/53) | | +| ❓ | RegisterWindowClosingHandler not working on linux (Debian) | [Photino.Native#75](https://github.com/tryphotino/photino.Native/issues/75) | | +| ❓ | Add SingleInstanceMode to Photino initialization | [Photino.Native#111](https://github.com/tryphotino/photino.Native/issues/111) | | +| ❓ | Android Support | [Photino.Native#115](https://github.com/tryphotino/photino.Native/issues/115) | | +| ❓ | Stack overflow. at Photino.NET.PhotinoWindow.Photino_WaitForExit(IntPtr) | [Photino.Native#141](https://github.com/tryphotino/photino.Native/issues/141) | | +| ❓ | Drag and Drop functionality doesnt work on Linux | [Photino.Native#152](https://github.com/tryphotino/photino.Native/issues/152) | | +| ❓ | Zooming and Scaling issues | [Photino.Native#153](https://github.com/tryphotino/photino.Native/issues/153) | | +| ✅ | `.Focus()` on window | [Photino.Native#158](https://github.com/tryphotino/photino.Native/issues/158) [Photino.Native#169](https://github.com/tryphotino/photino.Native/pull/169) | [InfiniFrame#42](https://github.com/InfiniLore/InfiniFrame/pull/42) | +| ❓ | Nullptr reference crash in IsColorSchemeChange | [Photino.Native#162](https://github.com/tryphotino/photino.Native/pull/162) | | +| ❓ | SetWebView2RuntimePath UTF encoding issue after Photino.NET encoding update | [Photino.Native#163](https://github.com/tryphotino/photino.Native/pull/163) | | +| ✅ | Fix memory leak | [Photino.Native#165](https://github.com/tryphotino/photino.Native/issues/165) | [InfiniFrame#68](https://github.com/InfiniLore/InfiniFrame/pull/68) | +| ❓ | Add complex notifications | [Photino.Native#166](https://github.com/tryphotino/photino.Native/pull/166) | | +| ❓ | Add functions for dragging and resizing windows | [Photino.Native#167](https://github.com/tryphotino/photino.Native/pull/167) | | +| ❓ | Feature/taskbar flash progress | [Photino.Native#168](https://github.com/tryphotino/photino.Native/pull/168) | | +| ❓ | Memory and stability issues in long running Windows application | [Photino.Native#171](https://github.com/tryphotino/photino.Native/issues/171) | | +| ✅ | Custom scheme handlers broken on Windows | [Photino.Native#173](https://github.com/tryphotino/photino.Native/issues/173) [Photino.Native#174](https://github.com/tryphotino/photino.Native/pull/174) | | +| ✅ | SetTopmost/GetTopmost: incorrect style register on Windows | [Photino.Native#175](https://github.com/tryphotino/photino.Native/issues/175) [Photino.Native#176](https://github.com/tryphotino/photino.Native/pull/176) | [InfiniFrame#159](https://github.com/InfiniLore/InfiniFrame/pull/159) | --- ## Photino.NET -| Status | Feature | Links | InfiniFrame PR | -|:-------|:------------------------------------------------------------|:------------------------------------------------------------------------|:----------------------------------------------------------------------| -| ✅ | Problem with "insecure origins" | [Photino.NET#25](https://github.com/tryphotino/photino.NET/issues/25) | | -| ❓ | JS injection into WebView | [Photino.NET#58](https://github.com/tryphotino/photino.NET/issues/58) | | -| ❓ | Creating a 2nd PhotinoWindow after closing all others fails | [Photino.NET#59](https://github.com/tryphotino/photino.NET/issues/59) | | -| ❓ | Is there a way to bypass WebKits SSL check? | [Photino.NET#65](https://github.com/tryphotino/photino.NET/issues/65) | | -| ❓ | make window transparent | [Photino.NET#73(https://github.com/tryphotino/photino.NET/issues/73) | | -| ❓ | Javascript debugging | [Photino.NET#75](https://github.com/tryphotino/photino.NET/issues/75) | | -| ❓ | Chromeless Window | [Photino.NET#80](https://github.com/tryphotino/photino.NET/issues/80) | | -| ✅ | `ILogger` implementation | [Photino.NET#257](https://github.com/tryphotino/photino.NET/issues/257) | | -| ❓ | Fixed WebView2 runtime | [Photino.NET#254](https://github.com/tryphotino/photino.NET/issues/254) | | -| ❓ | Parent vs child window behavior | [Photino.NET#269](https://github.com/tryphotino/photino.NET/issues/269) | | -| ✅ | SetIconFile Linux crash | [Photino.NET#272](https://github.com/tryphotino/photino.NET/issues/272) | [InfiniFrame#165](https://github.com/InfiniLore/InfiniFrame/pull/165) | +| Status | Feature | Links | InfiniFrame PR | +|:-------|:----------------------------------------------------------------------------------------------|:------------------------------------------------------------------------|:----------------------------------------------------------------------| +| ✅ | Problem with "insecure origins" | [Photino.NET#25](https://github.com/tryphotino/photino.NET/issues/25) | | +| ❓ | JS injection into WebView | [Photino.NET#58](https://github.com/tryphotino/photino.NET/issues/58) | | +| ❓ | Creating a 2nd PhotinoWindow after closing all others fails | [Photino.NET#59](https://github.com/tryphotino/photino.NET/issues/59) | | +| ❓ | Is there a way to bypass WebKits SSL check? | [Photino.NET#65](https://github.com/tryphotino/photino.NET/issues/65) | | +| ❓ | Make window transparent | [Photino.NET#73](https://github.com/tryphotino/photino.NET/issues/73) | | +| ❓ | Javascript debugging | [Photino.NET#75](https://github.com/tryphotino/photino.NET/issues/75) | | +| ❓ | Chromeless Window | [Photino.NET#80](https://github.com/tryphotino/photino.NET/issues/80) | | +| ❓ | SendWebMessage from WindowCreated handler raises a System.AccessViolationException | [Photino.NET#87](https://github.com/tryphotino/photino.NET/issues/87) | | +| ❓ | Icon failed to load | [Photino.NET#95](https://github.com/tryphotino/photino.NET/issues/95) | | +| ❓ | The application lacks a taskbar Icon | [Photino.NET#106](https://github.com/tryphotino/photino.NET/issues/106) | | +| ❓ | Possibility to hide the window from the taskbar/dock | [Photino.NET#107](https://github.com/tryphotino/photino.NET/issues/107) | | +| ❓ | Make a window only miniable | [Photino.NET#112](https://github.com/tryphotino/photino.NET/issues/112) | | +| ❓ | Interoperability between C # and JavaScript | [Photino.NET#120](https://github.com/tryphotino/photino.NET/issues/120) | | +| ✅ | Window.external is deprecated by browsers | [Photino.NET#124](https://github.com/tryphotino/photino.NET/issues/124) | | +| ❓ | Intercept navigation events | [Photino.NET#139](https://github.com/tryphotino/photino.NET/issues/139) | | +| ❓ | ShowSaveFile How to set the default file name | [Photino.NET#140](https://github.com/tryphotino/photino.NET/issues/140) | | +| ❓ | Running as administrator disables other instances | [Photino.NET#162](https://github.com/tryphotino/photino.NET/issues/162) | | +| ❌ | Mica/Fluent design window for windows | [Photino.NET#167](https://github.com/tryphotino/photino.NET/issues/167) | | +| ❓ | Retrieve current Url of PhotinoWindow | [Photino.NET#197](https://github.com/tryphotino/photino.NET/issues/197) | | +| ✅ | Ctrl+ mouse wheel to zoom the page | [Photino.NET#217](https://github.com/tryphotino/photino.NET/issues/217) | | +| ❓ | RegisterCustomSchemeHandler won't let do fetch and XMLHttpRequest requests | [Photino.NET#232](https://github.com/tryphotino/photino.NET/issues/232) | | +| ❓ | Set the background color of the native window body | [Photino.NET#239](https://github.com/tryphotino/photino.NET/issues/239) | | +| ✅ | Default csproj file uses WinExe but should use Exe so it will properly build on all platforms | [Photino.NET#240](https://github.com/tryphotino/photino.NET/issues/240) | | +| ❓ | Disable browser shortcuts | [Photino.NET#251](https://github.com/tryphotino/photino.NET/issues/251) | | +| ❓ | Fixed WebView2 runtime | [Photino.NET#254](https://github.com/tryphotino/photino.NET/issues/254) | | +| ✅ | `ILogger` implementation | [Photino.NET#257](https://github.com/tryphotino/photino.NET/issues/257) | | +| ❓ | Add complex notifications | [Photino.NET#261](https://github.com/tryphotino/photino.NET/pull/261) | | +| ❓ | Import StartDragging, StartResizing | [Photino.NET#262](https://github.com/tryphotino/photino.NET/pull/262) | | +| ❓ | Bindings for controlling taskbar progress/flash | [Photino.NET#263](https://github.com/tryphotino/photino.NET/pull/263) | | +| ❓ | Allow parent window to be set before initialized | [Photino.NET#264](https://github.com/tryphotino/photino.NET/pull/264) | | +| ❓ | Window header size | [Photino.NET#266](https://github.com/tryphotino/photino.NET/issues/266) | | +| ❓ | Optional window title 31-char-length-limitation on Linux/GTK | [Photino.NET#267](https://github.com/tryphotino/photino.NET/pull/267) | | +| ❓ | Inject Arbitrary Javascript into Webview | [Photino.NET#268](https://github.com/tryphotino/photino.NET/issues/268) | | +| ❓ | Parent vs child window behavior | [Photino.NET#269](https://github.com/tryphotino/photino.NET/issues/269) | | +| ❓ | WindowClosed event | [Photino.NET#271](https://github.com/tryphotino/photino.NET/issues/271) | | +| ✅ | SetIconFile Linux crash | [Photino.NET#272](https://github.com/tryphotino/photino.NET/issues/272) | [InfiniFrame#165](https://github.com/InfiniLore/InfiniFrame/pull/165) | --- ## Photino.NET.Server -| Status | Feature | Links | InfiniFrame PR | -|:-------|:--------|:------|:---------------| -| | | | | \ No newline at end of file +| Status | Feature | Links | InfiniFrame PR | +|:-------|:----------------------------|:----------------------------------------------------------------------------------|:---------------| +| ✅ | Photino Development Server | [Photino.NET.Server#4](https://github.com/tryphotino/photino.NET.Server/issues/4) | | \ No newline at end of file From eada88f17489a60769d6283d08d42b9993cbeb0e Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sun, 3 May 2026 01:04:30 +0200 Subject: [PATCH 4/9] Refine Photino backlog page with improved descriptions and clarified tracking scope. --- docs/docs/migration/photino-backlog.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/docs/migration/photino-backlog.md b/docs/docs/migration/photino-backlog.md index c90e7e9da..d91021239 100644 --- a/docs/docs/migration/photino-backlog.md +++ b/docs/docs/migration/photino-backlog.md @@ -1,11 +1,8 @@ ---- -title: Unimplemented / Pending Photino Features -description: Overview of features and issues across Photino repositories that are not yet fully implemented or still under discussion. ---- - -# Photino Feature Status Overview +# Photino Backlog -This page tracks features and issues mentioned across the Photino ecosystem that are not yet fully implemented or still under discussion in their respective libraries. +This page tracks features and issues mentioned across the Photino ecosystem that are not yet fully implemented or still under discussion in their respective original libraries. +The intent is that eventually, all features will be either implemented or rejected to be brought into InfiniFrame. +This backlog will be used to track any remaining issues or features that need to be addressed. **Table Legend** - ✅ : Implemented From 692bd98815b677eeae7d82ec8df45b112b66ad74 Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sun, 3 May 2026 01:04:36 +0200 Subject: [PATCH 5/9] Clarify and expand descriptions in Photino migration breaking changes document. --- docs/docs/migration/photino-breaking-changes.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/docs/migration/photino-breaking-changes.md b/docs/docs/migration/photino-breaking-changes.md index 4a96dfa7e..203f800e2 100644 --- a/docs/docs/migration/photino-breaking-changes.md +++ b/docs/docs/migration/photino-breaking-changes.md @@ -1,6 +1,8 @@ -# Breaking Changes vs Photino.NET +# Breaking Changes compared to Photino -InfiniFrame is a complete, independent rework of [Photino.NET](https://github.com/tryphotino/photino.NET) and [photino.native](https://github.com/tryphotino/photino.native). It is not a drop-in replacement — this document covers every API, naming, and behavioral difference to assist with migration +InfiniFrame is a complete, independent rework of [Photino.NET](https://github.com/tryphotino/photino.NET) and [Photino.Native](https://github.com/tryphotino/photino.native) and all other libraries within the Photino ecosystem. +It is not a drop-in replacement and some API and general design decisions are different because of that. +This document covers API, naming, and behavioral difference to assist with migration ## Table of Contents From 7d9503b436f4446e07c18d44382e22fbcb1fb0d6 Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sun, 3 May 2026 01:07:43 +0200 Subject: [PATCH 6/9] Chore: Upgrade dependencies in `package-lock.json` to latest versions, including Docusaurus and Algolia packages --- docs/package-lock.json | 952 ++++++++++++++++++++--------------------- docs/package.json | 10 +- 2 files changed, 458 insertions(+), 504 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 64bf24df0..47f7ac880 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,9 +8,9 @@ "name": "infiniframe-docs", "version": "0.1.0", "dependencies": { - "@docusaurus/core": "^3.10.0", - "@docusaurus/plugin-client-redirects": "^3.10.0", - "@docusaurus/preset-classic": "^3.10.0", + "@docusaurus/core": "^3.10.1", + "@docusaurus/plugin-client-redirects": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", "clsx": "^2.1.1", "prism-react-renderer": "^2.4.1", "react": "^19.2.5", @@ -18,8 +18,8 @@ "serialize-javascript": "^7.0.5" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.10.0", - "@docusaurus/types": "^3.10.0", + "@docusaurus/module-type-aliases": "^3.10.1", + "@docusaurus/types": "^3.10.1", "typescript": "^6.0.3" }, "engines": { @@ -27,46 +27,46 @@ } }, "node_modules/@algolia/abtesting": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.16.1.tgz", - "integrity": "sha512-Xxk4l00pYI+jE0PNw8y0MvsQWh5278WRtZQav8/BMMi3HKi2xmeuqe11WJ3y8/6nuBHdv39w76OpJb09TMfAVQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.0.tgz", + "integrity": "sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", + "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", - "@algolia/autocomplete-shared": "1.19.2" + "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", + "@algolia/autocomplete-shared": "1.19.8" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", + "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.19.2" + "@algolia/autocomplete-shared": "1.19.8" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", + "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -74,99 +74,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.50.1.tgz", - "integrity": "sha512-4peZlPXMwTOey9q1rQKMdCnwZb/E95/1e+7KujXpLLSh0FawJzg//U2NM+r4AiJy4+naT2MTBhj0K30yshnVTA==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.0.tgz", + "integrity": "sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.50.1.tgz", - "integrity": "sha512-i+aWHHG8NZvGFHtPeMZkxL2Loc6Fm7iaRo15lYSMx8gFL+at9vgdWxhka7mD1fqxkrxXsQstUBCIsSY8FvkEOw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.0.tgz", + "integrity": "sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.50.1.tgz", - "integrity": "sha512-Hw52Fwapyk/7hMSV/fI4+s3H9MGZEUcRh4VphyXLAk2oLYdndVUkc6KBi0zwHSzwPAr+ZBwFPe2x6naUt9mZGw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.0.tgz", + "integrity": "sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.50.1.tgz", - "integrity": "sha512-Bn/wtwhJ7p1OD/6pY+Zzn+zlu2N/SJnH46md/PAbvqIzmjVuwjNwD4y0vV5Ov8naeukXdd7UU9v550+v8+mtlg==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.0.tgz", + "integrity": "sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.50.1.tgz", - "integrity": "sha512-0V4Tu0RWR8YxkgI9EPVOZHGE4K5pEIhkLNN0CTkP/rnPsqaaSQpNMYW3/mGWdiKOWbX0iVmwLB9QESk3H0jS5g==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.0.tgz", + "integrity": "sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.50.1.tgz", - "integrity": "sha512-jofcWNYMXJDDr87Z2eivlWY6o71Zn7F7aOvQCXSDAo9QTlyf7BhXEsZymLUvF0O1yU9Q9wvrjAWn8uVHYnAvgw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.0.tgz", + "integrity": "sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.50.1.tgz", - "integrity": "sha512-OteRb8WubcmEvU0YlMJwCXs3Q6xrdkb0v50/qZBJP1TF0CvujFZQM++9BjEkTER/Jr9wbPHvjSFKnbMta0b4dQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.0.tgz", + "integrity": "sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" @@ -179,81 +179,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.50.1.tgz", - "integrity": "sha512-0GmfSgDQK6oiIVXnJvGxtNFOfosBspRTR7csCOYCTL1P8QtxX2vDCIKwTM7xdSAEbJaZ43QlWg25q0Qdsndz8Q==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.0.tgz", + "integrity": "sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.50.1.tgz", - "integrity": "sha512-ySuigKEe4YjYV3si8NVk9BHQpFj/1B+ON7DhhvTvbrZJseHQQloxzq0yHwKmznSdlO6C956fx4pcfOKkZClsyg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.0.tgz", + "integrity": "sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.50.1.tgz", - "integrity": "sha512-Cp8T/B0gVmjFlzzp6eP47hwKh5FGyeqQp1N48/ANDdvdiQkPqLyFHQVDwLBH0LddfIPQE+yqmZIgmKc82haF4A==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.0.tgz", + "integrity": "sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.50.1.tgz", - "integrity": "sha512-XKdGGLikfrlK66ZSXh/vWcXZZ8Vg3byDFbJD8pwEvN1FoBRGxhxya476IY2ohoTymLa4qB5LBRlIa+2TLHx3Uw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.0.tgz", + "integrity": "sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1" + "@algolia/client-common": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.50.1.tgz", - "integrity": "sha512-mBAU6WyVsDwhHyGM+nodt1/oebHxgvuLlOAoMGbj/1i6LygDHZWDgL1t5JEs37x9Aywv7ZGhqbM1GsfZ54sU6g==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.0.tgz", + "integrity": "sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1" + "@algolia/client-common": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.50.1.tgz", - "integrity": "sha512-qmo1LXrNKLHvJE6mdQbLnsZAoZvj7VyF2ft4xmbSGWI2WWm87fx/CjUX4kEExt4y0a6T6nEts6ofpUfH5TEE1A==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.0.tgz", + "integrity": "sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.1" + "@algolia/client-common": "5.52.0" }, "engines": { "node": ">= 14.0.0" @@ -274,9 +274,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -375,9 +375,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -385,7 +385,7 @@ "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", + "@babel/traverse": "^7.29.0", "semver": "^6.3.1" }, "engines": { @@ -621,9 +621,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -681,6 +681,22 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz", + "integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", @@ -1748,18 +1764,19 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.3.tgz", + "integrity": "sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.29.0", + "@babel/compat-data": "^7.29.3", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", @@ -3296,9 +3313,9 @@ } }, "node_modules/@docsearch/core": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.2.tgz", - "integrity": "sha512-/S0e6Dj7Zcm8m9Rru49YEX49dhU11be68c+S/BCyN8zQsTTgkKzXlhRbVL5mV6lOLC2+ZRRryaTdcm070Ug2oA==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", + "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", "license": "MIT", "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -3318,20 +3335,20 @@ } }, "node_modules/@docsearch/css": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.2.tgz", - "integrity": "sha512-fH/cn8BjEEdM2nJdjNMHIvOVYupG6AIDtFVDgIZrNzdCSj4KXr9kd+hsehqsNGYjpUjObeKYKvgy/IwCb1jZYQ==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", + "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.2.tgz", - "integrity": "sha512-/BbtGFtqVOGwZx0dw/UfhN/0/DmMQYnulY4iv0tPRhC2JCXv0ka/+izwt3Jzo1ZxXS/2eMvv9zHsBJOK1I9f/w==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz", + "integrity": "sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==", "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.6.2", - "@docsearch/css": "4.6.2" + "@docsearch/core": "4.6.3", + "@docsearch/css": "4.6.3" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -3354,10 +3371,42 @@ } } }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, "node_modules/@docusaurus/babel": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.0.tgz", - "integrity": "sha512-mqCJhCZNZUDg0zgDEaPTM4DnRsisa24HdqTy/qn/MQlbwhTb4WVaZg6ZyX6yIVKqTz8fS1hBMgM+98z+BeJJDg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", + "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3369,8 +3418,8 @@ "@babel/preset-typescript": "^7.25.9", "@babel/runtime": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3380,17 +3429,17 @@ } }, "node_modules/@docusaurus/bundler": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.0.tgz", - "integrity": "sha512-iONUGZGgp+lAkw/cJZH6irONcF4p8+278IsdRlq8lYhxGjkoNUs0w7F4gVXBYSNChq5KG5/JleTSsdJySShxow==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", + "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.10.0", - "@docusaurus/cssnano-preset": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", + "@docusaurus/babel": "3.10.1", + "@docusaurus/cssnano-preset": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", "babel-loader": "^9.2.1", "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", @@ -3408,7 +3457,7 @@ "tslib": "^2.6.0", "url-loader": "^4.1.1", "webpack": "^5.95.0", - "webpackbar": "^6.0.1" + "webpackbar": "^7.0.0" }, "engines": { "node": ">=20.0" @@ -3423,18 +3472,18 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.0.tgz", - "integrity": "sha512-mgLdQsO8xppnQZc3LPi+Mf+PkPeyxJeIx11AXAq/14fsaMefInQiMEZUUmrc7J+956G/f7MwE7tn8KZgi3iRcA==", - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.10.0", - "@docusaurus/bundler": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", + "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.1", + "@docusaurus/bundler": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3504,9 +3553,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.0.tgz", - "integrity": "sha512-qzSshTO1DB3TYW+dPUal5KHM7XPc5YQfzF3Kdb2NDACJUyGbNcFtw3tGkCJlYwhNCRKbZcmwraKUS1i5dcHdGg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", + "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", @@ -3519,9 +3568,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.0.tgz", - "integrity": "sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", + "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3532,14 +3581,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.0.tgz", - "integrity": "sha512-mQQV97080AH4PYNs087l202NMDqRopZA4mg5W76ZZyTFrmWhJ3mHg+8A+drJVENxw5/Q+wHMHLgsx+9z1nEs0A==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", + "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3571,12 +3620,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.0.tgz", - "integrity": "sha512-/1O0Zg8w3DFrYX/I6Fbss7OJrtZw1QoyjDhegiFNHVi9A9Y0gQ3jUAytVxF6ywpAWpLyLxch8nN8H/V3XfzdJQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz", + "integrity": "sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3590,16 +3639,16 @@ } }, "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.0.tgz", - "integrity": "sha512-P+VLoLoZTc74so8+IbsaPZ33/mkf2BWL1CYXQpPRkl0v1QVCN2CgfsZY/8QtbYjQnx2upXUnv45abDhNcSggNw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.1.tgz", + "integrity": "sha512-LHgd+YDvkhfOHMAE6XtUng3DQNzVM765RqVRrMJgHtzAvfopQhY6ieprqjxDVBdv21cLma6I0jHr+YCZH8fL9A==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -3614,19 +3663,19 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.0.tgz", - "integrity": "sha512-RuTz68DhB7CL96QO5UsFbciD7GPYq6QV+YMfF9V0+N4ZgLhJIBgpVAr8GobrKF6NRe5cyWWETU5z5T834piG9g==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz", + "integrity": "sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "cheerio": "1.0.0-rc.12", "combine-promises": "^1.1.0", "feed": "^4.2.2", @@ -3649,20 +3698,20 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.0.tgz", - "integrity": "sha512-9BjHhf15ct8Z7TThTC0xRndKDVvMKmVsAGAN7W9FpNRzfMdScOGcXtLmcCWtJGvAezjOJIm6CxOYCy3Io5+RnQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", + "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -3682,16 +3731,16 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.0.tgz", - "integrity": "sha512-5amX8kEJI+nIGtuLVjYk59Y5utEJ3CHETFOPEE4cooIRLA4xM4iBsA6zFgu4ljcopeYwvBzFEWf5g2I6Yb9SkA==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz", + "integrity": "sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -3705,15 +3754,15 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.0.tgz", - "integrity": "sha512-6q1vtt5FJcg5osgkHeM1euErECNqEZ5Z1j69yiNx2luEBIso+nxCkS9nqj8w+MK5X7rvKEToGhFfOFWncs51pQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz", + "integrity": "sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "tslib": "^2.6.0" }, "engines": { @@ -3721,14 +3770,14 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.0.tgz", - "integrity": "sha512-XcljKN+G+nmmK69uQA1d9BlYU3ZftG3T3zpK8/7Hf/wrOlV7TA4Ampdrdwkg0jElKdKAoSnPhCO0/U3bQGsVQQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz", + "integrity": "sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" @@ -3742,14 +3791,14 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.0.tgz", - "integrity": "sha512-hTEoodatpBZnUat5nFExbuTGA1lhWGy7vZGuTew5Q3QDtGKFpSJLYmZJhdTjvCFwv1+qQ67hgAVlKdJOB8TXow==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz", + "integrity": "sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "tslib": "^2.6.0" }, "engines": { @@ -3761,14 +3810,14 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.0.tgz", - "integrity": "sha512-iB/Zzjv/eelJRbdULZqzWCbgMgJ7ht4ONVjXtN3+BI/muil6S87gQ1OJyPwlXD+ELdKkitC7bWv5eJdYOZLhrQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz", + "integrity": "sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "@types/gtag.js": "^0.0.20", "tslib": "^2.6.0" }, @@ -3781,14 +3830,14 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.0.tgz", - "integrity": "sha512-FEjZxqKgLHa+Wez/EgKxRwvArNCWIScfyEQD95rot7jkxp6nonjI5XIbGfO/iYhM5Qinwe8aIEQHP2KZtpqVuA==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz", + "integrity": "sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "tslib": "^2.6.0" }, "engines": { @@ -3800,17 +3849,17 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.0.tgz", - "integrity": "sha512-DVTSLjB97hIjmayGnGcBfognCeI7ZuUKgEnU7Oz81JYqXtVg94mVTthDjq3QHTylYNeCUbkaW8VF0FDLcc8pPw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz", + "integrity": "sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -3824,15 +3873,15 @@ } }, "node_modules/@docusaurus/plugin-svgr": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.0.tgz", - "integrity": "sha512-lNljBESaETZqVBMPqkrGchr+UPT1eZzEPLmJhz8I76BxbjqgsUnRvrq6lQJ9sYjgmgX52KB7kkgczqd2yzoswQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz", + "integrity": "sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", @@ -3847,26 +3896,26 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.0.tgz", - "integrity": "sha512-kw/Ye02Hc6xP1OdTswy8yxQEHg0fdPpyWAQRxr5b2x3h7LlG2Zgbb5BDFROnXDDMpUxB7YejlocJIE5HIEfpNA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/plugin-content-blog": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-content-pages": "3.10.0", - "@docusaurus/plugin-css-cascade-layers": "3.10.0", - "@docusaurus/plugin-debug": "3.10.0", - "@docusaurus/plugin-google-analytics": "3.10.0", - "@docusaurus/plugin-google-gtag": "3.10.0", - "@docusaurus/plugin-google-tag-manager": "3.10.0", - "@docusaurus/plugin-sitemap": "3.10.0", - "@docusaurus/plugin-svgr": "3.10.0", - "@docusaurus/theme-classic": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-search-algolia": "3.10.0", - "@docusaurus/types": "3.10.0" + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz", + "integrity": "sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/plugin-css-cascade-layers": "3.10.1", + "@docusaurus/plugin-debug": "3.10.1", + "@docusaurus/plugin-google-analytics": "3.10.1", + "@docusaurus/plugin-google-gtag": "3.10.1", + "@docusaurus/plugin-google-tag-manager": "3.10.1", + "@docusaurus/plugin-sitemap": "3.10.1", + "@docusaurus/plugin-svgr": "3.10.1", + "@docusaurus/theme-classic": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-search-algolia": "3.10.1", + "@docusaurus/types": "3.10.1" }, "engines": { "node": ">=20.0" @@ -3877,24 +3926,24 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.0.tgz", - "integrity": "sha512-9msCAsRdN+UG+RwPwCFb0uKy4tGoPh5YfBozXeGUtIeAgsMdn6f3G/oY861luZ3t8S2ET8S9Y/1GnpJAGWytww==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/plugin-content-blog": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-content-pages": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", + "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -3918,15 +3967,15 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.0.tgz", - "integrity": "sha512-Dkp1YXKn16ByCJAdIjbDIOpVb4Z66MsVD694/ilX1vAAHaVEMrVsf/NPd9VgreyFx08rJ9GqV1MtzsbTcU73Kg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", + "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3946,20 +3995,20 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.0.tgz", - "integrity": "sha512-f5FPKI08e3JRG63vR/o4qeuUVHUHzFzM0nnF+AkB67soAZgNsKJRf2qmUZvlQkGwlV+QFkKe4D0ANMh1jToU3g==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz", + "integrity": "sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==", "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "^1.19.2", "@docsearch/react": "^3.9.0 || ^4.3.2", - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", "algoliasearch": "^5.37.0", "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", @@ -3978,9 +4027,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.0.tgz", - "integrity": "sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz", + "integrity": "sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -3991,9 +4040,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.0.tgz", - "integrity": "sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", + "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4013,14 +4062,14 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.0.tgz", - "integrity": "sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", + "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-common": "3.10.1", "escape-string-regexp": "^4.0.0", "execa": "^5.1.1", "file-loader": "^6.2.0", @@ -4045,12 +4094,12 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.0.tgz", - "integrity": "sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", + "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.0", + "@docusaurus/types": "3.10.1", "tslib": "^2.6.0" }, "engines": { @@ -4058,14 +4107,14 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz", - "integrity": "sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", + "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -5888,34 +5937,34 @@ } }, "node_modules/algoliasearch": { - "version": "5.50.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.50.1.tgz", - "integrity": "sha512-/bwdue1/8LWELn/DBalGRfuLsXBLXULJo/yOeavJtDu8rBwxIzC6/Rz9Jg19S21VkJvRuZO1k8CZXBMS73mYbA==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.16.1", - "@algolia/client-abtesting": "5.50.1", - "@algolia/client-analytics": "5.50.1", - "@algolia/client-common": "5.50.1", - "@algolia/client-insights": "5.50.1", - "@algolia/client-personalization": "5.50.1", - "@algolia/client-query-suggestions": "5.50.1", - "@algolia/client-search": "5.50.1", - "@algolia/ingestion": "1.50.1", - "@algolia/monitoring": "1.50.1", - "@algolia/recommend": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.0.tgz", + "integrity": "sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.18.0", + "@algolia/client-abtesting": "5.52.0", + "@algolia/client-analytics": "5.52.0", + "@algolia/client-common": "5.52.0", + "@algolia/client-insights": "5.52.0", + "@algolia/client-personalization": "5.52.0", + "@algolia/client-query-suggestions": "5.52.0", + "@algolia/client-search": "5.52.0", + "@algolia/ingestion": "1.52.0", + "@algolia/monitoring": "1.52.0", + "@algolia/recommend": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.1.tgz", - "integrity": "sha512-6iXpbkkrAI5HFpCWXlNmIDSBuoN/U1XnEvb2yJAoWfqrZ+DrybI7MQ5P5mthFaprmocq+zbi6HxnR28xnZAYBw==", + "version": "3.28.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.2.tgz", + "integrity": "sha512-sexVcXLHrJN54+S0wXD52xV3ySeGZA5T6HMDkb84wT+3UcXCd8af/k2vU5qJTbHv7DoBb4mISJHdyQ2JOo3Aig==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -5953,33 +6002,6 @@ "node": ">=8" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -6016,6 +6038,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -6080,9 +6111,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.27", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", - "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", "funding": [ { "type": "opencollective", @@ -6099,8 +6130,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001774", + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -8652,30 +8683,6 @@ "node": ">=0.4.0" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -8697,9 +8704,9 @@ } }, "node_modules/file-loader/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -12983,9 +12990,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -13118,9 +13125,9 @@ } }, "node_modules/null-loader/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -13636,9 +13643,9 @@ } }, "node_modules/postcss": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", - "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz", + "integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==", "funding": [ { "type": "opencollective", @@ -15948,15 +15955,6 @@ "entities": "^2.0.0" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -15981,11 +15979,12 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -17640,9 +17639,9 @@ } }, "node_modules/url-loader/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -18140,75 +18139,30 @@ } }, "node_modules/webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", "license": "MIT", "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", + "ansis": "^3.2.0", "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" + "std-env": "^3.7.0" }, "engines": { "node": ">=14.21.3" }, "peerDependencies": { + "@rspack/core": "*", "webpack": "3 || 4 || 5" - } - }, - "node_modules/webpackbar/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/webpackbar/node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpackbar/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpackbar/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/websocket-driver": { diff --git a/docs/package.json b/docs/package.json index b1797899b..5a9ddb398 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,9 +9,9 @@ "clear": "docusaurus clear" }, "dependencies": { - "@docusaurus/core": "^3.10.0", - "@docusaurus/plugin-client-redirects": "^3.10.0", - "@docusaurus/preset-classic": "^3.10.0", + "@docusaurus/core": "^3.10.1", + "@docusaurus/plugin-client-redirects": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", "clsx": "^2.1.1", "prism-react-renderer": "^2.4.1", "react": "^19.2.5", @@ -19,8 +19,8 @@ "serialize-javascript": "^7.0.5" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.10.0", - "@docusaurus/types": "^3.10.0", + "@docusaurus/module-type-aliases": "^3.10.1", + "@docusaurus/types": "^3.10.1", "typescript": "^6.0.3" }, "overrides": { From d35b02d356b85f845cfe5b80987a3d69427cb2eb Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sun, 3 May 2026 01:14:25 +0200 Subject: [PATCH 7/9] Refine `photino-breaking-changes.md` for clarity, consistency, and improved migration guidance. --- .../migration/photino-breaking-changes.md | 193 ++++++++---------- 1 file changed, 90 insertions(+), 103 deletions(-) diff --git a/docs/docs/migration/photino-breaking-changes.md b/docs/docs/migration/photino-breaking-changes.md index 203f800e2..cd0970993 100644 --- a/docs/docs/migration/photino-breaking-changes.md +++ b/docs/docs/migration/photino-breaking-changes.md @@ -1,8 +1,8 @@ -# Breaking Changes compared to Photino +# Breaking Changes from Photino -InfiniFrame is a complete, independent rework of [Photino.NET](https://github.com/tryphotino/photino.NET) and [Photino.Native](https://github.com/tryphotino/photino.native) and all other libraries within the Photino ecosystem. -It is not a drop-in replacement and some API and general design decisions are different because of that. -This document covers API, naming, and behavioral difference to assist with migration +InfiniFrame is a full, independent rework of Photino.NET, Photino.Native, and the rest of the Photino ecosystem. +It's not a drop-in replacement, and some API decisions and general design choices are intentionally different. +This document walks through what changed to help you migrate. ## Table of Contents @@ -29,13 +29,15 @@ This document covers API, naming, and behavioral difference to assist with migra | Exported function prefix | `Photino_` | `InfiniFrame_` | | Default window title | `"Photino"` | `"InfiniFrame"` | | Default user agent | `"Photino WebView"` | `"InfiniFrame WebView"` | -| Default temp path | `%LocalAppData%\Photino` (Windows-only) | `%TEMP%\infiniframe` (all platforms) | +| Default temp path | `%LocalAppData%\Photino` (Windows only) | `%TEMP%\infiniframe` (all platforms) | -All type names that were prefixed `Photino` are now prefixed `InfiniFrame`. If you have any code targeting the native DLL directly via P/Invoke, all exported symbol names must be updated from `Photino_*` to `InfiniFrame_*` +Every type that was prefixed `Photino` is now prefixed `InfiniFrame`. If you're calling the native DLL directly via P/Invoke, all exported symbol names need to change from `Photino_*` to `InfiniFrame_*`. ## Entry Point and Builder API -### Photino — direct construction +### Photino: direct construction + +In Photino, you construct `PhotinoWindow` directly and configure it by calling methods on the object: ```csharp var window = new PhotinoWindow() @@ -45,9 +47,9 @@ var window = new PhotinoWindow() window.WaitForClose(); ``` -`PhotinoWindow` is constructed directly. All configuration is done by calling methods on the object after construction. There is no separate builder class +### InfiniFrame: explicit builder -### InfiniFrame — explicit builder +InfiniFrame uses a dedicated builder. Configuration must be set before calling `Build()`: ```csharp IInfiniFrameWindow window = InfiniFrameWindowBuilder.Create() @@ -58,11 +60,11 @@ IInfiniFrameWindow window = InfiniFrameWindowBuilder.Create() window.WaitForClose(); ``` -Configuration must be set **before** calling `Build()`. The builder accepts an optional `IServiceProvider` for DI integration. The resulting type is `IInfiniFrameWindow`, not a concrete class +The builder optionally accepts an `IServiceProvider` for DI integration. The returned type is `IInfiniFrameWindow`, not a concrete class. ### Configuration from appsettings.json -InfiniFrame supports sourcing window configuration from `IConfiguration` under an `"InfiniFrame"` key — not available in Photino: +InfiniFrame can pull window configuration from `IConfiguration` under an `"InfiniFrame"` key. This wasn't available in Photino: ```json { @@ -76,12 +78,12 @@ InfiniFrame supports sourcing window configuration from `IConfiguration` under a ### Type and class changes -| Photino | InfiniFrame | Notes | -|---------------------------------------------------|-------------------------------------------------------------------|------------------------------------------------| -| `PhotinoWindow` (monolithic) | `IInfiniFrameWindow` (interface) + `InfiniFrameWindow` (concrete) | Users interact through the interface | -| No builder | `InfiniFrameWindowBuilder` | Separate builder class | -| No configuration type | `InfiniFrameWindowConfiguration` | Separates build-time config from runtime | -| `PhotinoWindow(PhotinoWindow parent)` constructor | `builder.SetParent(parentWindow)` | Parent passed through builder, not constructor | +| Photino | InfiniFrame | Notes | +|---------------------------------------------------|-------------------------------------------------------------------|------------------------------------------| +| `PhotinoWindow` (monolithic) | `IInfiniFrameWindow` (interface) + `InfiniFrameWindow` (concrete) | Users interact through the interface | +| No builder | `InfiniFrameWindowBuilder` | Separate builder class | +| No configuration type | `InfiniFrameWindowConfiguration` | Separates build-time config from runtime | +| `PhotinoWindow(PhotinoWindow parent)` constructor | `builder.SetParent(parentWindow)` | Parent is now passed through the builder | ## Runtime Window API @@ -89,14 +91,14 @@ InfiniFrame supports sourcing window configuration from `IConfiguration` under a | Photino | InfiniFrame | Notes | |------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------| -| `PhotinoWindow.Load(Uri)` / `Load(string)` | `IInfiniFrameWindow.Load(Uri)` / `Load(string)` | Renamed and available at runtime; initial URL can also be set via `SetStartUrl()` in the builder | +| `PhotinoWindow.Load(Uri)` / `Load(string)` | `IInfiniFrameWindow.Load(Uri)` / `Load(string)` | Available at runtime; initial URL can also be set via `SetStartUrl()` in the builder | | `PhotinoWindow.LoadRawString(string)` | `IInfiniFrameWindow.LoadRawString(string)` | Available at runtime; initial HTML can also be set via `SetStartString()` in the builder | | `PhotinoWindow.Center()` | `IInfiniFrameWindow.Center()` / `CenterOnCurrentMonitor()` / `CenterOnMonitor(int)` | Available at runtime | | `PhotinoWindow.MoveTo(Point, bool)` / `Offset(Point)` | `window.SetLocation(x, y)` / `window.Offset(x, y)` | | -| `PhotinoWindow.SetMinHeight(int)` / `SetMinWidth(int)` | Removed — use `SetMinSize(width, height)` | Consolidated | -| `PhotinoWindow.SetMaxHeight(int)` / `SetMaxWidth(int)` | Removed — use `SetMaxSize(width, height)` | Consolidated | -| `PhotinoWindow.SetLogVerbosity(int)` | Removed — see [Logging](#logging) | | -| `PhotinoWindow.Win32SetWebView2Path(string)` | Internal — not on public interface | | +| `PhotinoWindow.SetMinHeight(int)` / `SetMinWidth(int)` | Removed; use `SetMinSize(width, height)` | Consolidated | +| `PhotinoWindow.SetMaxHeight(int)` / `SetMaxWidth(int)` | Removed; use `SetMaxSize(width, height)` | Consolidated | +| `PhotinoWindow.SetLogVerbosity(int)` | Removed; see [Logging](#logging) | | +| `PhotinoWindow.Win32SetWebView2Path(string)` | Internal; not on public interface | | | `PhotinoWindow.MacOsVersion` (static) | Removed | | | `PhotinoWindow.IsWindowsPlatform` / `IsMacOsPlatform` / `IsLinuxPlatform` (static) | Removed from public interface | | | `PhotinoWindow.WaitForClose()` | `IInfiniFrameWindow.WaitForClose()` and `WaitForCloseAsync()` | Async variant added | @@ -106,55 +108,53 @@ InfiniFrame supports sourcing window configuration from `IConfiguration` under a ### New APIs not in Photino -| API | Description | -|-----------------------------------------------------------------------------|-----------------------------------------------------------------------------| -| `IInfiniFrameWindow.Focused` | Query or set keyboard focus state | -| `IInfiniFrameWindow.WaitForCloseAsync()` | Async wait for window close | -| `IInfiniFrameWindow.ManagedThreadId` | Thread ID of the window's message loop | -| `IInfiniFrameWindow.InstanceHandle` / `NativeType` | Low-level native access | -| `IInfiniFrameWindow.CachedPreFullScreenBounds` / `CachedPreMaximizedBounds` | Saved geometry for restore | -| `RegisterCustomSchemeHandler()` | Returns `IInfiniFrameWindow` (fluent) — in Photino it returned void | -| `ZoomEnabled` | Separate bool controlling whether user can zoom, distinct from `Zoom` level | +| API | Description | +|-----------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `IInfiniFrameWindow.Focused` | Query or set keyboard focus state | +| `IInfiniFrameWindow.WaitForCloseAsync()` | Async wait for window close | +| `IInfiniFrameWindow.ManagedThreadId` | Thread ID of the window's message loop | +| `IInfiniFrameWindow.InstanceHandle` / `NativeType` | Low-level native access | +| `IInfiniFrameWindow.CachedPreFullScreenBounds` / `CachedPreMaximizedBounds` | Saved geometry for restore | +| `RegisterCustomSchemeHandler()` | Returns `IInfiniFrameWindow` (fluent); in Photino it returned void | +| `ZoomEnabled` | Separate bool controlling whether the user can zoom, distinct from the `Zoom` level | ## Event System -Photino uses standard .NET `EventHandler` delegates. Assigning a new handler **replaces** the previous one: +Photino uses standard .NET `EventHandler` delegates. Assigning a new handler replaces the previous one: ```csharp -// Photino — last assignment wins +// Photino: last assignment wins window.RegisterWindowClosingHandler((sender, args) => { ... }); ``` -InfiniFrame uses `InfiniFrameOrderedEvent` — an ordered multi-subscriber system with deterministic execution order. Handlers are added via `.Add()` and execute in registration order: +InfiniFrame uses `InfiniFrameOrderedEvent`, an ordered multi-subscriber system with deterministic execution order. Handlers are added via `.Add()` and run in the order they were registered: ```csharp -// InfiniFrame — all handlers run in order +// InfiniFrame: all handlers run in order window.Events.WindowClosing.Add((window, args) => { ... }); window.Events.WindowClosing.Add((window, args) => { ... }); // also runs ``` ### Closing event split -Photino has a single `RegisterWindowClosingHandler`. InfiniFrame splits this into two events: +Photino has a single `RegisterWindowClosingHandler`. InfiniFrame splits this into two: -| Event | Type | Description | -|--------------------------|----------------------------------|---------------------------------------------------------------------------------------| -| `WindowClosingRequested` | `InfiniFrameOrderedClosingEvent` | Fired when close is requested and returning `true` from any handler cancels the close | -| `WindowClosing` | `InfiniFrameOrderedEvent` | Fired when the window is definitively closing and cannot be cancelled | +| Event | Type | Description | +|--------------------------|----------------------------------|-----------------------------------------------------------------------------| +| `WindowClosingRequested` | `InfiniFrameOrderedClosingEvent` | Fired when close is requested; returning `true` from any handler cancels it | +| `WindowClosing` | `InfiniFrameOrderedEvent` | Fired when the window is definitively closing and cannot be cancelled | ### Event handler DI injection -InfiniFrame event handlers support DI-resolved parameters when a `IServiceProvider` is provided to `Build()`: +When an `IServiceProvider` is passed to `Build()`, InfiniFrame event handlers support DI-resolved parameters. This isn't available in Photino: ```csharp window.Events.WindowClosing.Add((MyService svc, IInfiniFrameWindow w) => { ... }); ``` -This is not available in Photino. - ## Web Messaging and Message Routing -### Photino — single raw handler +### Photino: single raw handler ```csharp window.RegisterWebMessageReceivedHandler((sender, message) => { @@ -162,11 +162,11 @@ window.RegisterWebMessageReceivedHandler((sender, message) => { }); ``` -One handler. The full message string is passed as-is. +One handler, full message string, no routing. -### InfiniFrame — typed message routing +### InfiniFrame: typed message routing -InfiniFrame uses a versioned JSON envelope protocol. Messages sent from JavaScript as `{"id":"myEvent","command":"Post","data":"some data","version":2}` are dispatched to the handler registered for `"myEvent"`: +InfiniFrame uses a versioned JSON envelope protocol. Messages sent from JavaScript are dispatched to the handler registered for their `id`: ```csharp window.MessageHandlers.RegisterMessageHandler("myEvent", (window, payload) => { @@ -174,49 +174,40 @@ window.MessageHandlers.RegisterMessageHandler("myEvent", (window, payload) => { }); ``` -`RegisterWebMessageReceivedHandler` can still be used for raw message handling if needed, but protocol format is unchanged: JavaScript must send JSON envelopes. - The JavaScript side must use the envelope format: ```js window.infiniframe.host.postData({ id: "myEvent", command: "Post", data: "some data", version: 2 }); ``` -Legacy `messageId;payload` is out of support and not supported by InfiniFrame messaging contracts. +`RegisterWebMessageReceivedHandler` is still available for raw message handling, but the legacy `messageId;payload` string format is gone. All messages must use the JSON envelope. ## Web Security, CORS, and Trusted Origins -This is a major behavioral change from common Photino migration patterns. - -In Photino, projects often used `SetWebSecurityEnabled(false)` to work around CORS/module-loading issues. -In InfiniFrame, browser web security and InfiniFrame URI trust checks are separate concerns: - -- `SetWebSecurityEnabled(...)` controls browser engine web security toggles -- URI origin trust is enforced by `InfiniFrameUriSecurityPolicy` (builder APIs such as `AddTrustedOrigin`, `SetTrustedOrigins`, and `SetTrustAllOrigins`) +This is probably the most impactful behavioral change if you're coming from a typical Photino setup. -For BlazorWebView, InfiniFrame serves app content from an internal origin (`app://localhost/`) and validates requests/messages against trusted origins. -On Windows, this relies on WebView2 custom scheme support (`ICoreWebView2EnvironmentOptions4`). Linux/macOS use WebKit and are not affected by WebView2 runtime availability. - -### Migration pattern +In Photino, projects often just disabled web security to get around CORS and module-loading problems: ```csharp -// Photino-style workaround pattern +// Common Photino workaround windowBuilder.SetWebSecurityEnabled(false); ``` -Prefer this in InfiniFrame: +In InfiniFrame, browser web security and URI origin trust are separate concerns. `SetWebSecurityEnabled(...)` still controls browser engine security toggles, but origin trust is managed through `InfiniFrameUriSecurityPolicy` via builder APIs like `AddTrustedOrigin`, `SetTrustedOrigins`, and `SetTrustAllOrigins`. + +For BlazorWebView, InfiniFrame serves content from `app://localhost/` and validates requests and messages against trusted origins. On Windows this relies on WebView2 custom scheme support (`ICoreWebView2EnvironmentOptions4`). Linux and macOS use WebKit and aren't affected by WebView2 runtime availability. + +The preferred migration pattern is to keep web security on and explicitly trust only the origins you need: ```csharp -// Keep web security enabled and trust only required external origins var app = InfiniFrameBlazorAppBuilder.CreateDefault(windowBuilder: wb => { wb.AddTrustedOrigin("https://xyz"); - // Add redirect/CDN origins used by the module loader wb.AddTrustedOrigin("https://cdn.jsdelivr.net"); wb.AddTrustedOrigin("https://unpkg.com"); }); ``` -If you need broad compatibility during migration, you can explicitly opt in to trust all origins: +If you need broad compatibility during migration, you can opt in to trusting all origins: ```csharp var app = InfiniFrameBlazorAppBuilder.CreateDefault(windowBuilder: wb => { @@ -224,7 +215,7 @@ var app = InfiniFrameBlazorAppBuilder.CreateDefault(windowBuilder: wb => { }); ``` -`SetTrustAllOrigins(true)` is intentionally high-risk and should be treated as a temporary/dev-time compatibility switch, not a production default. +`SetTrustAllOrigins(true)` is intentionally high-risk and should be treated as a temporary dev-time switch, not a production default. ### New API surface compared to Photino @@ -237,34 +228,34 @@ var app = InfiniFrameBlazorAppBuilder.CreateDefault(windowBuilder: wb => { ## Logging -### Photino — integer verbosity +### Photino: integer verbosity ```csharp window.SetLogVerbosity(2); // 0 = silent, higher = more verbose ``` -Logs were written to `Console.Out`. Setting verbosity would itself log a message even when verbosity was 0 (known bug [#257](https://github.com/tryphotino/photino.NET/issues/257)). +Logs went to `Console.Out`. There was also a known bug ([#257](https://github.com/tryphotino/photino.NET/issues/257)) where setting verbosity to 0 would still emit a log message. -### InfiniFrame — ILogger +### InfiniFrame: ILogger -The integer verbosity system is removed entirely. InfiniFrame integrates with `Microsoft.Extensions.Logging`: +The integer verbosity system is gone entirely. InfiniFrame integrates with `Microsoft.Extensions.Logging`: ```csharp var window = InfiniFrameWindowBuilder.Create() .Build(serviceProvider); // ILogger resolved from DI ``` -Log output respects the configured logging provider and log-level filtering +Log output respects your configured logging provider and level filters. ## Native C++ Interface -This section is only relevant if you extend InfiniFrame at the native level or have code that calls the native DLL directly +This section is only relevant if you're extending InfiniFrame at the native level or calling the native DLL directly. ### Pimpl architecture -Photino's `Photino` class exposes platform-specific fields (`_hWnd`, `GtkWidget*`, `NSWindow*`) directly in its class declaration, requiring platform headers to be included everywhere the class is used. +Photino's `Photino` class exposes platform-specific fields (`_hWnd`, `GtkWidget*`, `NSWindow*`) directly in its class declaration, which means platform headers have to be included everywhere the class is used. -InfiniFrame uses the [Pimpl idiom](https://en.cppreference.com/w/cpp/language/pimpl.html) throughout: a `struct Impl` held by `std::unique_ptr` is defined per-platform in the `.cpp`/`.mm` file. The `InfiniFrameWindow.h` header is entirely platform-agnostic +InfiniFrame uses the [Pimpl idiom](https://en.cppreference.com/w/cpp/language/pimpl.html) throughout: a `struct Impl` held by `std::unique_ptr` is defined per-platform in the `.cpp`/`.mm` file. The `InfiniFrameWindow.h` header is entirely platform-agnostic. ### Build system and dependencies @@ -302,7 +293,7 @@ static partial void InfiniFrame_SetTitle(IntPtr instance, ...); ### String ownership -Photino has no explicit API for freeing native-allocated strings, which leads to memory leaks in long-running applications +Photino has no explicit API for freeing native-allocated strings, which causes memory leaks in long-running applications. InfiniFrame exports explicit free functions that must be called on any string returned from the native layer: @@ -311,9 +302,9 @@ InfiniFrame_FreeString(ptr); InfiniFrame_FreeStringArray(ptr, count); ``` -These are called automatically by the managed wrapper — but if you call native exports directly, you are responsible for invoking them +The managed wrapper calls these automatically. If you're calling native exports directly, you're responsible for invoking them yourself. -### `SaveFileDialog` signature change +### SaveFileDialog signature change The native `SaveFileDialog` export gained a `defaultFileName` parameter: @@ -327,31 +318,27 @@ InfiniFrame_ShowSaveFile(title, defaultPath, filters, count, defaultFileName) ## Known Photino Issues Addressed -The following are open or previously reported issues in the Photino repositories that are resolved in InfiniFrame: - -| Photino Issue | Description | How InfiniFrame Addresses It | -|------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------| -| [photino.native #173/174](https://github.com/tryphotino/photino.native/issues/173) | Custom scheme handlers completely broken on Windows (WebResourceRequested never fires) | Rewritten registration path. Scheme handlers tested end-to-end in examples | -| [photino.native #165](https://github.com/tryphotino/photino.native/issues/165) | Memory leak in `SendWebMessage` on Windows | Explicit `InfiniFrame_FreeString` ownership model. Pimpl isolates per-window native allocations | -| [photino.native #158](https://github.com/tryphotino/photino.native/issues/158) | No way to programmatically focus a window | `InfiniFrame_SetFocused` / `InfiniFrame_GetFocused` exported. Exposed via `IInfiniFrameWindow.Focused` | -| [photino.native #163](https://github.com/tryphotino/photino.native/issues/163) | UTF encoding bug in `SetWebView2RuntimePath` silently corrupts non-ASCII paths | `simdutf` used for all UTF-8 ↔ UTF-16 conversions on Windows | -| [photino.native #141](https://github.com/tryphotino/photino.native/issues/141) | Stack overflow in `WaitForExit` on Linux | Per-window independent message loops. No shared global `MessageLoopState` lock | -| [photino.NET #75](https://github.com/tryphotino/photino.NET/issues/75) | `RegisterWindowClosingHandler` does not fire on Linux | Closing handler rewritten using GTK `delete-event` signal correctly | -| [photino.NET #257](https://github.com/tryphotino/photino.NET/issues/257) | `SetLogVerbosity(0)` still logs a message | Integer verbosity removed entirely. Replaced by `ILogger` | -| [photino.NET #232](https://github.com/tryphotino/photino.NET/issues/232) | Custom scheme handlers break `fetch`/`XHR` (CORS interference) | Scheme handler registration refactored. CORS headers handled correctly per platform | -| [photino.native #175](https://github.com/tryphotino/photino.native/issues/175) | `SetTopmost` uses wrong Win32 style. `null` crash on Linux | Fixed Win32 `HWND_TOPMOST`/`HWND_NOTOPMOST` usage. `null` guards added on Linux | +| Photino Issue | Description | How InfiniFrame addresses it | +|------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------| +| [photino.native #173/174](https://github.com/tryphotino/photino.native/issues/173) | Custom scheme handlers completely broken on Windows (`WebResourceRequested` never fires) | Rewritten registration path; scheme handlers tested end-to-end in examples | +| [photino.native #165](https://github.com/tryphotino/photino.native/issues/165) | Memory leak in `SendWebMessage` on Windows | Explicit `InfiniFrame_FreeString` ownership model; Pimpl isolates per-window native allocations | +| [photino.native #158](https://github.com/tryphotino/photino.native/issues/158) | No way to programmatically focus a window | `InfiniFrame_SetFocused` / `InfiniFrame_GetFocused` exported and exposed via `IInfiniFrameWindow.Focused` | +| [photino.native #163](https://github.com/tryphotino/photino.native/issues/163) | UTF encoding bug in `SetWebView2RuntimePath` silently corrupts non-ASCII paths | `simdutf` used for all UTF-8/UTF-16 conversions on Windows | +| [photino.native #141](https://github.com/tryphotino/photino.native/issues/141) | Stack overflow in `WaitForExit` on Linux | Per-window independent message loops; no shared global `MessageLoopState` lock | +| [photino.NET #75](https://github.com/tryphotino/photino.NET/issues/75) | `RegisterWindowClosingHandler` does not fire on Linux | Closing handler rewritten using the GTK `delete-event` signal correctly | +| [photino.NET #257](https://github.com/tryphotino/photino.NET/issues/257) | `SetLogVerbosity(0)` still logs a message | Integer verbosity removed entirely and replaced by `ILogger` | +| [photino.NET #232](https://github.com/tryphotino/photino.NET/issues/232) | Custom scheme handlers break `fetch`/`XHR` (CORS interference) | Scheme handler registration refactored; CORS headers handled correctly per platform | +| [photino.native #175](https://github.com/tryphotino/photino.native/issues/175) | `SetTopmost` uses wrong Win32 style; `null` crash on Linux | Fixed Win32 `HWND_TOPMOST`/`HWND_NOTOPMOST` usage; `null` guards added on Linux | ## Removed or Replaced Features -The following Photino features are not present in InfiniFrame: - -| Feature | Notes | -|------------------------------------------------------------------------------------|-----------------------------------------------------------| -| `SetMinHeight` / `SetMinWidth` / `SetMaxHeight` / `SetMaxWidth` individual methods | Consolidated into `SetMinSize(w, h)` / `SetMaxSize(w, h)` | -| `LogVerbosity` integer system | Replaced by `ILogger` | -| `MacOsVersion` static property | Removed | -| `IsWindowsPlatform` / `IsMacOsPlatform` / `IsLinuxPlatform` static properties | Internal. Not on public interface | -| `UseOsDefaultLocation` / `UseOsDefaultSize` runtime properties | Builder / config time only | -| `BrowserControlInitParameters` runtime property | Builder / config time only | -| `nlohmann/json.hpp` bundled JSON header | Replaced by `simdjson` | -| `fmt` formatting library | Replaced by `std::format` | +| Feature | Notes | +|-------------------------------------------------------------------------------|-----------------------------------------------------------| +| `SetMinHeight` / `SetMinWidth` / `SetMaxHeight` / `SetMaxWidth` | Consolidated into `SetMinSize(w, h)` / `SetMaxSize(w, h)` | +| `LogVerbosity` integer system | Replaced by `ILogger` | +| `MacOsVersion` static property | Removed | +| `IsWindowsPlatform` / `IsMacOsPlatform` / `IsLinuxPlatform` static properties | Internal; not on public interface | +| `UseOsDefaultLocation` / `UseOsDefaultSize` runtime properties | Builder / config time only | +| `BrowserControlInitParameters` runtime property | Builder / config time only | +| `nlohmann/json.hpp` bundled JSON header | Replaced by `simdjson` | +| `fmt` formatting library | Replaced by `std::format` | \ No newline at end of file From 1e32933b1bf235d3226107be28b9f6c11801bde9 Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sun, 3 May 2026 01:20:03 +0200 Subject: [PATCH 8/9] change local .gitignore in docs to global repo wide .gitignore --- .gitignore | 2 ++ docs/.gitignore | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 docs/.gitignore diff --git a/.gitignore b/.gitignore index 041f3c111..0570b0db7 100644 --- a/.gitignore +++ b/.gitignore @@ -357,6 +357,8 @@ healthchecksdb /tests/InfiniFrameTests.Playwright.WebApp.Vue/wwwroot/ #/tests/InfiniFrameTests.Playwright.BlazorWebView.MudBlazor/wwwroot/ This needs to be included for Blazor to work +/docs/.docusaurus +/docs/build/ /docs/node_modules/ # Local test/runner virtualenv diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index 531b31c88..000000000 --- a/docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.docusaurus -build -node_modules From c673f54de5a56eb3183e34596620baa583acb743 Mon Sep 17 00:00:00 2001 From: Anna Sas Date: Sun, 3 May 2026 01:25:55 +0200 Subject: [PATCH 9/9] Refactor documentation for consistency, grammar corrections, and clarity improvements across guides. --- docs/docs/guides/blazor-webview.md | 34 ++++++------ docs/docs/guides/core-window.md | 64 +++++++++++----------- docs/docs/guides/custom-window-chrome.md | 28 +++++----- docs/docs/guides/getting-started.md | 52 +++++++++--------- docs/docs/guides/javascript-interop.md | 28 +++++----- docs/docs/guides/pack-tool.md | 2 +- docs/docs/guides/scripts.md | 2 +- docs/docs/guides/trim-aot-compatibility.md | 6 +- docs/docs/guides/web-server.md | 41 +++++++------- 9 files changed, 127 insertions(+), 130 deletions(-) diff --git a/docs/docs/guides/blazor-webview.md b/docs/docs/guides/blazor-webview.md index 1baa1056e..20f155db3 100644 --- a/docs/docs/guides/blazor-webview.md +++ b/docs/docs/guides/blazor-webview.md @@ -1,6 +1,6 @@ # Blazor WebView Guide -`InfiniLore.InfiniFrame.BlazorWebView` integrates a full Blazor WebAssembly-style application into a native window with no HTTP server required — the Blazor runtime runs entirely in-process +`InfiniLore.InfiniFrame.BlazorWebView` integrates a full Blazor WebAssembly-style application into a native window with no HTTP server required. The Blazor runtime runs entirely in-process. ## Contents @@ -18,8 +18,8 @@ ## How It Works -InfiniFrame serves Blazor resources from an internal origin (`app://localhost/`) and handles requests inside the native host — Blazor component files, JavaScript, and CSS are served from an `IFileProvider` backed by your `wwwroot/` folder -There is no external ASP.NET server required; all communication happens through the native browser bridge +InfiniFrame serves Blazor resources from an internal origin (`app://localhost/`) and handles requests inside the native host. Blazor component files, JavaScript, and CSS are served from an `IFileProvider` backed by your `wwwroot/` folder. +There is no external ASP.NET server required; all communication happens through the native browser bridge. Platform notes: - Windows uses WebView2 and requires custom-scheme registration support (`ICoreWebView2EnvironmentOptions4`) to allow top-level `app://localhost/...` navigation. @@ -61,7 +61,7 @@ A minimal host page: - + ``` @@ -79,28 +79,28 @@ var builder = InfiniFrameBlazorAppBuilder.CreateDefault(args, w => w .SetChromeless(true) // Optional: remove native title bar ); -// Register services — same as a standard Blazor or ASP.NET Core app +// Register services (same as a standard Blazor or ASP.NET Core app) builder.Services.AddSingleton(); builder.Services.AddScoped(); -// Register root components — these map to elements in index.html +// Register root components (these map to elements in index.html) builder.RootComponents.Add("#app"); builder.RootComponents.Add("head::after"); builder.Build().Run(); ``` -`Run()` blocks until the window is closed and then disposes all services +`Run()` blocks until the window is closed and then disposes all services. ## Available Builder API `InfiniFrameBlazorAppBuilder` exposes three properties for configuration: -| Property | Type | Description | -|------------------|-----------------------------|-------------------------------------------------------------------------------| -| `WindowBuilder` | `IInfiniFrameWindowBuilder` | Fluent window configuration — all options from the generated C# API reference | -| `Services` | `IServiceCollection` | Standard .NET DI container | -| `RootComponents` | `RootComponentList` | Maps Blazor components to CSS selectors in index.html | +| Property | Type | Description | +|------------------|-----------------------------|------------------------------------------------------------------------------| +| `WindowBuilder` | `IInfiniFrameWindowBuilder` | Fluent window configuration; all options from the generated C# API reference | +| `Services` | `IServiceCollection` | Standard .NET DI container | +| `RootComponents` | `RootComponentList` | Maps Blazor components to CSS selectors in index.html | ### Configuring the window separately @@ -140,7 +140,7 @@ The following services are automatically registered and available for injection: ## Custom File Provider -By default, files are served from `{AppBaseDirectory}/wwwroot/` +By default, files are served from `{AppBaseDirectory}/wwwroot/`. You can supply a custom `IFileProvider` for embedded resources, encrypted assets, or virtual file systems: ```csharp @@ -204,7 +204,7 @@ AppDomain.CurrentDomain.UnhandledException += (_, e) => { ## HttpClient -An `HttpClient` is registered automatically with `BaseAddress` set to the internal app base URI +An `HttpClient` is registered automatically with `BaseAddress` set to the internal app base URI. This lets you make in-process requests to your static assets or call external APIs: ```razor @@ -233,11 +233,11 @@ DisposeAsync() ← Disposes all services ## Custom Window Chrome -Combine with `InfiniLore.InfiniFrame.Blazor` for a fully custom title bar +Combine with `InfiniLore.InfiniFrame.Blazor` for a fully custom title bar. -See the [Custom Window Chrome Guide](custom-window-chrome.md) for details +See the [Custom Window Chrome Guide](custom-window-chrome.md) for details. ## Examples - `InfiniFrameExample.BlazorWebView` (`examples/InfiniFrameExample.BlazorWebView`) - minimal Blazor app with window configuration and Serilog -- `InfiniFrameExample.BlazorWebView.MultiWindowSample` (`examples/InfiniFrameExample.BlazorWebView.MultiWindowSample`) - multiple windows each hosting a different Blazor component +- `InfiniFrameExample.BlazorWebView.MultiWindowSample` (`examples/InfiniFrameExample.BlazorWebView.MultiWindowSample`) - multiple windows each hosting a different Blazor component \ No newline at end of file diff --git a/docs/docs/guides/core-window.md b/docs/docs/guides/core-window.md index c003fb3df..8738f1305 100644 --- a/docs/docs/guides/core-window.md +++ b/docs/docs/guides/core-window.md @@ -1,6 +1,6 @@ # Core Window Guide -This guide covers everything available through the `InfiniLore.InfiniFrame` package — the foundation of all InfiniFrame integrations +This guide covers everything available through the `InfiniLore.InfiniFrame` package, the foundation of all InfiniFrame integrations. ## Contents @@ -18,7 +18,7 @@ This guide covers everything available through the `InfiniLore.InfiniFrame` pack ## Building a Window -All windows are created through `InfiniFrameWindowBuilder` using a fluent API +All windows are created through `InfiniFrameWindowBuilder` using a fluent API. ```csharp using InfiniFrame; @@ -33,8 +33,8 @@ var window = InfiniFrameWindowBuilder.Create() window.WaitForClose(); ``` -`Build()` creates and displays the native window immediately on the calling thread -The returned `IInfiniFrameWindow` gives you full control over the window at runtime +`Build()` creates and displays the native window immediately on the calling thread. +The returned `IInfiniFrameWindow` gives you full control over the window at runtime. ## Single-File Native Packaging @@ -65,7 +65,7 @@ Use it for packaged deployments created by `InfiniLore.InfiniFrame.Tools.Pack` ( ## Window Configuration -All configuration methods are chainable and must be called before `Build()` +All configuration methods are chainable and must be called before `Build()`. ### Title and Icon @@ -79,7 +79,7 @@ builder ```csharp builder - .SetSize(1280, 720) // Width × Height + .SetSize(1280, 720) // Width x Height .SetMinSize(800, 600) .SetMaxSize(1920, 1080) .SetLocation(100, 100) // Left, Top in screen coordinates @@ -88,7 +88,7 @@ builder .SetUseOsDefaultLocation(true) ``` -Calling `SetSize` or `SetLocation` disables the corresponding OS default and centering behavior +Calling `SetSize` or `SetLocation` disables the corresponding OS default and centering behavior. ### Window State @@ -103,7 +103,7 @@ builder .SetTransparent(true) // Enable window transparency ``` -On Windows, enabling `SetChromeless` automatically disables `UseOsDefaultLocation`, `UseOsDefaultSize`, and `Resizable` since they are incompatible +On Windows, enabling `SetChromeless` automatically disables `UseOsDefaultLocation`, `UseOsDefaultSize`, and `Resizable` since they are incompatible. ### Content @@ -114,7 +114,7 @@ builder .SetStartString("Hello") // Render HTML directly ``` -`SetStartUrl` and `SetStartString` are mutually exclusive — the last one set wins +`SetStartUrl` and `SetStartString` are mutually exclusive; the last one set wins. ## Browser Features @@ -171,19 +171,19 @@ builder The `SetBrowserControlInitParameters` method passes raw flags to the underlying browser engine: ```csharp -// Windows — space-separated Chromium flags +// Windows: space-separated Chromium flags builder.SetBrowserControlInitParameters("--disable-gpu --no-sandbox") -// Linux — JSON object matching WebKit2GTK settings +// Linux: JSON object matching WebKit2GTK settings builder.SetBrowserControlInitParameters("{ \"enable_developer_extras\": true }") -// macOS — JSON object matching WKPreferences keys +// macOS: JSON object matching WKPreferences keys builder.SetBrowserControlInitParameters("{ \"minimumFontSize\": 12 }") ``` ## Runtime Window Control -Once a window is built, `IInfiniFrameWindow` provides methods to control it at runtime +Once a window is built, `IInfiniFrameWindow` provides methods to control it at runtime. ### State and properties @@ -196,7 +196,7 @@ window.Focused // Whether the window currently has focus window.Maximized // (via events, not a direct property at runtime) window.ScreenDpi // Current DPI -window.Monitors // ImmutableArray — all connected monitors +window.Monitors // ImmutableArray; all connected monitors window.MainMonitor // The monitor the window is currently on ``` @@ -210,7 +210,7 @@ await window.WaitForCloseAsync() ### STA requirement (Windows) -WebView2 is COM-based and requires the thread that calls `Build()` to be STA. Without `[STAThread]`, the window opens but the browser control renders as a black screen, and `Build()` now throws `InvalidOperationException` to surface this early +WebView2 is COM-based and requires the thread that calls `Build()` to be STA. Without `[STAThread]`, the window opens but the browser control renders as a black screen, and `Build()` now throws `InvalidOperationException` to surface this early. ```csharp // Required for all InfiniFrame apps on Windows @@ -226,13 +226,13 @@ internal class Program { } ``` -Top-level statements cannot carry `[STAThread]` so use an explicit `static void Main()` as shown above +Top-level statements cannot carry `[STAThread]` so use an explicit `static void Main()` as shown above. -> **Note:** `[STAThread]` is silently ignored on `async Task Main`. The async continuation runs on thread pool threads (MTA). Never use `async Task Main` as the entry point for an InfiniFrame application. **Linux does not have this restriction** because GTK has no COM apartment model. The native constructor calls `gtk_init()` itself and implicitly claims whichever thread calls `Build()` as the GTK main thread +> **Note:** `[STAThread]` is silently ignored on `async Task Main`. The async continuation runs on thread pool threads (MTA). Never use `async Task Main` as the entry point for an InfiniFrame application. **Linux does not have this restriction** because GTK has no COM apartment model. The native constructor calls `gtk_init()` itself and implicitly claims whichever thread calls `Build()` as the GTK main thread. ### Cross-thread invocation -All UI operations must run on the window's thread — use `Invoke` to marshal work from a background thread: +All UI operations must run on the window's thread. Use `Invoke` to marshal work from a background thread: ```csharp Task.Run(() => { @@ -246,7 +246,7 @@ Task.Run(() => { ## Events -Events are available through `IInfiniFrameWindowEvents`, accessible via `IInfiniFrameWindowBuilder.Events` +Events are available through `IInfiniFrameWindowEvents`, accessible via `IInfiniFrameWindowBuilder.Events`. ```csharp var builder = InfiniFrameWindowBuilder.Create(); @@ -281,17 +281,17 @@ Use `WindowClosing` to run cleanup before the window is destroyed: ```csharp builder.Events.WindowClosing.Add((window, cancel) => { SaveAppState(); - return false; // returning false here does not cancel — use WindowClosingRequested for that + return false; // returning false here does not cancel; use WindowClosingRequested for that }); ``` -See the generated C# API reference for the full event system documentation +See the generated C# API reference for the full event system documentation. ## Web Messaging -InfiniFrame provides a two-way messaging channel between JavaScript running in the browser control and your C# code +InfiniFrame provides a two-way messaging channel between JavaScript running in the browser control and your C# code. -### C# → JavaScript +### C# to JavaScript ```csharp window.SendWebMessage("hello from C#"); @@ -306,7 +306,7 @@ window.infiniframe.host.receiveCallback(function(message) { }); ``` -### JavaScript → C# +### JavaScript to C# In JavaScript, send with: @@ -332,7 +332,7 @@ builder.MessageHandlers.RegisterMessageHandler("ping", (window, _) => { ## Custom URL Schemes -You can intercept requests for custom URL schemes (e.g. `app://`) and serve content from C# code — useful for loading local assets or implementing a virtual file system +You can intercept requests for custom URL schemes (e.g. `app://`) and serve content from C# code. This is useful for loading local assets or implementing a virtual file system. ```csharp builder.RegisterCustomSchemeHandler("app", (sender, scheme, url, out string? contentType) => { @@ -342,13 +342,13 @@ builder.RegisterCustomSchemeHandler("app", (sender, scheme, url, out string? con }); ``` -- Up to 16 custom schemes can be registered before `Build()` is called -- Additional handlers can be added after `Build()` via `window.RegisterCustomSchemeHandler(...)` -- Scheme names are lowercased automatically +- Up to 16 custom schemes can be registered before `Build()` is called. +- Additional handlers can be added after `Build()` via `window.RegisterCustomSchemeHandler(...)`. +- Scheme names are lowercased automatically. ## Dialogs -InfiniFrame exposes the native OS dialog system +InfiniFrame exposes the native OS dialog system. ### Message box @@ -395,7 +395,7 @@ All dialogs also have async overloads (`ShowOpenFileAsync`, `ShowSaveFileAsync`, window.SendNotification("Update available", "A new version is ready to install"); ``` -Requires `SetNotificationsEnabled()` and `SetNotificationRegistrationId(...)` to be set during configuration +Requires `SetNotificationsEnabled()` and `SetNotificationRegistrationId(...)` to be set during configuration. ## Monitor Information @@ -430,10 +430,10 @@ Pass the provider to `Build`: var window = builder.Build(serviceProvider); ``` -`IInfiniFrameWindow` will then be resolvable from the container if registered +`IInfiniFrameWindow` will then be resolvable from the container if registered. ## Examples - `InfiniFrameExample.WebApp.React` (`examples/InfiniFrameExample.WebApp.React`) - custom URL scheme handler and web messaging with DI-resolved services - `InfiniFrameExample.BlazorWebView` (`examples/InfiniFrameExample.BlazorWebView`) - window builder configuration with size, position, and icon -- `InfiniFrameExample.SingleFileExe` (`examples/InfiniFrameExample.SingleFileExe`) - embedded static assets and single-file native bootstrap +- `InfiniFrameExample.SingleFileExe` (`examples/InfiniFrameExample.SingleFileExe`) - embedded static assets and single-file native bootstrap \ No newline at end of file diff --git a/docs/docs/guides/custom-window-chrome.md b/docs/docs/guides/custom-window-chrome.md index 5d13b98e7..d999de7f4 100644 --- a/docs/docs/guides/custom-window-chrome.md +++ b/docs/docs/guides/custom-window-chrome.md @@ -1,6 +1,6 @@ # Custom Window Chrome Guide -`InfiniLore.InfiniFrame.Blazor` provides pre-built Razor components for building custom window title bars and resize handles — typically used together with a chromeless window +`InfiniLore.InfiniFrame.Blazor` provides pre-built Razor components for building custom window title bars and resize handles, typically used together with a chromeless window. ## Contents @@ -17,7 +17,7 @@ dotnet add package InfiniLore.InfiniFrame.Blazor ``` -This package is a companion to `InfiniLore.InfiniFrame.BlazorWebView` or `InfiniLore.InfiniFrame.WebServer` +This package is a companion to `InfiniLore.InfiniFrame.BlazorWebView` or `InfiniLore.InfiniFrame.WebServer`. ## Enable Chromeless Mode @@ -32,13 +32,13 @@ builder.WithInfiniFrameWindowBuilder(w => w ); ``` -On Windows, enabling chromeless mode automatically disables `UseOsDefaultLocation`, `UseOsDefaultSize`, and `Resizable` — set them explicitly if needed after calling `SetChromeless` +On Windows, enabling chromeless mode automatically disables `UseOsDefaultLocation`, `UseOsDefaultSize`, and `Resizable`. Set them explicitly if needed after calling `SetChromeless`. ## Components ### InfiniFrameWindowDragArea -Makes any area of the page draggable — acts as the window's title bar +Makes any area of the page draggable, acting as the window's title bar. ```razor @@ -46,8 +46,8 @@ Makes any area of the page draggable — acts as the window's title bar ``` -Place this at the top of your layout to create a custom drag region -The component handles pointer capture automatically so drag operations remain stable even when the cursor moves fast +Place this at the top of your layout to create a custom drag region. +The component handles pointer capture automatically so drag operations remain stable even when the cursor moves fast. ### InfiniFrameWindowButton @@ -65,7 +65,7 @@ A button that performs a window action (minimize, maximize, or close): | `Maximize` | Maximizes or restores the window | | `Close` | Closes the window and exits the application | -Each button is styled via its `.razor.css` scoped stylesheet — override the styles in your own CSS by targeting the component's generated class or wrapping it in a styled container +Each button is styled via its `.razor.css` scoped stylesheet. Override the styles in your own CSS by targeting the component's generated class or wrapping it in a styled container. ### InfiniFrameWindowResizeThumb @@ -83,7 +83,7 @@ Renders resize thumbs for all edges and corners in a single declaration: ``` -Place this at the root level of your layout so it covers the entire window perimeter +Place this at the root level of your layout so it covers the entire window perimeter. ## Full Layout Example @@ -159,7 +159,7 @@ A complete custom window chrome in a Blazor layout: ## JavaScript Interop for Drag Areas -`InfiniLore.InfiniFrame.Js` is used internally by the drag and resize components to call `setPointerCapture` on the underlying DOM element — this ensures drag operations continue even when the pointer leaves the element boundary +`InfiniLore.InfiniFrame.Js` is used internally by the drag and resize components to call `setPointerCapture` on the underlying DOM element. This ensures drag operations continue even when the pointer leaves the element boundary. If you are building your own drag components, you can use `IInfiniFrameJs` directly: @@ -177,13 +177,13 @@ If you are building your own drag components, you can use `IInfiniFrameJs` direc } ``` -See the [JavaScript Interop Guide](javascript-interop.md) for full details +See the [JavaScript Interop Guide](javascript-interop.md) for full details. ## Styling Tips -- The resize thumbs are transparent by default — they only respond to pointer events at the window edge -- On Windows with `SetTransparent(true)`, your CSS `background: transparent` will show through to the desktop, enabling acrylic or mica-style effects via the CSS backdrop -- Double-clicking on a `InfiniFrameWindowDragArea` does not automatically maximize — handle `@ondblclick` yourself if you want that behavior: +- The resize thumbs are transparent by default; they only respond to pointer events at the window edge. +- On Windows with `SetTransparent(true)`, your CSS `background: transparent` will show through to the desktop, enabling acrylic or mica-style effects via the CSS backdrop. +- Double-clicking on a `InfiniFrameWindowDragArea` does not automatically maximize. Handle `@ondblclick` yourself if you want that behavior: ```razor @inject IInfiniFrameWindow Window @@ -195,4 +195,4 @@ See the [JavaScript Interop Guide](javascript-interop.md) for full details @code { void ToggleMaximize() => Window.ToggleMaximized(); } -``` +``` \ No newline at end of file diff --git a/docs/docs/guides/getting-started.md b/docs/docs/guides/getting-started.md index 5581a6715..205980943 100644 --- a/docs/docs/guides/getting-started.md +++ b/docs/docs/guides/getting-started.md @@ -1,14 +1,14 @@ # Getting Started -This guide walks you through installing InfiniFrame and creating your first native desktop window +This guide walks you through installing InfiniFrame and creating your first native desktop window. ## Contents - [Prerequisites](#prerequisites) - [Choose Your Integration](#choose-your-integration) -- [Option 1 — Core Window](#option-1--core-window) -- [Option 2 — Blazor WebView](#option-2--blazor-webview) -- [Option 3 — Web Server](#option-3--web-server) +- [Option 1: Core Window](#option-1-core-window) +- [Option 2: Blazor WebView](#option-2-blazor-webview) +- [Option 3: Web Server](#option-3-web-server) - [Next Steps](#next-steps) ## Prerequisites @@ -18,11 +18,11 @@ This guide walks you through installing InfiniFrame and creating your first nati ### Platform-specific requirements -| Platform | Requirement | -|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Windows | [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) — pre-installed on Windows 11; available as a redistributable for Windows 10 | -| Linux | `webkit2gtk-4.0` and `libgtk-3-dev` installed via your package manager | -| macOS | macOS 10.15 Catalina or later (WKWebView is built into the OS) | +| Platform | Requirement | +|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Windows | [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/); pre-installed on Windows 11 and available as a redistributable for Windows 10 | +| Linux | `webkit2gtk-4.0` and `libgtk-3-dev` installed via your package manager | +| macOS | macOS 10.15 Catalina or later (WKWebView is built into the OS) | ## Choose Your Integration @@ -34,7 +34,7 @@ InfiniFrame supports three integration models depending on your use case: | Run a Blazor app inside a native window (no server) | `InfiniLore.InfiniFrame.BlazorWebView` | | Run an ASP.NET Core web app with a native window | `InfiniLore.InfiniFrame.WebServer` | -## Option 1 — Core Window +## Option 1: Core Window ### Install @@ -59,10 +59,10 @@ var window = InfiniFrameWindowBuilder.Create() window.WaitForClose(); ``` -The window opens immediately when `Build()` is called and runs on the current thread -`WaitForClose()` blocks until the native window is destroyed +The window opens immediately when `Build()` is called and runs on the current thread. +`WaitForClose()` blocks until the native window is destroyed. -> **Windows:** WebView2 requires the calling thread to be STA (single-threaded apartment). Add `[STAThread]` to your `Main` method. Top-level statements do not support `[STAThread]` directly — use an explicit `static void Main()` instead. Calling `Build()` on a non-STA thread will throw an `InvalidOperationException` +> **Windows:** WebView2 requires the calling thread to be STA (single-threaded apartment). Add `[STAThread]` to your `Main` method. Top-level statements do not support `[STAThread]` directly; use an explicit `static void Main()` instead. Calling `Build()` on a non-STA thread will throw an `InvalidOperationException`. ### Single-file/native packaging bootstrap @@ -90,9 +90,9 @@ public static class Program { You only need this for packaged outputs that embed native runtime files as resources. Standard development runs (`dotnet run`) do not require it. -## Option 2 — Blazor WebView +## Option 2: Blazor WebView -This integration runs a Blazor application entirely in-process — no server, no HTTP port +This integration runs a Blazor application entirely in-process with no server and no HTTP port. ### Install @@ -102,13 +102,13 @@ dotnet add package InfiniLore.InfiniFrame.BlazorWebView ### Project setup -Your project must use `Microsoft.NET.Sdk.Razor` and have a `wwwroot/` folder with `index.html` +Your project must use `Microsoft.NET.Sdk.Razor` and have a `wwwroot/` folder with `index.html`. A minimal `index.html`: ```html - + @@ -116,7 +116,7 @@ A minimal `index.html`:
Loading...
An error has occurred.
- + ``` @@ -153,9 +153,9 @@ builder.Build().Run(); ``` -## Option 3 — Web Server +## Option 3: Web Server -This integration starts an ASP.NET Core web server in a background thread and opens a native window pointing at it — ideal when you want the full ASP.NET Core pipeline (middleware, controllers, SignalR, etc.) +This integration starts an ASP.NET Core web server in a background thread and opens a native window pointing at it. It's ideal when you want the full ASP.NET Core pipeline (middleware, controllers, SignalR, etc.) ### Install @@ -179,12 +179,12 @@ app.WebApp.MapGet("/", () => "Hello from InfiniFrame"); app.Run(); ``` -The start URL is automatically read from `ASPNETCORE_URLS` or the `urls` configuration key -`UseAutoServerClose()` ensures the server shuts down gracefully when the window is closed +The start URL is automatically read from `ASPNETCORE_URLS` or the `urls` configuration key. +`UseAutoServerClose()` ensures the server shuts down gracefully when the window is closed. ## Next Steps -- [Core Window Guide](core-window.md) — Window events, messaging, dialogs, custom schemes -- [Blazor Guide](blazor-webview.md) — DI, file providers, component configuration -- [Web Server Guide](web-server.md) — ASP.NET Core pipeline, DI access, graceful shutdown -- [API Reference](../api.md) — Central API navigation and language-specific guides +- [Core Window Guide](core-window.md): Window events, messaging, dialogs, custom schemes +- [Blazor Guide](blazor-webview.md): DI, file providers, component configuration +- [Web Server Guide](web-server.md): ASP.NET Core pipeline, DI access, graceful shutdown +- [API Reference](../api.md): Central API navigation and language-specific guides \ No newline at end of file diff --git a/docs/docs/guides/javascript-interop.md b/docs/docs/guides/javascript-interop.md index e3b2732f4..e834a53b9 100644 --- a/docs/docs/guides/javascript-interop.md +++ b/docs/docs/guides/javascript-interop.md @@ -2,6 +2,9 @@ InfiniFrame provides two layers of JS interop: +1. **Web messaging**: a versioned message channel between C# and the page's JavaScript +2. **InfiniFrame.Js**: Blazor-specific utilities for pointer capture and built-in window management message handlers + ## Contents - [Web Messaging](#web-messaging) @@ -9,9 +12,6 @@ InfiniFrame provides two layers of JS interop: - [Built-in JavaScript Message Handlers](#built-in-javascript-message-handlers) - [Exchanging Structured Data](#exchanging-structured-data) -1. **Web messaging** — a versioned message channel between C# and the page's JavaScript -2. **InfiniFrame.Js** — Blazor-specific utilities for pointer capture and built-in window management message handlers - ## Web Messaging The messaging channel works the same way regardless of whether you are using plain HTML, a Blazor app, or an ASP.NET Core server. @@ -24,7 +24,7 @@ window.infiniframe.host.postData({ id: "my:event", command: "Post", data: { valu Messages are validated against a versioned envelope contract: ```json -{ "id": "", "command": "Post|Get", "data": , "version": 2, "requestId": "", "channel": "" } +{ "id": "", "command": "Post|Get", "data": null, "version": 2, "requestId": "", "channel": "" } ``` `id`, `command`, and `version` are required. `version` must be `2`. @@ -76,7 +76,7 @@ window.MessageHandlers.RegisterMessageHandler("ping", (window, _) => { }); window.MessageHandlers.RegisterMessageHandler("set-title", (window, title) => { - // handle title change — title is the parsed envelope data + // handle title change; title is the parsed envelope data }); ``` @@ -87,7 +87,7 @@ window.infiniframe.host.postData({ id: "set-title", command: "Post", data: "New ## InfiniFrame.Js -`InfiniLore.InfiniFrame.Js` provides Blazor-specific interop and registers built-in message handlers for window management from JavaScript +`InfiniLore.InfiniFrame.Js` provides Blazor-specific interop and registers built-in message handlers for window management from JavaScript. ### Installation @@ -95,7 +95,7 @@ window.infiniframe.host.postData({ id: "set-title", command: "Post", data: "New dotnet add package InfiniLore.InfiniFrame.Js ``` -This package is automatically included by `InfiniLore.InfiniFrame.BlazorWebView` +This package is automatically included by `InfiniLore.InfiniFrame.BlazorWebView`. ### DI Registration @@ -116,7 +116,7 @@ public interface IInfiniFrameJs { } ``` -These wrap the browser's `element.setPointerCapture(pointerId)` / `element.releasePointerCapture(pointerId)` APIs, which are necessary for reliable drag interactions — the pointer capture keeps events flowing to the element even after the pointer leaves it +These wrap the browser's `element.setPointerCapture(pointerId)` / `element.releasePointerCapture(pointerId)` APIs, which are necessary for reliable drag interactions. The pointer capture keeps events flowing to the element even after the pointer leaves it. ```razor @inject IInfiniFrameJs InfiniJs @@ -142,7 +142,7 @@ These wrap the browser's `element.setPointerCapture(pointerId)` / `element.relea ## Built-in JavaScript Message Handlers -`InfiniFrame.Js` registers several message handlers that the client-side `InfiniFrame.js` script uses to control the native window from JavaScript +`InfiniFrame.Js` registers several message handlers that the client-side `InfiniFrame.js` script uses to control the native window from JavaScript. ### Including the script @@ -162,7 +162,7 @@ These wrap the browser's `element.setPointerCapture(pointerId)` / `element.relea | `__infiniframe:title:change` | `InfiniFrame.js` | Update the native window title | | `__infiniframe:open:external` | `InfiniFrame.js` | Open links with `target="_blank"` in the default browser | -These are used internally by `InfiniFrameWindowDragArea`, `InfiniFrameWindowButton`, and related components — you do not need to call them manually unless you are building custom components +These are used internally by `InfiniFrameWindowDragArea`, `InfiniFrameWindowButton`, and related components. You do not need to call them manually unless you are building custom components. ### Sending a window management message from custom JavaScript @@ -193,9 +193,9 @@ window.infiniFrame.HostMessaging.sendMessageToHost("__infiniframe:title:change", ## Exchanging Structured Data -The message channel uses a JSON envelope, so structured data can be placed directly in `data`: +The message channel uses a JSON envelope, so structured data can be placed directly in `data`. -**C# → JS:** +**C# to JS:** ```csharp window.SendWebMessage(JsonSerializer.Serialize(new { @@ -215,7 +215,7 @@ window.infiniframe.host.receiveCallback(function(raw) { }); ``` -**JS → C#:** +**JS to C#:** ```js window.infiniframe.host.postData({ @@ -237,4 +237,4 @@ window.MessageHandlers.RegisterMessageHandler("log", (_, payload) => { ## Examples - `InfiniFrameExample.WebApp.Vue` (`examples/InfiniFrameExample.WebApp.Vue`) - registers all built-in message handlers for window management, fullscreen, title change, and external links -- `InfiniFrameExample.WebApp.React` (`examples/InfiniFrameExample.WebApp.React`) - custom scheme handler returning dynamic JavaScript, and a two-way messaging round-trip +- `InfiniFrameExample.WebApp.React` (`examples/InfiniFrameExample.WebApp.React`) - custom scheme handler returning dynamic JavaScript, and a two-way messaging round-trip \ No newline at end of file diff --git a/docs/docs/guides/pack-tool.md b/docs/docs/guides/pack-tool.md index bc4a9f120..79bb9858a 100644 --- a/docs/docs/guides/pack-tool.md +++ b/docs/docs/guides/pack-tool.md @@ -264,4 +264,4 @@ Why this is required: - The tool performs a preflight `dotnet publish` before final single-file publish. If native artifacts are missing in preflight output, packaging stops early unless explicit fallback is configured and stale fallback is explicitly allowed. - `--self-contained` must be `true` or `false` (case-insensitive boolean parsing). -- If final output does not contain the expected main single-file executable, the tool exits with a non-zero code. +- If final output does not contain the expected main single-file executable, the tool exits with a non-zero code. \ No newline at end of file diff --git a/docs/docs/guides/scripts.md b/docs/docs/guides/scripts.md index 3b1ecd94a..fa425903d 100644 --- a/docs/docs/guides/scripts.md +++ b/docs/docs/guides/scripts.md @@ -65,4 +65,4 @@ Installs NuGet CLI in a cross-platform way: ```bash bash ./scripts/nuget-install.sh -``` +``` \ No newline at end of file diff --git a/docs/docs/guides/trim-aot-compatibility.md b/docs/docs/guides/trim-aot-compatibility.md index d2be6d692..8b18426ab 100644 --- a/docs/docs/guides/trim-aot-compatibility.md +++ b/docs/docs/guides/trim-aot-compatibility.md @@ -7,8 +7,8 @@ InfiniFrame includes CI validation lanes for trimming and NativeAOT compatibilit - The public APIs that rely on runtime reflection or dynamic code generation are explicitly annotated with `RequiresUnreferencedCode` and/or `RequiresDynamicCode`. - Trim/AOT compatibility checks run in CI and must pass before release workflows continue. - `InfiniFrame.Tools.Pack` is validated with a NativeAOT smoke publish using: - - `PublishTrimmed=true` - - `PublishAot=true` + - `PublishTrimmed=true` + - `PublishAot=true` ## Consumer Guidance @@ -19,4 +19,4 @@ InfiniFrame includes CI validation lanes for trimming and NativeAOT compatibilit dotnet publish -c Release -r -p:PublishTrimmed=true -p:PublishAot=true ``` -- If your app uses framework features that depend on reflection (configuration binding, runtime component activation, etc.), account for their requirements explicitly in your trimming strategy. +- If your app uses framework features that depend on reflection (configuration binding, runtime component activation, etc.), account for their requirements explicitly in your trimming strategy. \ No newline at end of file diff --git a/docs/docs/guides/web-server.md b/docs/docs/guides/web-server.md index 5b193bca3..0caf9cfe7 100644 --- a/docs/docs/guides/web-server.md +++ b/docs/docs/guides/web-server.md @@ -1,7 +1,7 @@ # Web Server Guide -`InfiniLore.InfiniFrame.WebServer` runs a standard ASP.NET Core web application in a background thread while opening a native window pointed at it -This approach gives you the full ASP.NET Core pipeline — middleware, controllers, SignalR, minimal APIs, Blazor Server — without any browser overhead +`InfiniLore.InfiniFrame.WebServer` runs a standard ASP.NET Core web application in a background thread while opening a native window pointed at it. +This approach gives you the full ASP.NET Core pipeline (middleware, controllers, SignalR, minimal APIs, Blazor Server) without any browser overhead. ## Contents @@ -18,9 +18,9 @@ This approach gives you the full ASP.NET Core pipeline — middleware, controlle ## How It Works -- The ASP.NET Core server starts on a background thread -- A native window opens and navigates to the server's URL -- Both shut down together when the window is closed (with `UseAutoServerClose()`) +- The ASP.NET Core server starts on a background thread. +- A native window opens and navigates to the server's URL. +- Both shut down together when the window is closed (with `UseAutoServerClose()`). ## Installation @@ -42,16 +42,16 @@ app.WebApp.MapGet("/", () => "Hello from InfiniFrame"); app.Run(); ``` -`app.Run()` starts the web server in the background, opens the window, and blocks until the window is closed +`app.Run()` starts the web server in the background, opens the window, and blocks until the window is closed. ## Builder API `InfiniFrameWebApplication.CreateBuilder(args)` returns an `InfiniFrameWebApplicationBuilder` with two properties: -| Property | Type | Description | -|----------|----------------------------|-----------------------------------------------------------------------| -| `WebApp` | `WebApplicationBuilder` | Standard ASP.NET Core builder — add services, configure Kestrel, etc. | -| `Window` | `InfiniFrameWindowBuilder` | Fluent window configuration | +| Property | Type | Description | +|----------|----------------------------|----------------------------------------------------------------------| +| `WebApp` | `WebApplicationBuilder` | Standard ASP.NET Core builder; add services, configure Kestrel, etc. | +| `Window` | `InfiniFrameWindowBuilder` | Fluent window configuration | ### Configuring the window @@ -83,13 +83,12 @@ The window's start URL is automatically resolved from configuration in this prio 3. Manual override via `builder.Window.SetStartUrl(...)` ```json -// appsettings.json { "urls": "http://localhost:5200" } ``` -If multiple URLs are configured (e.g. `"http://localhost:5200;https://localhost:7200"`), the first one is used as the window's start URL +If multiple URLs are configured (e.g. `"http://localhost:5200;https://localhost:7200"`), the first one is used as the window's start URL. ## Accessing the Window from ASP.NET Core @@ -112,7 +111,7 @@ public class MyController(IInfiniFrameWindow window) : ControllerBase { } ``` -> **Note:** Window operations that affect the native UI must be marshalled to the window thread using `window.Invoke(...)` +> **Note:** Window operations that affect the native UI must be marshalled to the window thread using `window.Invoke(...)`. ## Graceful Shutdown @@ -124,7 +123,7 @@ Automatically stops the web server when the window is closed or a close is reque var app = builder.Build().UseAutoServerClose(); ``` -Internally this registers handlers on both `WindowClosing` and `WindowClosingRequested` that call `WebApp.StopAsync()` in a background task, so the UI thread is never blocked +Internally this registers handlers on both `WindowClosing` and `WindowClosingRequested` that call `WebApp.StopAsync()` in a background task, so the UI thread is never blocked. ### Manual shutdown @@ -164,9 +163,9 @@ app.Run(); ## Static Web Assets -`UseStaticWebAssets()` is called automatically during builder initialization, so static files from Razor class libraries are served correctly without additional configuration +`UseStaticWebAssets()` is called automatically during builder initialization, so static files from Razor class libraries are served correctly without additional configuration. -`UseDefaultFiles()` is also applied during `Build()`, which causes requests to `/` to serve `wwwroot/index.html` if it exists +`UseDefaultFiles()` is also applied during `Build()`, which causes requests to `/` to serve `wwwroot/index.html` if it exists. ## Thread Model @@ -175,15 +174,13 @@ app.Run(); | Main thread | Native window (UI thread) | | Background thread | ASP.NET Core / Kestrel | -All window API calls from ASP.NET Core handlers must use `window.Invoke(...)` to marshal to the window thread -Web server calls from window event handlers can be made directly since ASP.NET Core is thread-safe +All window API calls from ASP.NET Core handlers must use `window.Invoke(...)` to marshal to the window thread. +Web server calls from window event handlers can be made directly since ASP.NET Core is thread-safe. -> **Windows:** The main thread must be STA. Add `[STAThread]` to your `Main` method and use an explicit `static void Main()` — top-level statements and `async Task Main` do not support STA correctly - ---- +> **Windows:** The main thread must be STA. Add `[STAThread]` to your `Main` method and use an explicit `static void Main()`. Top-level statements and `async Task Main` do not support STA correctly. ## Examples - `InfiniFrameExample.WebApp.Blazor` (`examples/InfiniFrameExample.WebApp.Blazor`) - Blazor Server with InteractiveServerComponents, HttpClient factory, and InfiniFrameJs - `InfiniFrameExample.WebApp.React` (`examples/InfiniFrameExample.WebApp.React`) - React frontend with custom scheme handler and two-way messaging -- `InfiniFrameExample.WebApp.Vue` (`examples/InfiniFrameExample.WebApp.Vue`) - Vue.js frontend with all built-in JS message handlers +- `InfiniFrameExample.WebApp.Vue` (`examples/InfiniFrameExample.WebApp.Vue`) - Vue.js frontend with all built-in JS message handlers \ No newline at end of file