Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/shared-coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ permissions:
jobs:
coverage:
name: Generate Coverage Badges
runs-on: windows-latest
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
Expand Down
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<img src="https://raw.githubusercontent.com/InfiniLore/InfiniFrame/refs/heads/core/assets/badge.png" alt="logo" height="76"/>

*A modern and cross-platform native window framework for .NET that lets you build desktop applications using web
technologies load any URL, render HTML strings, or embed a full Blazor application inside a native window*
technologies load any URL, render HTML strings, or embed a full Blazor application inside a native window*

Supports **Windows** (WebView2), **Linux** (WebKit2GTK), and **macOS** (WKWebView)

Expand Down Expand Up @@ -143,19 +143,19 @@ dotnet publish src/MyApp/MyApp.csproj -t:InfiniFrameSingleFile -r win-x64 -c Rel
## Documentation

- [Docs Home](https://docs.infiniframe.dev/)
- [Getting Started](https://docs.infiniframe.dev/guides/getting-started) Installation, first app, platform
- [Getting Started](https://docs.infiniframe.dev/guides/getting-started) Installation, first app, platform
requirements

### Guides

- [Core Window](https://docs.infiniframe.dev/guides/core-window) Builder pattern, configuration, events, messaging
- [Trim/AOT Compatibility](https://docs.infiniframe.dev/guides/trim-aot-compatibility) Trimming and NativeAOT
- [Core Window](https://docs.infiniframe.dev/guides/core-window) Builder pattern, configuration, events, messaging
- [Trim/AOT Compatibility](https://docs.infiniframe.dev/guides/trim-aot-compatibility) Trimming and NativeAOT
guarantees and consumer guidance
- [Blazor WebView](https://docs.infiniframe.dev/guides/blazor-webview) Hosting a full Blazor app in a native window
- [Web Server](https://docs.infiniframe.dev/guides/web-server) ASP.NET Core + native window integration
- [Custom Window Chrome](https://docs.infiniframe.dev/guides/custom-window-chrome) Chromeless windows with Blazor
- [Blazor WebView](https://docs.infiniframe.dev/guides/blazor-webview) Hosting a full Blazor app in a native window
- [Web Server](https://docs.infiniframe.dev/guides/web-server) ASP.NET Core + native window integration
- [Custom Window Chrome](https://docs.infiniframe.dev/guides/custom-window-chrome) Chromeless windows with Blazor
components
- [JavaScript Interop](https://docs.infiniframe.dev/guides/javascript-interop) Communicating between JS and C#
- [JavaScript Interop](https://docs.infiniframe.dev/guides/javascript-interop) Communicating between JS and C#

### API Reference

Expand All @@ -164,7 +164,7 @@ dotnet publish src/MyApp/MyApp.csproj -t:InfiniFrameSingleFile -r win-x64 -c Rel

### Migration

- [Breaking Changes vs Photino.NET](https://docs.infiniframe.dev/migration/photino-breaking-changes) API, namespace,
- [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
Expand Down
4 changes: 2 additions & 2 deletions badges/cs-coverage.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"label": "coverage",
"message": "17.1%",
"label": "C# coverage",
"message": "19.1%",
"color": "red"
}
6 changes: 3 additions & 3 deletions badges/python-coverage.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"label": "coverage",
"message": "90.6%",
"color": "brightgreen"
"label": "Python coverage",
"message": "88.7%",
"color": "yellow"
}
2 changes: 1 addition & 1 deletion badges/ts-coverage.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"label": "coverage",
"label": "TS coverage",
"message": "94.1%",
"color": "brightgreen"
}
4 changes: 2 additions & 2 deletions docker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ docker compose run example-blazorwebview-wslg
Runs the full test suite inside the container. Connects to the host X11 display (for GUI tests) or uses Xvfb.

**Environment variables:**
- `USE_HOST_X11` Set to `1` to use the host's X11 display
- `NATIVE_ARCH` Target architecture (default: `x64`)
- `USE_HOST_X11` Set to `1` to use the host's X11 display
- `NATIVE_ARCH` Target architecture (default: `x64`)

### `linux-tests-wslg`

Expand Down
20 changes: 10 additions & 10 deletions docs/docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ InfiniFrame API documentation is currently maintained inline in Docusaurus.

## Managed API

- [Core Window Guide](guides/core-window.md) Builder pattern and feature overview
- [Window Features Architecture](guides/window-features-architecture.md) Feature system concepts
- [Core Window Guide](guides/core-window.md) Builder pattern and feature overview
- [Window Features Architecture](guides/window-features-architecture.md) Feature system concepts

### Feature Guides

Expand All @@ -25,14 +25,14 @@ InfiniFrame API documentation is currently maintained inline in Docusaurus.
| [Notifications](guides/notifications.md) | `INotificationsInfiniFrameWindowBuilderFeature` | `INotificationsInfiniFrameWindowFeature` |
| [Menu](guides/native-menu.md) | `IMenuInfiniFrameWindowBuilderFeature` | `IMenuInfiniFrameWindowFeature` |
| [Taskbar](guides/core-window.md#taskbar-progress-and-flash) | `ITaskbarInfiniFrameWindowBuilderFeature` | `ITaskbarInfiniFrameWindowFeature` |
| [Instance Arbitration](guides/instance-arbitration.md) | `IInstanceArbitrationInfiniFrameWindowBuilderFeature` | |
| [Drag and Drop](guides/drag-drop-feature.md) | | `IDragDropInfiniFrameWindowFeature` |
| [JavaScript Execution](guides/javascript-execution-feature.md) | | `IJavaScriptInfiniFrameWindowFeature` |
| [Invoke](guides/invoke-feature.md) | | `IInvokeInfiniFrameWindowFeature` |
| [Lifecycle](guides/lifecycle-feature.md) | | `ILifecycleInfiniFrameWindowFeature` |
| [Monitors](guides/monitors-feature.md) | | `IMonitorsInfiniFrameWindowFeature` |
| [File Dialogs](guides/file-dialogs-feature.md) | | `IFilePickerDialogsInfiniFrameWindowFeature` |
| [Web Messaging](guides/javascript-interop.md) | | `IWebMessagingInfiniFrameWindowFeature` |
| [Instance Arbitration](guides/instance-arbitration.md) | `IInstanceArbitrationInfiniFrameWindowBuilderFeature` | |
| [Drag and Drop](guides/drag-drop-feature.md) | | `IDragDropInfiniFrameWindowFeature` |
| [JavaScript Execution](guides/javascript-execution-feature.md) | | `IJavaScriptInfiniFrameWindowFeature` |
| [Invoke](guides/invoke-feature.md) | | `IInvokeInfiniFrameWindowFeature` |
| [Lifecycle](guides/lifecycle-feature.md) | | `ILifecycleInfiniFrameWindowFeature` |
| [Monitors](guides/monitors-feature.md) | | `IMonitorsInfiniFrameWindowFeature` |
| [File Dialogs](guides/file-dialogs-feature.md) | | `IFilePickerDialogsInfiniFrameWindowFeature` |
| [Web Messaging](guides/javascript-interop.md) | | `IWebMessagingInfiniFrameWindowFeature` |

### Integration Guides

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/csharp/async-window-contract-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,4 +202,4 @@ The following items are deferred and not yet implemented:
- `BuildAsync` / hosted-STA window construction path (Windows caller-STA only; see lifecycle contract section above).
- JavaScript reply envelope and `WebMessageReply` protocol (the acknowledgement envelope is shipped; JS-side reply routing is planned).
- State async waits (`WaitForStateAsync`, `SetFullScreenAsync`, etc.) where native events are not yet reliable.
- Native operation registry (`NativeOperationRegistry` abstraction) currently the operation lifecycle is inline within each operation type.
- Native operation registry (`NativeOperationRegistry` abstraction) currently the operation lifecycle is inline within each operation type.
6 changes: 3 additions & 3 deletions docs/docs/guides/browser-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,6 @@ window.Features.Browser.ClearBrowserAutoFill();

## See Also

- [Debugging Feature](debugging-feature.md) DevTools, remote debugging, and diagnostics
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Debugging Feature](debugging-feature.md) DevTools, remote debugging, and diagnostics
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
2 changes: 1 addition & 1 deletion docs/docs/guides/core-window.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Core Window Guide

This guide covers the `InfiniFrameWindowBuilder` the foundation for creating all InfiniFrame windows. It walks through the builder pattern, single-file packaging, and provides a complete reference to every window feature.
This guide covers the `InfiniFrameWindowBuilder` the foundation for creating all InfiniFrame windows. It walks through the builder pattern, single-file packaging, and provides a complete reference to every window feature.

For a conceptual overview of how the feature system works, see [Window Features Architecture](window-features-architecture.md).

Expand Down
10 changes: 5 additions & 5 deletions docs/docs/guides/custom-window-chrome.md
Original file line number Diff line number Diff line change
@@ -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. Chromeless mode is a [Decorations feature](decorations-feature.md) setting. For non-Blazor apps (React, Vue, plain HTML), a JavaScript API is also available see [JavaScript Window Chrome API](#javascript-window-chrome-api).
`InfiniLore.InfiniFrame.Blazor` provides pre-built Razor components for building custom window title bars and resize handles, typically used together with a chromeless window. Chromeless mode is a [Decorations feature](decorations-feature.md) setting. For non-Blazor apps (React, Vue, plain HTML), a JavaScript API is also available see [JavaScript Window Chrome API](#javascript-window-chrome-api).

## Contents

Expand Down Expand Up @@ -253,7 +253,7 @@ Instead of the JS API, you can use data attributes directly on HTML elements:
<div data-infiniframe-resize="bottom-right"></div>
```

The API and data attributes can be used together both are scanned on initialization.
The API and data attributes can be used together both are scanned on initialization.

### Plain HTML Example

Expand Down Expand Up @@ -428,6 +428,6 @@ window.infiniframe.windowChrome.unregister();

## See Also

- [Decorations Feature](decorations-feature.md) Chromeless mode and transparency settings
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Decorations Feature](decorations-feature.md) Chromeless mode and transparency settings
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/debugging-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,6 @@ If `SetBrowserControlInitParameters(...)` contains `--remote-debugging-port=...`

## See Also

- [Browser Feature](browser-feature.md) Browser engine settings and web security
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Browser Feature](browser-feature.md) Browser engine settings and web security
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/decorations-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,6 @@ string? currentColor = window.Features.Decorations.BackgroundColor;

## See Also

- [Custom Window Chrome](custom-window-chrome.md) Blazor components and JS API for chromeless windows
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Custom Window Chrome](custom-window-chrome.md) Blazor components and JS API for chromeless windows
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/drag-drop-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,10 @@ IReadOnlyList<string> extensions = window.Features.DragDrop.AllowedExtensions;
```

:::note
Drag and drop is a runtime-only feature. There is no builder configuration for it you must enable it after `Build()`.
Drag and drop is a runtime-only feature. There is no builder configuration for it you must enable it after `Build()`.
:::

## See Also

- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/file-dialogs-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,6 @@ All file picker methods return `null` if the user cancels the dialog.

## See Also

- [Notifications](notifications.md) Native notifications and message boxes
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Notifications](notifications.md) Native notifications and message boxes
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
4 changes: 2 additions & 2 deletions docs/docs/guides/instance-arbitration.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,5 @@ Elevation detection is available for audit and logging purposes. The arbitration

## See Also

- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
12 changes: 6 additions & 6 deletions docs/docs/guides/invoke-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ The Invoke feature dispatches work to the window's native thread. All UI operati

## Why Cross-Thread Dispatch Is Needed

InfiniFrame windows are single-threaded. The native window (WebView2 on Windows, WebKitGTK on Linux, WKWebView on macOS) runs on a specific thread. Any call that modifies the window changing the title, resizing, navigating, closing must happen on that thread.
InfiniFrame windows are single-threaded. The native window (WebView2 on Windows, WebKitGTK on Linux, WKWebView on macOS) runs on a specific thread. Any call that modifies the window changing the title, resizing, navigating, closing must happen on that thread.

If you're on a background thread (e.g., from `Task.Run` or an async continuation), use `Invoke` or `DispatchAsync` to marshal the work:

```csharp
Task.Run(() => {
// Background thread cannot call window methods directly
// Background thread cannot call window methods directly
window.Invoke(() => {
// Now on the window thread safe to call window methods
// Now on the window thread safe to call window methods
window.SetTitle("Updated from background");
window.Close();
});
Expand Down Expand Up @@ -91,6 +91,6 @@ switch (result) {

## See Also

- [Lifecycle Feature](lifecycle-feature.md) Window close, ready wait, and teardown
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Lifecycle Feature](lifecycle-feature.md) Window close, ready wait, and teardown
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/javascript-execution-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,6 @@ JavaScript execution requires the window to be ready. Use `await window.WaitForR

## See Also

- [JavaScript Interop](javascript-interop.md) Two-way C#/JS messaging (vs one-way JS execution)
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [JavaScript Interop](javascript-interop.md) Two-way C#/JS messaging (vs one-way JS execution)
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/javascript-interop.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,6 @@ window.MessageHandlers.RegisterMessageHandler("log", (_, payload) => {

## See Also

- [JavaScript Execution Feature](javascript-execution-feature.md) Execute arbitrary JS from C#
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [JavaScript Execution Feature](javascript-execution-feature.md) Execute arbitrary JS from C#
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
8 changes: 4 additions & 4 deletions docs/docs/guides/lifecycle-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ await window.WaitForClosedCallbacksAsync(); // Wait for close callbacks
await window.WaitForTeardownAsync(); // Wait for full teardown
```

`WaitForClose()` is the most common pattern it blocks until the native window is fully destroyed and is typically the last call in your entry point:
`WaitForClose()` is the most common pattern it blocks until the native window is fully destroyed and is typically the last call in your entry point:

```csharp
var window = InfiniFrameWindowBuilder.Create()
Expand Down Expand Up @@ -178,6 +178,6 @@ builder.Events.WindowClosing.Add((window, cancel) => {

## See Also

- [Invoke Feature](invoke-feature.md) Cross-thread dispatch to the window's native thread
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Invoke Feature](invoke-feature.md) Cross-thread dispatch to the window's native thread
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/monitors-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,6 @@ Console.WriteLine($"Window is on monitor: {current.MonitorArea}");

## See Also

- [Position Feature](position-feature.md) Window placement and centering
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Position Feature](position-feature.md) Window placement and centering
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
4 changes: 2 additions & 2 deletions docs/docs/guides/native-menu.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,5 +173,5 @@ window.SetMenuBar(menuBar);

## See Also

- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/notifications.md
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,6 @@ var result = await window.ShowMessageAsync(

## See Also

- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [File Dialogs](file-dialogs-feature.md) Open/save file and folder dialogs
- [Core Window Guide](core-window.md) Builder API and feature overview
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [File Dialogs](file-dialogs-feature.md) Open/save file and folder dialogs
- [Core Window Guide](core-window.md) Builder API and feature overview
6 changes: 3 additions & 3 deletions docs/docs/guides/page-navigation-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,6 @@ public record NavigationResult(

## See Also

- [JavaScript Interop](javascript-interop.md) Two-way C#/JS messaging
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
- [JavaScript Interop](javascript-interop.md) Two-way C#/JS messaging
- [Window Features Architecture](window-features-architecture.md) How the feature system works
- [Core Window Guide](core-window.md) Builder API and feature overview
Loading