\n \n '),e=Docsify.dom.find("aside");Docsify.dom.toggleClass(n,"search"),Docsify.dom.before(e,n)}(i),n=Docsify.dom.find("div.search"),a=Docsify.dom.find(n,"input"),e=Docsify.dom.find(n,".input-wrap"),Docsify.dom.on(n,"click",function(e){return-1===["A","H2","P","EM"].indexOf(e.target.tagName)&&e.stopPropagation()}),Docsify.dom.on(a,"input",function(n){clearTimeout(t),t=setTimeout(function(e){return d(n.target.value.trim())},100)}),Docsify.dom.on(e,"click",function(e){"INPUT"!==e.target.tagName&&(a.value="",d())}),i&&setTimeout(function(e){return d(i)},500)}function x(e,n){var t,a,i,r,o;l(e),t=e.placeholder,a=n.route.path,(r=Docsify.dom.getNode('.search input[type="search"]'))&&("string"==typeof t?r.placeholder=t:(i=Object.keys(t).filter(function(e){return-1 {
});
```
----
-
## Conclusion
This guide has walked you through the process of implementing audio device selection in your WebRTC application.
diff --git a/docs/guide/audio/audio_processing.md b/docs/guide/audio/audio-processing.md
similarity index 99%
rename from docs/guide/audio/audio_processing.md
rename to docs/guide/audio/audio-processing.md
index cdc48901..92d5c29b 100644
--- a/docs/guide/audio/audio_processing.md
+++ b/docs/guide/audio/audio-processing.md
@@ -333,8 +333,6 @@ These statistics are particularly useful for monitoring the performance of echo
5. **Monitor statistics**: Use the statistics to monitor the performance of echo cancellation and adjust settings if needed.
----
-
## Conclusion
The `AudioProcessing` class provides powerful audio processing capabilities for real-time communications. By properly configuring and using these features, you can significantly improve the audio quality in your applications.
diff --git a/docs/guide/audio/custom_audio_source.md b/docs/guide/audio/custom-audio-source.md
similarity index 99%
rename from docs/guide/audio/custom_audio_source.md
rename to docs/guide/audio/custom-audio-source.md
index 3af276f5..33d90a67 100644
--- a/docs/guide/audio/custom_audio_source.md
+++ b/docs/guide/audio/custom-audio-source.md
@@ -183,8 +183,6 @@ audioSource.dispose();
audioStreamer.stop();
```
----
-
## Conclusion
The `CustomAudioSource` provides a flexible way to integrate external audio sources with WebRTC. By understanding the audio format parameters and properly managing the audio data flow, you can create applications that use custom audio from virtually any source.
diff --git a/docs/guide/audio/dtmf_sender.md b/docs/guide/audio/dtmf-sender.md
similarity index 99%
rename from docs/guide/audio/dtmf_sender.md
rename to docs/guide/audio/dtmf-sender.md
index c08426b8..0b2b7bf8 100644
--- a/docs/guide/audio/dtmf_sender.md
+++ b/docs/guide/audio/dtmf-sender.md
@@ -155,8 +155,6 @@ Note that you don't need to explicitly dispose of the DTMF sender, as it will be
5. **Tone Buffering**: Be aware that tones are queued and played sequentially. If you need to cancel queued tones, you can call `insertDtmf("")` to clear the queue.
----
-
## Conclusion
The RTCDtmfSender provides a standard way to send DTMF tones over WebRTC audio connections. This functionality is particularly useful for applications that need to interact with traditional telephony systems, IVR systems, or any service that uses DTMF for signaling.
diff --git a/docs/guide/audio/headless_audio_device_module.md b/docs/guide/audio/headless-audio.md
similarity index 93%
rename from docs/guide/audio/headless_audio_device_module.md
rename to docs/guide/audio/headless-audio.md
index 3c75ee7d..35a5132e 100644
--- a/docs/guide/audio/headless_audio_device_module.md
+++ b/docs/guide/audio/headless-audio.md
@@ -1,4 +1,4 @@
-# Headless Audio Device Module
+# Headless Audio
The `HeadlessAudioDeviceModule` is a convenience implementation of the `AudioDeviceModule` that uses WebRTC's dummy audio layer. It avoids touching real OS audio devices while still enabling the WebRTC audio pipeline to pull and render audio frames (headless playout) and to simulate capture (recording path).
@@ -18,7 +18,7 @@ This is ideal for:
## Playout path
-Create the module and pass it to the PeerConnectionFactory. This ensures your peer connection stack uses a headless (dummy) audio backend.
+Create the module and pass it to the `PeerConnectionFactory`. This ensures your peer connection stack uses a headless (dummy) audio backend.
```java
import dev.onvoid.webrtc.PeerConnectionFactory;
@@ -49,11 +49,11 @@ finally {
}
```
-Notes:
+::: info
- Calling startPlayout without a prior initPlayout will throw an error. Always call initPlayout first.
- If you only need the audio pipeline to be ready when remote audio arrives, you may delay playout initialization until after creating your RTCPeerConnection.
+:::
----
## Recording path (capture)
@@ -85,13 +85,12 @@ adm.dispose();
factory.dispose();
```
-Details:
+::: info
- Initialization order matters: call `initRecording()` before `startRecording()`.
- The module exposes one virtual recording device; selection calls succeed with index 0.
- Stereo can be enabled/disabled via the standard ADM methods; by default 1 channel is used.
- If no AudioTransport is registered (no source), silence is injected to keep timings consistent.
-
----
+:::
## When to use HeadlessAudioDeviceModule vs. dummy audio layer on AudioDeviceModule
@@ -99,10 +98,8 @@ Details:
- Using a standard `AudioDeviceModule` with `AudioLayer.kDummyAudio` disables actual audio I/O; the audio pipeline is not started for playout and sinks will typically not receive audio frame callbacks. Use this only when you intentionally do not want any audio delivery (e.g., video‑only or fully custom audio).
Related guides:
-- [Audio Device Selection](guide/audio/audio_devices.md)
-- [Custom Audio Source](guide/audio/custom_audio_source.md)
-
----
+- [Audio Device Selection](/guide/audio/audio-devices)
+- [Custom Audio Source](/guide/audio/custom-audio-source)
## Limitations and notes
- No real audio is played or captured; playout frames are pulled from the render pipeline and discarded, and capture frames are pulled from your source (or zeroed) and delivered into WebRTC.
diff --git a/docs/build.md b/docs/guide/build.md
similarity index 58%
rename from docs/build.md
rename to docs/guide/build.md
index 3d23e1d6..ed6f3cf0 100644
--- a/docs/build.md
+++ b/docs/guide/build.md
@@ -4,20 +4,11 @@ To build the native code, be sure to install the prerequisite software (follow t
**Note**: You don't have to install the Depot Tools, the build script will do that for you.
-
+| OS | Build Instructions |
+| --------- | ----------------------------------------------------------------- |
+| Linux | [Ubuntu][build-linux-ubuntu], [other distros][build-linux-other] |
+| macOS | Xcode 9 or higher |
+| Windows | [Visual Studio][build-windows] |
Assuming you have all the prerequisites installed for your OS, run:
@@ -34,3 +25,7 @@ On the first run, the WebRTC source tree will be loaded into the `//w
| webrtc.branch | The WebRTC branch to checkout. | branch-heads/7204 |
| webrtc.src.dir | The absolute checkout path for the WebRTC source tree. | /\/webrtc |
| webrtc.install.dir | The install path for the compiled WebRTC library. Is also used to link against a pre-compiled WebRTC library to reduce build time. | /\/webrtc/build |
+
+[build-linux-ubuntu]: https://chromium.googlesource.com/chromium/src/+/master/docs/linux/build_instructions.md#system-requirements
+[build-linux-other]: https://chromium.googlesource.com/chromium/src/+/master/docs/linux/build_instructions.md#Notes-for-other-distros
+[build-windows]: https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md#visual-studio
\ No newline at end of file
diff --git a/docs/guide/data/data_channels.md b/docs/guide/data/data-channels.md
similarity index 99%
rename from docs/guide/data/data_channels.md
rename to docs/guide/data/data-channels.md
index a4a18b26..e11e8ebe 100644
--- a/docs/guide/data/data_channels.md
+++ b/docs/guide/data/data-channels.md
@@ -273,7 +273,7 @@ dataChannel.dispose();
## Best Practices
-1. **Error Handling**: Always wrap `send` calls in try-catch blocks as they can throw exceptions if the buffer is full or the channel is not in the OPEN state.
+1. **Error Handling**: Always wrap `send` calls in try-catch blocks as they can throw exceptions if the buffer is full or the channel is not in the `OPEN` state.
2. **Buffer Management**: Monitor the buffered amount to avoid overwhelming the channel. If `getBufferedAmount()` returns a large value, consider pausing sending until it decreases.
@@ -294,8 +294,6 @@ dataChannel.dispose();
- `false` for UTF-8 text data
- `true` for binary data
----
-
## Conclusion
WebRTC data channels provide a powerful way to establish peer-to-peer communication for transferring arbitrary data between clients.
diff --git a/docs/examples.md b/docs/guide/examples.md
similarity index 89%
rename from docs/examples.md
rename to docs/guide/examples.md
index a4e5f86d..86ee625c 100644
--- a/docs/examples.md
+++ b/docs/guide/examples.md
@@ -7,7 +7,7 @@ This section provides an overview of the example applications included in the `w
The [`PeerConnectionExample`](https://github.com/devopvoid/webrtc-java/blob/master/webrtc-examples/src/main/java/dev/onvoid/webrtc/examples/PeerConnectionExample.java) demonstrates how to set up a peer connection with audio and video tracks to be able to send and receive media.
**Key features demonstrated:**
-- Creating a PeerConnectionFactory
+- Creating a `PeerConnectionFactory`
- Creating audio and video tracks
- Setting up a peer connection
- Adding tracks to the peer connection for sending media
@@ -32,7 +32,7 @@ This example is useful for applications that need to receive media streams from
The [`CodecListExample`](https://github.com/devopvoid/webrtc-java/blob/master/webrtc-examples/src/main/java/dev/onvoid/webrtc/examples/CodecListExample.java) demonstrates how to list all supported codecs with the WebRTC peer-connection-factory.
**Key features demonstrated:**
-- Creating a PeerConnectionFactory
+- Creating a `PeerConnectionFactory`
- Getting the supported codecs for both sending and receiving audio and video
- Displaying detailed information about each codec
@@ -43,10 +43,10 @@ This example is useful for understanding what codecs are available on the curren
The [`DesktopVideoExample`](https://github.com/devopvoid/webrtc-java/blob/master/webrtc-examples/src/main/java/dev/onvoid/webrtc/examples/DesktopVideoExample.java) demonstrates how to set up a peer connection with a desktop video source for screen or window capture.
**Key features demonstrated:**
-- Creating a PeerConnectionFactory
+- Creating a `PeerConnectionFactory`
- Getting available desktop sources (screens and windows)
-- Creating a VideoDesktopSource for capturing screen or window content
-- Configuring the VideoDesktopSource properties
+- Creating a `VideoDesktopSource` for capturing screen or window content
+- Configuring the `VideoDesktopSource` properties
- Creating a video track with the desktop source
- Setting up a peer connection
@@ -66,13 +66,15 @@ The [`WebClientExample`](https://github.com/devopvoid/webrtc-java/blob/master/we
This example is valuable for applications that need to establish WebRTC connections between Java clients and web browsers, enabling cross-platform real-time communication with audio and video.
-**Note:** Before running the WebClientExample, you need to start the WebServer first. The WebServer provides the signaling service required for WebRTC connection establishment:
+::: info
+Before running the `WebClientExample`, you need to start the `WebServer` first. The `WebServer` provides the signaling service required for WebRTC connection establishment:
+:::
```bash
mvn exec:java -D"exec.mainClass=dev.onvoid.webrtc.examples.web.server.WebServer"
```
-And the browser client is reachable at this url: https://localhost:8443
+And the browser client is reachable at this url: `https://localhost:8443`
## Running the Examples
diff --git a/docs/quickstart.md b/docs/guide/get-started.md
similarity index 80%
rename from docs/quickstart.md
rename to docs/guide/get-started.md
index 6c5ed3f6..2fb828a7 100644
--- a/docs/quickstart.md
+++ b/docs/guide/get-started.md
@@ -1,36 +1,16 @@
-# Quickstart Guide
+# Get Started
This guide will help you get started with webrtc-java quickly. We'll cover installation, basic setup, and simple examples to demonstrate core functionality.
## Supported Platforms
Maven Central artifacts contain native libraries that can be loaded on the following platforms:
-
-
-
-
x64
-
arm
-
arm64
-
-
-
Linux
-
✔
-
✔ armeabi-v7a
-
✔ arm64-v8a
-
-
-
macOS
-
✔
-
-
-
✔
-
-
-
Windows
-
✔
-
-
-
-
-
-
+| | x64 | arm | arm64 |
+|-----------|---------|---------|---------|
+| Linux | ✔ | ✔ | ✔ |
+| macOS | ✔ | - | ✔ |
+| Windows | ✔ | - | - |
+
## Installation
@@ -42,19 +22,22 @@ Add the following dependency to your `pom.xml`:
dev.onvoid.webrtcwebrtc-java
- {{VERSION}}
+ {{ VERSION }}
```
-Note about native library classifiers:
-- The webrtc-java artifact will automatically add the dependency for the native library artifact matching the currently running operating system and architecture at runtime.
-- If you encounter issues loading the native library "webrtc-java", you can declare the platform-specific classifier explicitly. For example, for Windows 64-Bit:
+::: info
+**Native library classifiers**
+
+The webrtc-java artifact will automatically add the dependency for the native library artifact matching the currently running operating system and architecture at runtime.
+
+If you encounter issues loading the native library "webrtc-java", you can declare the platform-specific classifier explicitly. For example, for Windows 64-Bit:
```xml
dev.onvoid.webrtcwebrtc-java
- {{VERSION}}
+ {{ VERSION }}windows-x86_64
```
@@ -66,6 +49,7 @@ Complete list of available classifiers:
- linux-x86_64
- linux-aarch64
- linux-aarch32
+:::
#### Using SNAPSHOT Versions
@@ -75,7 +59,7 @@ If you want to use the latest development version, you can use a SNAPSHOT releas
dev.onvoid.webrtcwebrtc-java
- {{VERSION_SNAPSHOT}}
+ {{ VERSION_SNAPSHOT }}
```
@@ -101,19 +85,19 @@ To use SNAPSHOT versions, you need to add the following repository configuration
Add the following to your `build.gradle`:
-```gradle
-implementation "dev.onvoid.webrtc:webrtc-java:{{VERSION}}"
+```groovy
+implementation "dev.onvoid.webrtc:webrtc-java:{{ VERSION }}"
```
For specific platforms, add the appropriate classifier:
-```gradle
-implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{VERSION}}", classifier: "windows-x86_64"
-implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{VERSION}}", classifier: "macos-x86_64"
-implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{VERSION}}", classifier: "macos-aarch64"
-implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{VERSION}}", classifier: "linux-x86_64"
-implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{VERSION}}", classifier: "linux-aarch64"
-implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{VERSION}}", classifier: "linux-aarch32"
+```groovy
+implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{ VERSION }}", classifier: "windows-x86_64"
+implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{ VERSION }}", classifier: "macos-x86_64"
+implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{ VERSION }}", classifier: "macos-aarch64"
+implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{ VERSION }}", classifier: "linux-x86_64"
+implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{ VERSION }}", classifier: "linux-aarch64"
+implementation group: "dev.onvoid.webrtc", name: "webrtc-java", version: "{{ VERSION }}", classifier: "linux-aarch32"
```
## Basic Setup
@@ -267,7 +251,9 @@ AudioTrackSource audioSource = factory.createAudioSource(audioOptions);
AudioTrack audioTrack = factory.createAudioTrack("audio0", audioSource);
```
-> Audio devices can be specified via the `AudioDeviceModule`, see the guide on [Audio Devices](guide/audio/audio_devices) for more details.
+::: info
+Audio devices can be specified via the `AudioDeviceModule`, see the guide on [Audio Devices][audio-devices] for more details.
+:::
### Adding Tracks to Peer Connection
@@ -305,9 +291,16 @@ factory.dispose();
Now that you have a basic understanding of webrtc-java, you can explore more advanced features:
-- [Data Channels](guide/data/data_channels) - Learn more about data channels
-- [RTC Stats](guide/monitoring/rtc_stats) - Monitor connection quality
-- [Desktop Capture](guide/video/desktop_capture) - Share screens and windows
-- [All Guides](guide/overview) - Complete list of guides
+- [Data Channels][data-channels] - Learn more about data channels
+- [RTC Stats][rtc-stats] - Monitor connection quality
+- [Desktop Capture][desktop-capture] - Share screens and windows
+- [All Guides][overview] - Complete list of guides
+
+For a complete API reference, check the [JavaDoc][javadoc].
-For a complete API reference, check the [JavaDoc](https://javadoc.io/doc/dev.onvoid.webrtc/webrtc-java/latest/index.html).
\ No newline at end of file
+[audio-devices]: /guide/audio/audio-devices
+[data-channels]: /guide/data/data-channels
+[rtc-stats]: /guide/monitoring/rtc-stats
+[desktop-capture]: /guide/video/desktop-capture
+[overview]: /guide/
+[javadoc]: https://javadoc.io/doc/dev.onvoid.webrtc/webrtc-java/latest/index.html
\ No newline at end of file
diff --git a/docs/guide/index.md b/docs/guide/index.md
new file mode 100644
index 00000000..6e1b913e
--- /dev/null
+++ b/docs/guide/index.md
@@ -0,0 +1,40 @@
+# Guide Overview
+
+This section provides detailed guides for various features of the webrtc-java library.
+
+## Media Basics
+
+- [Media Devices](/guide/media/media-devices) - Working with audio and video devices
+- [Bitrate and Framerate Constraints](/guide/media/constraints) - Controlling media quality
+- [Send-only and Receive-only](/guide/media/directionality) - Configure transceiver directions (send-only, receive-only or inactive)
+
+## Audio
+
+- [Audio Device Selection](/guide/audio/audio-devices) - Selecting and configuring audio devices
+- [Audio Processing](/guide/audio/audio-processing) - Voice processing components
+- [Custom Audio Source](/guide/audio/custom-audio-source) - Using custom audio sources with WebRTC
+- [Headless Audio](/guide/audio/headless-audio) - Playout pull without touching real OS audio devices
+- [DTMF Sender](/guide/audio/dtmf-sender) - Sending DTMF tones in a call
+
+## Video
+
+- [Camera Capture](/guide/video/camera-capture) - Capturing video from cameras
+- [Desktop Capture](/guide/video/desktop-capture) - Capturing and sharing screens and windows
+- [Custom Video Source](/guide/video/custom-video-source) - Using custom video sources with WebRTC
+
+## Data Communication
+
+- [Data Channels](/guide/data/data-channels) - Sending and receiving arbitrary data between peers
+
+## Networking and ICE
+
+- [Port Allocator Config](/guide/networking/port-allocator-config) - Restrict ICE port ranges and control candidate gathering behavior
+
+## Monitoring and Debugging
+
+- [RTC Stats](/guide/monitoring/rtc-stats) - Monitoring connection quality and performance
+- [Logging](/guide/monitoring/logging) - Configuring and using the logging system
+
+## Additional Resources
+
+For a complete API reference, check the [JavaDoc](https://javadoc.io/doc/dev.onvoid.webrtc/webrtc-java/latest/index.html).
\ No newline at end of file
diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md
new file mode 100644
index 00000000..1065968a
--- /dev/null
+++ b/docs/guide/introduction.md
@@ -0,0 +1,24 @@
+# Introduction
+
+webrtc-java is a Java wrapper for the [WebRTC Native API](https://webrtc.github.io/webrtc-org/native-code/native-apis), providing similar functionality to the [W3C JavaScript API](https://w3c.github.io/webrtc-pc). It allows Java developers to build real-time communication applications for desktop platforms without having to work directly with native code.
+
+The library provides a comprehensive set of Java classes that map to the WebRTC C++ API, making it possible to establish peer-to-peer connections, transmit audio and video, share screens, and exchange arbitrary data between applications.
+
+## Overview
+
+For more detailed information, check out the documentation:
+
+- [Get Started](/guide/get-started) - Get up and running quickly with webrtc-java
+- [Guides](/guide/) - Comprehensive documentation on using the library
+- [Examples](/guide/examples) - Sample code demonstrating various features
+- [Build Notes](/guide/build) - Instructions for building the library from source
+
+## License
+
+Copyright (c) 2019 Alex Andres
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
+
+[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
\ No newline at end of file
diff --git a/docs/guide/media/constraints.md b/docs/guide/media/constraints.md
index 8437c5de..fb3b32e8 100644
--- a/docs/guide/media/constraints.md
+++ b/docs/guide/media/constraints.md
@@ -1,4 +1,4 @@
-# Bitrate and Framerate Constraints
+# Media Constraints
This guide explains how to set bitrate and framerate constraints for MediaStreamTrack of RTCRtpSender. It covers:
@@ -109,9 +109,9 @@ if (parameters.encodings != null && !parameters.encodings.isEmpty()) {
The `scaleResolutionDownBy` parameter specifies how much to scale down the video in each dimension. For example, a value of 2.0 means the video will be scaled down by a factor of 2 in both width and height, resulting in a video that is 1/4 the size of the original.
-> Note that these constraints are applied without requiring SDP renegotiation, making them suitable for dynamic adaptation to changing network conditions.
-
----
+::: info
+Note that these constraints are applied without requiring SDP renegotiation, making them suitable for dynamic adaptation to changing network conditions.
+:::
## Conclusion
diff --git a/docs/guide/media/send_receive_direction.md b/docs/guide/media/directionality.md
similarity index 78%
rename from docs/guide/media/send_receive_direction.md
rename to docs/guide/media/directionality.md
index 6a61b774..e6e73c26 100644
--- a/docs/guide/media/send_receive_direction.md
+++ b/docs/guide/media/directionality.md
@@ -1,4 +1,4 @@
-# Send-only and Receive-only Media
+# Media Directionality
This guide explains how to configure WebRTC media to be receive-only or send-only using the webrtc-java API. It also shows the equivalent configuration on the JavaScript (browser) side. You will learn how to:
@@ -10,9 +10,9 @@ This guide explains how to configure WebRTC media to be receive-only or send-onl
The examples build upon the RTCRtpTransceiver API, which is the recommended way to control directionality in modern WebRTC.
Related API:
-- dev.onvoid.webrtc.RTCRtpTransceiver
-- dev.onvoid.webrtc.RTCRtpTransceiverInit
-- dev.onvoid.webrtc.RTCRtpTransceiverDirection
+- `dev.onvoid.webrtc.RTCRtpTransceiver`
+- `dev.onvoid.webrtc.RTCRtpTransceiverInit`
+- `dev.onvoid.webrtc.RTCRtpTransceiverDirection`
References in the repository:
- Tests: [RTCPeerConnectionTests.java](https://github.com/devopvoid/webrtc-java/blob/main/webrtc/src/test/java/dev/onvoid/webrtc/RTCPeerConnectionTests.java)
@@ -20,16 +20,16 @@ References in the repository:
## Concepts overview
-- SEND_RECV: Both sending and receiving are active (default when you add a track).
-- SEND_ONLY: Only sending is negotiated; you won’t receive media on this transceiver.
-- RECV_ONLY: Only receiving is negotiated; you won’t send media on this transceiver.
-- INACTIVE: Neither sending nor receiving on this transceiver.
+- `SEND_RECV`: Both sending and receiving are active (default when you add a track).
+- `SEND_ONLY`: Only sending is negotiated; you won’t receive media on this transceiver.
+- `RECV_ONLY`: Only receiving is negotiated; you won’t send media on this transceiver.
+- `INACTIVE`: Neither sending nor receiving on this transceiver.
These map to the SDP attributes a=sendrecv, a=sendonly, a=recvonly, a=inactive.
## Receive-only example
-Use a transceiver with direction RECV_ONLY to indicate that you only want to receive media for a given kind (audio or video). You can optionally pass a dummy local track or omit sending entirely by not attaching a sending track.
+Use a transceiver with direction `RECV_ONLY` to indicate that you only want to receive media for a given kind (audio or video). You can optionally pass a dummy local track or omit sending entirely by not attaching a sending track.
```java
import dev.onvoid.webrtc.*;
@@ -60,9 +60,10 @@ if (track instanceof dev.onvoid.webrtc.media.video.VideoTrack vTrack) {
}
```
-Notes:
+::: info
- This pattern is used in the WhepExample included in the repository.
- When you create the offer, the SDP will contain a=recvonly for that m= section.
+:::
## Send-only example
@@ -118,20 +119,22 @@ pc.createOffer(opts, new CreateSessionDescriptionObserver() {
});
```
-> Tip: You can also control sending without renegotiation by replacing the sender’s track or disabling it via MediaStreamTrack.setEnabled(false). However, the negotiated direction in SDP remains the same until you renegotiate.
+::: tip
+You can also control sending without renegotiation by replacing the sender’s track or disabling it via `MediaStreamTrack.setEnabled(false)`. However, the negotiated direction in SDP remains the same until you renegotiate.
+:::
## Common patterns and tips
-- If you only need to receive a stream from a server (e.g., WHEP), use RECV_ONLY and avoid capturing local devices. This simplifies permissions and reduces CPU usage.
-- To temporarily stop sending without renegotiation, you can disable the sender’s track: sender.getTrack().setEnabled(false).
-- Use INACTIVE when neither sending nor receiving should occur on a transceiver, but you want to keep it for future use.
+- If you only need to receive a stream from a server (e.g., WHEP), use `RECV_ONLY` and avoid capturing local devices. This simplifies permissions and reduces CPU usage.
+- To temporarily stop sending without renegotiation, you can disable the sender’s track: `sender.getTrack().setEnabled(false)`.
+- Use `INACTIVE` when neither sending nor receiving should occur on a transceiver, but you want to keep it for future use.
- Direction changes typically require a new offer/answer exchange.
## Troubleshooting
-- No remote media arriving in RECV_ONLY mode:
+- No remote media arriving in `RECV_ONLY` mode:
- Ensure the remote endpoint actually sends media on that m= section.
- - Verify codecs overlap (see CodecListExample in examples).
+ - Verify codecs overlap (see `CodecListExample` in examples).
- Check network/firewall and ICE connectivity.
- Permissions prompts appear even in receive-only mode:
- Avoid creating real capture devices if you don’t need to send. You can add a transceiver with a dummy track.
diff --git a/docs/guide/media/media_devices.md b/docs/guide/media/media-devices.md
similarity index 98%
rename from docs/guide/media/media_devices.md
rename to docs/guide/media/media-devices.md
index 834e1326..ae3613d2 100644
--- a/docs/guide/media/media_devices.md
+++ b/docs/guide/media/media-devices.md
@@ -12,7 +12,9 @@ Cameras and microphones play a key role in WebRTC. In a more complex application
The `MediaDevices` class provides methods to query all available media devices connected to the system.
-> Query devices on worker threads, not on UI or render threads.
+::: info
+Query devices on worker threads, not on UI or render threads.
+:::
### Audio Capture Devices (Microphones)
@@ -165,8 +167,6 @@ MediaDevices.addDeviceChangeListener(listener);
MediaDevices.removeDeviceChangeListener(listener);
```
----
-
## Conclusion
This guide has provided a comprehensive overview of working with media devices in the WebRTC library.
diff --git a/docs/guide/monitoring/logging.md b/docs/guide/monitoring/logging.md
index de0eac3a..24852d25 100644
--- a/docs/guide/monitoring/logging.md
+++ b/docs/guide/monitoring/logging.md
@@ -131,7 +131,5 @@ Logging.addLogSink(Logging.Severity.VERBOSE, new Slf4jLogSink());
This approach allows you to integrate WebRTC's native logging with your application's existing logging infrastructure.
----
-
## Conclusion
By using the provided methods and custom log sinks, you can effectively capture, process, and manage log messages to aid in debugging and monitoring your application. Whether you choose to use the native logging capabilities or integrate with existing logging frameworks, the WebRTC logging system is designed to be adaptable to your needs.
\ No newline at end of file
diff --git a/docs/guide/monitoring/rtc_stats.md b/docs/guide/monitoring/rtc-stats.md
similarity index 99%
rename from docs/guide/monitoring/rtc_stats.md
rename to docs/guide/monitoring/rtc-stats.md
index 46e97b9d..9a687da1 100644
--- a/docs/guide/monitoring/rtc_stats.md
+++ b/docs/guide/monitoring/rtc-stats.md
@@ -390,8 +390,6 @@ Different stat types have different attributes. Here are some common attributes
Remember that the available attributes may vary depending on the state of the connection.
----
-
## Conclusion
WebRTC statistics provide essential insights into the performance and health of your real-time communications. By leveraging the RTC Stats API in webrtc-java, you can monitor connection quality, diagnose issues, and optimize your application's performance. The ability to collect detailed metrics on packets, jitter, latency, and more allows you to make data-driven decisions.
\ No newline at end of file
diff --git a/docs/guide/networking/port_allocator_config.md b/docs/guide/networking/port-allocator-config.md
similarity index 100%
rename from docs/guide/networking/port_allocator_config.md
rename to docs/guide/networking/port-allocator-config.md
diff --git a/docs/guide/overview.md b/docs/guide/overview.md
deleted file mode 100644
index 49146d8b..00000000
--- a/docs/guide/overview.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Guides
-
-This section provides detailed guides for various features of the webrtc-java library.
-
-## Media Basics
-
-- [Media Devices](guide/media/media_devices.md) - Working with audio and video devices
-- [Bitrate and Framerate Constraints](guide/media/constraints.md) - Controlling media quality
-- [Send-only and Receive-only](guide/media/send_receive_direction.md) - Configure transceiver directions (send-only, receive-only or inactive)
-
-## Audio
-
-- [Audio Device Selection](guide/audio/audio_devices.md) - Selecting and configuring audio devices
-- [Audio Processing](guide/audio/audio_processing.md) - Voice processing components
-- [Custom Audio Source](guide/audio/custom_audio_source.md) - Using custom audio sources with WebRTC
-- [Headless Audio](guide/audio/headless_audio_device_module.md) - Playout pull without touching real OS audio devices
-- [DTMF Sender](guide/audio/dtmf_sender.md) - Sending DTMF tones in a call
-
-## Video
-
-- [Camera Capture](guide/video/camera_capture.md) - Capturing video from cameras
-- [Desktop Capture](guide/video/desktop_capture.md) - Capturing and sharing screens and windows
-- [Custom Video Source](guide/video/custom_video_source.md) - Using custom video sources with WebRTC
-
-## Data Communication
-
-- [Data Channels](guide/data/data_channels.md) - Sending and receiving arbitrary data between peers
-
-## Networking and ICE
-
-- [Port Allocator Config](guide/networking/port_allocator_config.md) - Restrict ICE port ranges and control candidate gathering behavior
-
-## Monitoring and Debugging
-
-- [RTC Stats](guide/monitoring/rtc_stats.md) - Monitoring connection quality and performance
-- [Logging](guide/monitoring/logging.md) - Configuring and using the logging system
-
-## Utilities
-
-- [Audio Converter](guide/utilities/audio_converter.md) - Resample and remix 10 ms PCM frames between different rates and channel layouts
-- [Audio Recorder](guide/utilities/audio_recorder.md) - Capture microphone input and receive 10 ms PCM frames via an AudioSink
-- [Audio Player](guide/utilities/audio_player.md) - Play PCM audio to an output device by supplying frames via an AudioSource
-- [Video Buffer Converter](guide/utilities/video_buffer_converter.md) - Convert between I420 and common FourCC pixel formats (e.g., RGBA, NV12)
-- [Video Capture](guide/utilities/video_capturer.md) - Control a camera device, configure capabilities, and deliver frames to a sink
-- [Screen Capture](guide/utilities/screen_capturer.md) - Enumerate and capture full desktop screens/monitors
-- [Window Capture](guide/utilities/window_capturer.md) - Enumerate and capture individual application windows
-- [Voice Activity Detector](guide/utilities/voice_activity_detector.md) - Detect speech activity in PCM audio streams
-- [Power Management](guide/utilities/power_management.md) - Prevent the display from sleeping during desktop capture or presentations
-
-## Additional Resources
-
-For a complete API reference, check the [JavaDoc](https://javadoc.io/doc/dev.onvoid.webrtc/webrtc-java/latest/index.html).
\ No newline at end of file
diff --git a/docs/guide/video/camera_capture.md b/docs/guide/video/camera-capture.md
similarity index 98%
rename from docs/guide/video/camera_capture.md
rename to docs/guide/video/camera-capture.md
index 8b5b22e3..d3ea7726 100644
--- a/docs/guide/video/camera_capture.md
+++ b/docs/guide/video/camera-capture.md
@@ -1,4 +1,4 @@
-# Camera Video Track
+# Camera Video
This guide focuses on setting up a peer connection with camera video capture capabilities, which allows you to capture and stream video from connected cameras in your WebRTC connection.
@@ -7,7 +7,7 @@ This guide focuses on setting up a peer connection with camera video capture cap
To enable camera video capture, you need to:
1. List available video devices (cameras)
-2. Create and configure a VideoDeviceSource
+2. Create and configure a `VideoDeviceSource`
3. Create a video track with the camera source
4. Add the track to your peer connection
@@ -210,7 +210,7 @@ When processing video frames, consider these important points:
For converting I420 frames to UI-friendly pixel formats (e.g., RGBA) and other pixel format conversions, use the `VideoBufferConverter` utility.
-- See: [Video Buffer Converter](guide/utilities/video_buffer_converter.md)
+- See: [Video Buffer Converter](/tools/video/video-buffer-converter)
### Scaling Video Frames
@@ -292,8 +292,6 @@ When implementing camera capture in your application, consider these best practi
6. **Handle device changes**: Implement device change listeners to handle cameras being connected or disconnected.
7. **Consider privacy concerns**: In some applications, you may need to request permission to use the camera.
----
-
## Conclusion
This guide has demonstrated how to set up a WebRTC peer connection with camera video capture capabilities and how to receive and process both local and remote video frames.
diff --git a/docs/guide/video/custom_video_source.md b/docs/guide/video/custom-video-source.md
similarity index 100%
rename from docs/guide/video/custom_video_source.md
rename to docs/guide/video/custom-video-source.md
diff --git a/docs/guide/video/desktop_capture.md b/docs/guide/video/desktop-capture.md
similarity index 98%
rename from docs/guide/video/desktop_capture.md
rename to docs/guide/video/desktop-capture.md
index 9e04d42c..6f4e86bb 100644
--- a/docs/guide/video/desktop_capture.md
+++ b/docs/guide/video/desktop-capture.md
@@ -1,4 +1,4 @@
-# Desktop Video Track
+# Desktop Video
This guide focuses on setting up a peer connection with desktop video capture capabilities, which allows you to capture and stream content from your screens or application windows in your WebRTC connection.
@@ -7,7 +7,7 @@ This guide focuses on setting up a peer connection with desktop video capture ca
To enable desktop video capture, you need to:
1. List available desktop sources (screens and windows)
-2. Create and configure a VideoDesktopSource
+2. Create and configure a `VideoDesktopSource`
3. Create a video track with the desktop source
4. Add the track to your peer connection
@@ -157,8 +157,6 @@ screenCapturer.dispose();
windowCapturer.dispose();
```
----
-
## Conclusion
This guide has demonstrated how to set up a WebRTC peer connection with desktop video capture capabilities.
diff --git a/docs/index.html b/docs/index.html
deleted file mode 100644
index fada26c5..00000000
--- a/docs/index.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
- webrtc-java - Java native interface for WebRTC
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 00000000..ce42aae3
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,33 @@
+---
+layout: home
+
+hero:
+ name: "webrtc-java"
+ text: "Java native interface for WebRTC"
+ tagline: Build real‑time audio, video, and data with a clean Java API.
+ actions:
+ - theme: brand
+ text: Get Started
+ link: /guide/get-started
+ - theme: alt
+ text: What is webrtc-java?
+ link: /guide/introduction
+ image:
+ src: /logo.png
+ alt: webrtc-java
+
+features:
+ - title: Cross-platform
+ details: Use the same Java API across Windows, macOS, and Linux with prebuilt native bindings. Ideal for desktop apps and server‑side media services.
+ - title: Native performance
+ details: Thin JNI layer with minimal overhead, delivering near-native performance with minimal context switching between Java and native code.
+ - title: Audio and video streaming
+ details: Audio and video capture from cameras and microphones devices, with support for custom media sources for flexible streaming solutions.
+ - title: Screen Sharing
+ details: Share application windows or the full desktop with minimal setup; integrate screen capture streams like any other media stream.
+ - title: Data Channels
+ details: Reliable and unordered/ordered SCTP data channels for arbitrary messaging, file transfer, and app signaling.
+ - title: Statistics API for monitoring
+ details: Access WebRTC stats (bitrate, packet loss, jitter, RTT, frame rate, CPU) to monitor and optimize media quality.
+---
+
diff --git a/docs/package-lock.json b/docs/package-lock.json
new file mode 100644
index 00000000..e4f99d9b
--- /dev/null
+++ b/docs/package-lock.json
@@ -0,0 +1,2263 @@
+{
+ "name": "webrtc-java",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "webrtc-java",
+ "version": "1.0.0",
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "@types/node": "^24.3.1",
+ "vitepress": "^2.0.0-alpha.12"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
+ "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
+ "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "4.0.0-beta.8",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.0.0-beta.8.tgz",
+ "integrity": "sha512-/ZlyvZCjIJM4aaOYoJpVNHPJckX7J5KIbt6IWjnZXvo0QAUI1aH976vKEJUC9olgUbE3LWafB8yuX4qoqahIQg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/js": {
+ "version": "4.0.0-beta.8",
+ "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.0.0-beta.8.tgz",
+ "integrity": "sha512-elgqPYpykRQr5MlfqoO8U2uC3BcPgjUQhzmHt/H4lSzP7khJ9Jpv/cCB4tiZreXb6GkdRgWr5csiItNq6jjnhg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
+ "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
+ "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
+ "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
+ "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
+ "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
+ "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
+ "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
+ "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
+ "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
+ "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
+ "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
+ "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
+ "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
+ "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
+ "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
+ "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
+ "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
+ "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
+ "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
+ "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
+ "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
+ "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
+ "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@iconify-json/simple-icons": {
+ "version": "1.2.50",
+ "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.50.tgz",
+ "integrity": "sha512-Z2ggRwKYEBB9eYAEi4NqEgIzyLhu0Buh4+KGzMPD6+xG7mk52wZJwLT/glDPtfslV503VtJbqzWqBUGkCMKOFA==",
+ "dev": true,
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.29",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz",
+ "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz",
+ "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz",
+ "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz",
+ "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz",
+ "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz",
+ "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz",
+ "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz",
+ "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz",
+ "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz",
+ "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz",
+ "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz",
+ "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz",
+ "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz",
+ "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz",
+ "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz",
+ "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz",
+ "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz",
+ "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz",
+ "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz",
+ "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz",
+ "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz",
+ "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.12.2.tgz",
+ "integrity": "sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.12.2.tgz",
+ "integrity": "sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.3"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.12.2.tgz",
+ "integrity": "sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.12.2.tgz",
+ "integrity": "sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.12.2.tgz",
+ "integrity": "sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.12.2"
+ }
+ },
+ "node_modules/@shikijs/transformers": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.12.2.tgz",
+ "integrity": "sha512-+z1aMq4N5RoNGY8i7qnTYmG2MBYzFmwkm/yOd6cjEI7OVzcldVvzQCfxU1YbIVgsyB0xHVc2jFe1JhgoXyUoSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.12.2",
+ "@shikijs/types": "3.12.2"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.12.2.tgz",
+ "integrity": "sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.3.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz",
+ "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.10.0"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz",
+ "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "1.0.0-beta.29"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.21.tgz",
+ "integrity": "sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/shared": "3.5.21",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz",
+ "integrity": "sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.21",
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz",
+ "integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/compiler-core": "3.5.21",
+ "@vue/compiler-dom": "3.5.21",
+ "@vue/compiler-ssr": "3.5.21",
+ "@vue/shared": "3.5.21",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.18",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.21.tgz",
+ "integrity": "sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.21",
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.1.tgz",
+ "integrity": "sha512-YBvjfpM7LEp5+b7ZDm4+mFrC+TgGjUmN8ff9lZcbHQ1MKhmftT/urCTZP0y1j26YQWr25l9TPaEbNLbILRiGoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^8.0.1"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.1.tgz",
+ "integrity": "sha512-7kiPhgTKNtNeXltEHnJJjIDlndlJP4P+UJvCw54uVHNDlI6JzwrSiRmW4cxKTug2wDbc/dkGaMnlZghcwV+aWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^8.0.1",
+ "birpc": "^2.5.0",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.2"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.1.tgz",
+ "integrity": "sha512-PqtWqPPRpMwZ9FjTzyugb5KeV9kmg2C3hjxZHwjl0lijT4QIJDd0z6AWcnbM9w2nayjDymyTt0+sbdTv3pVeNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.21.tgz",
+ "integrity": "sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.21.tgz",
+ "integrity": "sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.21",
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.21.tgz",
+ "integrity": "sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.21",
+ "@vue/runtime-core": "3.5.21",
+ "@vue/shared": "3.5.21",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.21.tgz",
+ "integrity": "sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.21",
+ "@vue/shared": "3.5.21"
+ },
+ "peerDependencies": {
+ "vue": "3.5.21"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.21.tgz",
+ "integrity": "sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz",
+ "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "13.9.0",
+ "@vueuse/shared": "13.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/@vueuse/integrations": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.9.0.tgz",
+ "integrity": "sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vueuse/core": "13.9.0",
+ "@vueuse/shared": "13.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "async-validator": "^4",
+ "axios": "^1",
+ "change-case": "^5",
+ "drauu": "^0.4",
+ "focus-trap": "^7",
+ "fuse.js": "^7",
+ "idb-keyval": "^6",
+ "jwt-decode": "^4",
+ "nprogress": "^0.2",
+ "qrcode": "^1.5",
+ "sortablejs": "^1",
+ "universal-cookie": "^7 || ^8",
+ "vue": "^3.5.0"
+ },
+ "peerDependenciesMeta": {
+ "async-validator": {
+ "optional": true
+ },
+ "axios": {
+ "optional": true
+ },
+ "change-case": {
+ "optional": true
+ },
+ "drauu": {
+ "optional": true
+ },
+ "focus-trap": {
+ "optional": true
+ },
+ "fuse.js": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "jwt-decode": {
+ "optional": true
+ },
+ "nprogress": {
+ "optional": true
+ },
+ "qrcode": {
+ "optional": true
+ },
+ "sortablejs": {
+ "optional": true
+ },
+ "universal-cookie": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz",
+ "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz",
+ "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
+ "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
+ "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.9",
+ "@esbuild/android-arm": "0.25.9",
+ "@esbuild/android-arm64": "0.25.9",
+ "@esbuild/android-x64": "0.25.9",
+ "@esbuild/darwin-arm64": "0.25.9",
+ "@esbuild/darwin-x64": "0.25.9",
+ "@esbuild/freebsd-arm64": "0.25.9",
+ "@esbuild/freebsd-x64": "0.25.9",
+ "@esbuild/linux-arm": "0.25.9",
+ "@esbuild/linux-arm64": "0.25.9",
+ "@esbuild/linux-ia32": "0.25.9",
+ "@esbuild/linux-loong64": "0.25.9",
+ "@esbuild/linux-mips64el": "0.25.9",
+ "@esbuild/linux-ppc64": "0.25.9",
+ "@esbuild/linux-riscv64": "0.25.9",
+ "@esbuild/linux-s390x": "0.25.9",
+ "@esbuild/linux-x64": "0.25.9",
+ "@esbuild/netbsd-arm64": "0.25.9",
+ "@esbuild/netbsd-x64": "0.25.9",
+ "@esbuild/openbsd-arm64": "0.25.9",
+ "@esbuild/openbsd-x64": "0.25.9",
+ "@esbuild/openharmony-arm64": "0.25.9",
+ "@esbuild/sunos-x64": "0.25.9",
+ "@esbuild/win32-arm64": "0.25.9",
+ "@esbuild/win32-ia32": "0.25.9",
+ "@esbuild/win32-x64": "0.25.9"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/focus-trap": {
+ "version": "7.6.5",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz",
+ "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tabbable": "^6.2.0"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.18",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz",
+ "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/minisearch": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz",
+ "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
+ "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz",
+ "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.1",
+ "regex": "^6.0.1",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz",
+ "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rollup": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz",
+ "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.50.0",
+ "@rollup/rollup-android-arm64": "4.50.0",
+ "@rollup/rollup-darwin-arm64": "4.50.0",
+ "@rollup/rollup-darwin-x64": "4.50.0",
+ "@rollup/rollup-freebsd-arm64": "4.50.0",
+ "@rollup/rollup-freebsd-x64": "4.50.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.50.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.50.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.50.0",
+ "@rollup/rollup-linux-arm64-musl": "4.50.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.50.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.50.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.50.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.50.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.50.0",
+ "@rollup/rollup-linux-x64-gnu": "4.50.0",
+ "@rollup/rollup-linux-x64-musl": "4.50.0",
+ "@rollup/rollup-openharmony-arm64": "4.50.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.50.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.50.0",
+ "@rollup/rollup-win32-x64-msvc": "4.50.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/shiki": {
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.12.2.tgz",
+ "integrity": "sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.12.2",
+ "@shikijs/engine-javascript": "3.12.2",
+ "@shikijs/engine-oniguruma": "3.12.2",
+ "@shikijs/langs": "3.12.2",
+ "@shikijs/themes": "3.12.2",
+ "@shikijs/types": "3.12.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/superjson": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
+ "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "copy-anything": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+ "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.10.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
+ "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz",
+ "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.14"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitepress": {
+ "version": "2.0.0-alpha.12",
+ "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.12.tgz",
+ "integrity": "sha512-yZwCwRRepcpN5QeAhwSnEJxS3I6zJcVixqL1dnm6km4cnriLpQyy2sXQDsE5Ti3pxGPbhU51nTMwI+XC1KNnJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/css": "^4.0.0-beta.7",
+ "@docsearch/js": "^4.0.0-beta.7",
+ "@iconify-json/simple-icons": "^1.2.47",
+ "@shikijs/core": "^3.9.2",
+ "@shikijs/transformers": "^3.9.2",
+ "@shikijs/types": "^3.9.2",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^6.0.1",
+ "@vue/devtools-api": "^8.0.0",
+ "@vue/shared": "^3.5.18",
+ "@vueuse/core": "^13.6.0",
+ "@vueuse/integrations": "^13.6.0",
+ "focus-trap": "^7.6.5",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.1.2",
+ "shiki": "^3.9.2",
+ "vite": "^7.1.2",
+ "vue": "^3.5.18"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "oxc-minify": "^0.82.1",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "oxc-minify": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.21.tgz",
+ "integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.21",
+ "@vue/compiler-sfc": "3.5.21",
+ "@vue/runtime-dom": "3.5.21",
+ "@vue/server-renderer": "3.5.21",
+ "@vue/shared": "3.5.21"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 00000000..62ddf810
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "webrtc-java-docs",
+ "scripts": {
+ "dev": "vitepress dev",
+ "build": "vitepress build",
+ "preview": "vitepress preview"
+ },
+ "devDependencies": {
+ "@types/node": "^24.3.1",
+ "vitepress": "^2.0.0-alpha.12"
+ }
+}
diff --git a/docs/privacy_policy.md b/docs/privacy_policy.md
deleted file mode 100644
index 8b8ee46f..00000000
--- a/docs/privacy_policy.md
+++ /dev/null
@@ -1,155 +0,0 @@
-# Privacy Policy
-
-**Last updated: July 2025**
-
-## 1. Introduction
-
-This Privacy Policy explains how jrtc.dev collects, uses, and protects your personal information when you visit our website jrtc.dev.
-
-We are committed to protecting your privacy and complying with applicable data protection laws, including the General Data Protection Regulation (GDPR).
-
-## 2. Data Controller
-
-Alex Andres
-Email: [contact@jrtc.dev](mailto:contact@jrtc.dev)
-Physical address: Available upon request
-
-## 3. Information We Collect
-
-### 3.1 Analytics Data
-We use Umami Cloud, a privacy-focused web analytics service, to understand how visitors interact with our website. Umami Cloud collects the following information on our behalf:
-
-- **Page views**: URLs of pages you visit on our site
-- **Referrer information**: The website that directed you to our site
-- **Browser information**: Type and version of your web browser
-- **Device information**: Type of device (desktop, mobile, tablet) and screen resolution
-- **Operating system**: Your device's operating system
-- **Geographic location**: Country and region (derived from IP address, but IP addresses are not stored)
-- **Session data**: Duration of your visit and pages viewed during your session
-
-### 3.2 Technical Information
-Our website is hosted on GitHub Pages. GitHub's servers may automatically collect:
-- IP addresses (in server logs, processed by GitHub)
-- Technical request data for hosting purposes
-
-### 3.3 Information You Provide
-If you contact us through forms or email, we may collect:
-- Name
-- Email address
-- Message content
-- Any other information you voluntarily provide
-
-## 4. How We Use Your Information
-
-We use the collected information for the following purposes:
-
-- **Website Analytics**: To understand website usage patterns and improve user experience
-- **Technical Maintenance**: To ensure website security and proper functioning
-- **Communication**: To respond to your inquiries and provide customer support
-- **Legal Compliance**: To comply with applicable laws and regulations
-
-## 5. Legal Basis for Processing (GDPR)
-
-Under GDPR, we process your personal data based on the following legal grounds:
-
-- **Legitimate Interest** (Article 6(1)(f)): For analytics and website improvement
-- **Consent** (Article 6(1)(a)): When you voluntarily provide information through contact forms
-- **Legal Obligation** (Article 6(1)(c)): When required by law
-
-## 6. Data Sharing and Transfers
-
-### 6.1 Third-Party Services
-We use:
-- **GitHub Pages**: For website hosting (GitHub, Inc., United States)
-- **Umami Cloud**: For privacy-focused web analytics (Umami Software, Inc.)
-
-Umami Cloud processes analytics data on our behalf as a data processor. Unlike traditional analytics providers like Google Analytics, Umami is designed with privacy as a core principle. GitHub Pages may process technical hosting data as described in their privacy policy.
-
-### 6.2 Data Transfers
-Our website is hosted on GitHub Pages (provided by GitHub, Inc., located in the United States). Analytics data is collected and processed by Umami Cloud, which may store data in various locations globally as part of their cloud infrastructure.
-
-Both GitHub and Umami provide appropriate safeguards for international data transfers. You can review their privacy practices at:
-- GitHub: https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement
-- Umami: https://umami.is/privacy
-
-### 6.3 Legal Disclosure
-We may disclose your information if required by law, court order, or to protect our rights and safety.
-
-## 7. Data Retention
-
-- **Analytics Data**: Processed by Umami Cloud and retained according to their data retention policies (typically 6 months)
-- **Contact Information**: Retained for as long as necessary to respond to your inquiry
-- **Technical Logs**: GitHub Pages logs retained according to GitHub's policies
-
-## 8. Your Rights Under GDPR
-
-If you are located in the EEA, you have the following rights:
-
-**Right of Access (Article 15)**
-You can request information about the personal data we hold about you.
-
-**Right to Rectification (Article 16)**
-You can request correction of inaccurate or incomplete personal data.
-
-**Right to Erasure (Article 17)**
-You can request deletion of your personal data under certain circumstances.
-
-**Right to Restrict Processing (Article 18)**
-You can request limitation of processing your personal data.
-
-**Right to Data Portability (Article 20)**
-You can request your data in a structured, machine-readable format.
-
-**Right to Object (Article 21)**
-You can object to processing based on legitimate interests.
-
-**Right to Withdraw Consent**
-Where processing is based on consent, you can withdraw it at any time.
-
-**Right to Lodge a Complaint**
-You can file a complaint with your local data protection authority.
-
-## 9. Exercising Your Rights
-
-To exercise any of your rights, please contact us at:
-Email: [contact@jrtc.dev](mailto:contact@jrtc.dev)
-Physical address: Available upon request
-
-We will respond to your request within 30 days.
-
-## 10. Cookies and Tracking
-
-### 10.1 Umami Cloud Analytics
-**Important**: Umami Cloud does not use cookies. Instead, it uses cookieless tracking methods:
-- **Tracking Method**: Privacy-focused analytics without persistent identifiers
-- **Purpose**: Session and page view tracking for website analytics
-- **Data Storage**: Processed by Umami Cloud with no persistent cookies
-- **Privacy Benefits**: No cross-site tracking, no persistent user identification, GDPR-compliant by design
-
-### 10.2 Website Cookies
-Our website itself does not set any cookies. All analytics are performed using Umami's cookieless tracking technology.
-
-### 10.3 Third-Party Cookies
-Since our site is hosted on GitHub Pages, GitHub may use cookies for their platform functionality. Please refer to GitHub's privacy policy for details about any cookies they may set.
-
-## 11. Changes to This Policy
-
-We may update this Privacy Policy periodically. Changes will be posted on this page with an updated "Last updated" date. Significant changes will be communicated via website notice.
-
-## 12. Contact Information
-
-For privacy-related questions or concerns:
-
-**General Inquiries**:
-Email: [contact@jrtc.dev](mailto:contact@jrtc.dev)
-Physical address: Available upon request
-
-## 13. Supervisory Authority
-
-If you are located in the EEA and have concerns about our data processing, you may contact your local data protection authority:
-
-- **EU Data Protection Authorities**: https://edpb.europa.eu/about-edpb/about-edpb/members_en
-
----
-
-This policy is designed to be transparent about our data practices while ensuring compliance with GDPR and other applicable privacy laws.
\ No newline at end of file
diff --git a/docs/public/apple-touch-icon.png b/docs/public/apple-touch-icon.png
new file mode 100644
index 00000000..d48cf0eb
Binary files /dev/null and b/docs/public/apple-touch-icon.png differ
diff --git a/docs/public/favicon-96x96.png b/docs/public/favicon-96x96.png
new file mode 100644
index 00000000..9b043bd2
Binary files /dev/null and b/docs/public/favicon-96x96.png differ
diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico
new file mode 100644
index 00000000..bec53e9c
Binary files /dev/null and b/docs/public/favicon.ico differ
diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg
new file mode 100644
index 00000000..aeb21ad9
--- /dev/null
+++ b/docs/public/favicon.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/docs/public/logo.png b/docs/public/logo.png
new file mode 100644
index 00000000..7e86ad46
Binary files /dev/null and b/docs/public/logo.png differ
diff --git a/docs/public/site.webmanifest b/docs/public/site.webmanifest
new file mode 100644
index 00000000..6b8bf46c
--- /dev/null
+++ b/docs/public/site.webmanifest
@@ -0,0 +1,21 @@
+{
+ "name": "JRTC",
+ "short_name": "JRTC",
+ "icons": [
+ {
+ "src": "/web-app-manifest-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "/web-app-manifest-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ],
+ "theme_color": "#1e0959",
+ "background_color": "#1e0959",
+ "display": "standalone"
+}
\ No newline at end of file
diff --git a/docs/public/web-app-manifest-192x192.png b/docs/public/web-app-manifest-192x192.png
new file mode 100644
index 00000000..acf34436
Binary files /dev/null and b/docs/public/web-app-manifest-192x192.png differ
diff --git a/docs/public/web-app-manifest-512x512.png b/docs/public/web-app-manifest-512x512.png
new file mode 100644
index 00000000..503da029
Binary files /dev/null and b/docs/public/web-app-manifest-512x512.png differ
diff --git a/docs/guide/utilities/audio_converter.md b/docs/tools/audio/audio-converter.md
similarity index 95%
rename from docs/guide/utilities/audio_converter.md
rename to docs/tools/audio/audio-converter.md
index 50845bc6..98269c25 100644
--- a/docs/guide/utilities/audio_converter.md
+++ b/docs/tools/audio/audio-converter.md
@@ -102,6 +102,6 @@ finally {
## Related guides
-- [Audio Processing](guide/audio/audio_processing.md)
-- [Headless Audio](guide/audio/headless_audio_device_module.md)
-- [Voice Activity Detector](guide/utilities/voice_activity_detector.md)
+- [Audio Processing](/guide/audio/audio-processing)
+- [Headless Audio](/guide/audio/headless-audio)
+- [Voice Activity Detector](/tools/audio/voice-activity-detector)
diff --git a/docs/guide/utilities/audio_player.md b/docs/tools/audio/audio-player.md
similarity index 90%
rename from docs/guide/utilities/audio_player.md
rename to docs/tools/audio/audio-player.md
index e0ae489d..362295b0 100644
--- a/docs/guide/utilities/audio_player.md
+++ b/docs/tools/audio/audio-player.md
@@ -1,6 +1,6 @@
# Audio Player
-The AudioPlayer is a small helper that plays audio using a selected output device by pulling frames from your implementation of AudioSource. It manages a native AudioDeviceModule internally and provides idempotent start/stop.
+The AudioPlayer is a small helper that plays audio using a selected output device by pulling frames from your implementation of `AudioSource`. It manages a native `AudioDeviceModule` internally and provides idempotent start/stop.
API: `dev.onvoid.webrtc.media.audio.AudioPlayer`
@@ -8,7 +8,7 @@ API: `dev.onvoid.webrtc.media.audio.AudioPlayer`
- You want to render raw PCM audio (generated or decoded by your app) to an OS output device.
- You need a simple, high‑level start/stop wrapper around WebRTC’s audio playout.
-See also: [Audio Device Selection](guide/audio/audio_devices.md), [Custom Audio Source](guide/audio/custom_audio_source.md), [Headless Audio](guide/audio/headless_audio_device_module.md).
+See also: [Audio Device Selection](/guide/audio/audio-devices), [Custom Audio Source](/guide/audio/custom-audio-source), [Headless Audio](/guide/audio/headless-audio).
## Key concepts
- Device selection: Provide an `AudioDevice` representing the output device (speaker) before starting.
@@ -89,7 +89,7 @@ public class TonePlayerExample {
- Return value must be the number of samples written across all channels for that 10 ms frame.
## Tips
-- If your synthesis/decoder operates at a different rate or channel layout, convert using the [Audio Converter](guide/utilities/audio_converter.md) before writing into the output buffer.
+- If your synthesis/decoder operates at a different rate or channel layout, convert using the [Audio Converter](/tools/audio/audio-converter) before writing into the output buffer.
## API reference
- `setAudioDevice(AudioDevice device)` – choose output device
diff --git a/docs/guide/utilities/audio_recorder.md b/docs/tools/audio/audio-recorder.md
similarity index 83%
rename from docs/guide/utilities/audio_recorder.md
rename to docs/tools/audio/audio-recorder.md
index b78a3517..b0113b68 100644
--- a/docs/guide/utilities/audio_recorder.md
+++ b/docs/tools/audio/audio-recorder.md
@@ -1,6 +1,6 @@
# Audio Recorder
-The AudioRecorder is a small helper that captures audio from a selected input device and forwards PCM frames to your implementation of AudioSink. It manages a native AudioDeviceModule internally and provides idempotent start/stop.
+The AudioRecorder is a small helper that captures audio from a selected input device and forwards PCM frames to your implementation of `AudioSink`. It manages a native `AudioDeviceModule` internally and provides idempotent start/stop.
API: `dev.onvoid.webrtc.media.audio.AudioRecorder`
@@ -8,7 +8,7 @@ API: `dev.onvoid.webrtc.media.audio.AudioRecorder`
- You want a simple way to record microphone input without wiring a full PeerConnection.
- You need raw 16‑bit PCM frames (10 ms) delivered to your code for analysis, file writing, or custom processing.
-See also: [Audio Device Selection](guide/audio/audio_devices.md), [Audio Processing](guide/audio/audio_processing.md), [Custom Audio Source](guide/audio/custom_audio_source.md).
+See also: [Audio Device Selection](/guide/audio/audio-devices), [Audio Processing](/guide/audio/audio-processing), [Custom Audio Source](/guide/audio/custom-audio-source).
## Key concepts
- Device selection: Provide an `AudioDevice` representing the input device (microphone) before starting.
@@ -55,9 +55,9 @@ public class MicRecorderExample {
- `nSamples` refers to the number of samples across all channels within the 10 ms frame. Example: 48 kHz stereo → (48000/100)×2 = 960×2 = 1920 samples.
## Tips
-- Apply echo cancellation, AGC, and noise suppression via the [Audio Processing](guide/audio/audio_processing.md) guide if needed.
-- If you need to resample or remix, use the [Audio Converter](guide/utilities/audio_converter.md).
-- Device selection details and best practices are covered in [Audio Device Selection](guide/audio/audio_devices.md).
+- Apply echo cancellation, AGC, and noise suppression via the [Audio Processing](/guide/audio/audio-processing) guide if needed.
+- If you need to resample or remix, use the [Audio Converter](/tools/audio/audio-converter).
+- Device selection details and best practices are covered in [Audio Device Selection](/guide/audio/audio-devices).
## API reference
- `setAudioDevice(AudioDevice device)` – choose input device
diff --git a/docs/guide/utilities/voice_activity_detector.md b/docs/tools/audio/voice-activity-detector.md
similarity index 98%
rename from docs/guide/utilities/voice_activity_detector.md
rename to docs/tools/audio/voice-activity-detector.md
index d116ac1e..ea7edf90 100644
--- a/docs/guide/utilities/voice_activity_detector.md
+++ b/docs/tools/audio/voice-activity-detector.md
@@ -101,4 +101,4 @@ finally {
## Related guides
-- [Audio Processing](guide/audio/audio_processing.md)
\ No newline at end of file
+- [Audio Processing](/guide/audio/audio-processing)
\ No newline at end of file
diff --git a/docs/guide/utilities/power_management.md b/docs/tools/desktop/power-management.md
similarity index 74%
rename from docs/guide/utilities/power_management.md
rename to docs/tools/desktop/power-management.md
index 38d4177d..241c3828 100644
--- a/docs/guide/utilities/power_management.md
+++ b/docs/tools/desktop/power-management.md
@@ -6,10 +6,10 @@ API: `dev.onvoid.webrtc.media.video.desktop.PowerManagement`
## Overview
-- Purpose: Temporarily prevent the system from sleeping due to user idle.
-- Scope: Affects display sleep/idle behavior while enabled.
-- Cross‑platform: Implements native integrations for Windows, Linux, and macOS.
-- Responsibility: You must explicitly disable the assertion when you are done.
+- **Purpose**: Temporarily prevent the system from sleeping due to user idle.
+- **Scope**: Affects display sleep/idle behavior while enabled.
+- **Cross‑platform**: Implements native integrations for Windows, Linux, and macOS.
+- **Responsibility**: You must explicitly disable the assertion when you are done.
Key methods:
- `void enableUserActivity()` – Declare the user as active; prevents idle sleep.
@@ -44,9 +44,9 @@ finally {
## Platform notes
-- Windows: Uses native Windows power APIs to request that the display remain on while enabled.
-- Linux (Freedesktop environments): Uses DBus screensaver inhibition (e.g., org.freedesktop.ScreenSaver) where available.
-- macOS: Uses macOS power management assertions to prevent display sleep while enabled.
+- **Windows**: Uses native Windows power APIs to request that the display remain on while enabled.
+- **Linux** (Freedesktop environments): Uses DBus screensaver inhibition (e.g., org.freedesktop.ScreenSaver) where available.
+- **macOS**: Uses macOS power management assertions to prevent display sleep while enabled.
Exact mechanisms are handled by the native layer; your Java code remains the same across platforms.
@@ -57,5 +57,5 @@ Exact mechanisms are handled by the native layer; your Java code remains the sam
## Related guides
-- [Desktop Capture](guide/video/desktop_capture.md)
-- [Logging](guide/monitoring/logging.md)
+- [Desktop Capture](/guide/video/desktop-capture)
+- [Logging](/guide/monitoring/logging)
diff --git a/docs/guide/utilities/screen_capturer.md b/docs/tools/desktop/screen-capturer.md
similarity index 97%
rename from docs/guide/utilities/screen_capturer.md
rename to docs/tools/desktop/screen-capturer.md
index a76204b7..5775a476 100644
--- a/docs/guide/utilities/screen_capturer.md
+++ b/docs/tools/desktop/screen-capturer.md
@@ -108,5 +108,5 @@ sc.dispose();
## Related guides
-- [Desktop Capture](guide/video/desktop_capture.md)
-- [Power Management](guide/utilities/power_management.md)
+- [Desktop Capture](/guide/video/desktop-capture)
+- [Power Management](/tools/desktop/power-management)
diff --git a/docs/guide/utilities/window_capturer.md b/docs/tools/desktop/window-capturer.md
similarity index 96%
rename from docs/guide/utilities/window_capturer.md
rename to docs/tools/desktop/window-capturer.md
index 1d1571d0..a92e4a3a 100644
--- a/docs/guide/utilities/window_capturer.md
+++ b/docs/tools/desktop/window-capturer.md
@@ -101,5 +101,5 @@ wc.dispose();
## Related guides
-- [Desktop Capture](guide/video/desktop_capture.md)
-- [Power Management](guide/utilities/power_management.md)
+- [Desktop Capture](/guide/video/desktop-capture)
+- [Power Management](/tools/desktop/power-management)
diff --git a/docs/tools/index.md b/docs/tools/index.md
new file mode 100644
index 00000000..9e8a7f46
--- /dev/null
+++ b/docs/tools/index.md
@@ -0,0 +1,41 @@
+# Tools Overview
+
+This section collects small, focused helpers that make it easier to work with audio, video, and desktop capture features without wiring a full PeerConnection. Each utility provides a narrow, well‑defined API with simple start/stop lifecycles and is safe to integrate into custom pipelines.
+
+Use these pages to pick the right tool and jump straight to code examples.
+
+## Audio
+
+- [Audio Converter](/tools/audio/audio-converter) — Resample and remix 10 ms PCM frames between rates and channel layouts.
+- [Audio Recorder](/tools/audio/audio-recorder) — Capture microphone input and receive 10 ms PCM frames via an `AudioSink`.
+- [Audio Player](/tools/audio/audio-player) — Play PCM audio to an output device by supplying frames via an `AudioSource`.
+- [Voice Activity Detector](/tools/audio/voice-activity-detector) — Estimate speech probability for short PCM frames.
+
+## Video
+
+- [Video Buffer Converter](/tools/video/video-buffer-converter) — Convert between I420 and common FourCC pixel formats (e.g., RGBA, NV12).
+- [Video Capture](/tools/video/video-capturer) — Control a camera device, configure capabilities, and deliver frames to a sink.
+
+## Desktop capture
+
+- [Screen Capturer](/tools/desktop/screen-capturer) — Enumerate and capture full desktop screens/monitors.
+- [Window Capturer](/tools/desktop/window-capturer) — Enumerate and capture individual application windows.
+- [Power Management](/tools/desktop/power-management) — Keep the display awake during capture/presentations.
+
+## How these fit together
+
+- Capture: Use Video Capture for cameras, Screen/Window Capturer for desktop sources.
+- Process/Analyze: Convert pixel formats with Video Buffer Converter; analyze audio with Voice Activity Detector.
+- I/O: Use Audio Recorder to ingest microphone PCM; Audio Player to render PCM.
+- System integration: Use Power Management to prevent the OS from sleeping during long running sessions.
+
+## Related guides
+
+- [Camera Capture](/guide/video/camera-capture)
+- [Desktop Capture](/guide/video/desktop-capture)
+- [Custom Video Source](/guide/video/custom-video-source)
+- [Audio Device Selection](/guide/audio/audio-devices)
+- [Audio Processing](/guide/audio/audio-processing)
+- [RTC Stats](/guide/monitoring/rtc-stats)
+
+For API details, see the [JavaDoc](https://javadoc.io/doc/dev.onvoid.webrtc/webrtc-java/latest/index.html).
diff --git a/docs/guide/utilities/video_buffer_converter.md b/docs/tools/video/video-buffer-converter.md
similarity index 87%
rename from docs/guide/utilities/video_buffer_converter.md
rename to docs/tools/video/video-buffer-converter.md
index d2db2110..bda9068a 100644
--- a/docs/guide/utilities/video_buffer_converter.md
+++ b/docs/tools/video/video-buffer-converter.md
@@ -9,7 +9,7 @@ API: `dev.onvoid.webrtc.media.video.VideoBufferConverter`
- Preparing frames for encoders/decoders that require specific pixel formats.
- Importing external pixel data (e.g., RGBA, NV12) into the WebRTC pipeline as I420.
-See also: [Video Capture](guide/utilities/video_capturer.md), [Custom Video Source](guide/video/custom_video_source.md).
+See also: [Video Capture](/tools/video/video-capturer), [Custom Video Source](/guide/video/custom-video-source).
## Supported operations
@@ -45,7 +45,7 @@ Attempting to convert into undersized buffers will result in an error.
## Example: Convert VideoFrame to BufferedImage
-This example demonstrates converting a WebRTC VideoFrame to a Java BufferedImage using RGBA output.
+This example demonstrates converting a WebRTC `VideoFrame` to a Java `BufferedImage` using RGBA output.
```java
import dev.onvoid.webrtc.media.FourCC;
@@ -87,8 +87,8 @@ public void onVideoFrame(VideoFrame frame) {
```
How it works:
-1. Create a BufferedImage sized to the frame.
-2. Access its backing byte[] via DataBufferByte.
+1. Create a `BufferedImage` sized to the frame.
+2. Access its backing `byte[]` via `DataBufferByte`.
3. Convert the VideoFrameBuffer from I420 to RGBA into the image buffer.
Tip: If you have a direct NIO ByteBuffer (e.g., for native interop), use the ByteBuffer overload to keep a direct native path.
@@ -133,13 +133,13 @@ public void onImage(BufferedImage image) {
```
## Error handling and edge cases
-- All methods throw NullPointerException if src/dst is null; ensure proper checks.
-- ByteBuffer destinations must be writable (not read-only) for `convertFromI420`.
+- All methods throw `NullPointerException` if src/dst is null; ensure proper checks.
+- `ByteBuffer` destinations must be writable (not read-only) for `convertFromI420`.
- Ensure the correct FourCC is used for the actual memory layout you pass/expect.
- Beware of frame rotation metadata; conversions do not rotate pixels. Handle `VideoFrame.rotation` separately if your renderer requires upright images.
## Related
-- [Video Capture](guide/utilities/video_capturer.md)
-- [Custom Video Source](guide/video/custom_video_source.md)
-- [Screen Capturer](guide/utilities/screen_capturer.md)
-- [Window Capturer](guide/utilities/window_capturer.md)
+- [Video Capture](/tools/video/video-capturer)
+- [Custom Video Source](/guide/video/custom-video-source)
+- [Screen Capturer](/tools/desktop/screen-capturer)
+- [Window Capturer](/tools/desktop/window-capturer)
diff --git a/docs/guide/utilities/video_capturer.md b/docs/tools/video/video-capturer.md
similarity index 93%
rename from docs/guide/utilities/video_capturer.md
rename to docs/tools/video/video-capturer.md
index 9edaa588..77f8d8da 100644
--- a/docs/guide/utilities/video_capturer.md
+++ b/docs/tools/video/video-capturer.md
@@ -103,8 +103,8 @@ If you need pixel format conversion, see `VideoBufferConverter`.
## Related guides
-- [Camera Capture](guide/video/camera_capture.md)
-- [Custom Video Source](guide/video/custom_video_source.md)
-- [Screen Capturer](guide/utilities/screen_capturer.md)
-- [Window Capturer](guide/utilities/window_capturer.md)
-- [Power Management](guide/utilities/power_management.md)
+- [Camera Capture](/guide/video/camera-capture)
+- [Custom Video Source](/guide/video/custom-video-source)
+- [Screen Capturer](/tools/desktop/screen-capturer)
+- [Window Capturer](/tools/desktop/window-capturer)
+- [Power Management](/tools/desktop/power-management)
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
new file mode 100644
index 00000000..fb71cb54
--- /dev/null
+++ b/docs/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "moduleResolution": "node",
+ "strict": true,
+ "jsx": "preserve"
+ },
+ "include": [
+ "**/.vitepress/**/*"
+ ]
+}
\ No newline at end of file