diff --git a/.prettierrc b/.prettierrc index d543f10fe..7c66c4a04 100644 --- a/.prettierrc +++ b/.prettierrc @@ -6,6 +6,12 @@ "options": { "proseWrap": "preserve" } + }, + { + "files": "*.md", + "options": { + "proseWrap": "preserve" + } } ], "plugins": ["prettier-plugin-organize-imports"] diff --git a/js/docs/astro.config.mjs b/js/docs/astro.config.mjs index 7c20379d1..c6fabb117 100644 --- a/js/docs/astro.config.mjs +++ b/js/docs/astro.config.mjs @@ -1,7 +1,10 @@ // @ts-check import starlight from "@astrojs/starlight"; import { defineConfig } from "astro/config"; +import starlightLinksValidator from "starlight-links-validator"; import starlightOpenAPI, { openAPISidebarGroups } from "starlight-openapi"; +import starlightSidebarSwipe from "starlight-sidebar-swipe"; +import starlightSidebarTopics from "starlight-sidebar-topics"; // https://astro.build/config export default defineConfig({ @@ -29,6 +32,53 @@ export default defineConfig({ }, favicon: "/favicon.ico", plugins: [ + starlightLinksValidator(), + starlightSidebarSwipe(), + starlightSidebarTopics([ + { + label: "For Streamers & Viewers", + link: "/", + icon: "open-book", + items: [ + { + label: "Start Streaming", + autogenerate: { directory: "guides/start-streaming" }, + }, + { + label: "Features", + autogenerate: { directory: "features" }, + }, + ], + }, + { + label: "For Developers", + link: "/developers/", + icon: "seti:config", + items: [ + { + label: "Start Contributing", + autogenerate: { directory: "guides/start-contributing" }, + }, + { + label: "Installing Streamplace", + autogenerate: { directory: "guides/installing" }, + }, + { + label: "Video Metadata", + autogenerate: { directory: "video-metadata" }, + }, + { + label: "Components", + autogenerate: { directory: "components" }, + }, + { + label: "Lexicon Reference", + autogenerate: { directory: "lex-reference" }, + }, + ...openAPISidebarGroups, + ], + }, + ]), starlightOpenAPI([ { base: "api", @@ -43,48 +93,6 @@ export default defineConfig({ }, ]), ], - sidebar: [ - { label: "← Back to Streamplace", link: "/../" }, - { - label: "How Streamplace Works (Blog)", - link: "https://blog.stream.place/", - attrs: { target: "_blank" }, - }, - { - label: "Guides", - items: [ - { - label: "Start Streaming", - autogenerate: { directory: "guides/start-streaming" }, - }, - { - label: "Installing Streamplace", - autogenerate: { directory: "guides/installing" }, - }, - { - label: "Start Contributing", - autogenerate: { directory: "guides/start-contributing" }, - }, - ], - }, - { - label: "Features", - autogenerate: { directory: "features" }, - }, - { - label: "Video Metadata", - autogenerate: { directory: "video-metadata" }, - }, - { - label: "Components", - autogenerate: { directory: "components" }, - }, - { - label: "Lexicon Reference", - autogenerate: { directory: "lex-reference" }, - }, - ...openAPISidebarGroups, - ], }), ], }); diff --git a/js/docs/package.json b/js/docs/package.json index 44dc05586..8992f51e8 100644 --- a/js/docs/package.json +++ b/js/docs/package.json @@ -15,8 +15,13 @@ "@streamplace/app": "workspace:*", "astro": "^5.6.1", "sharp": "^0.32.5", + "starlight-links-validator": "^0.19.2", "starlight-openapi": "^0.17.0", "starlight-openapi-rapidoc": "^0.8.1-beta", + "starlight-sidebar-swipe": "^0.1.1", "streamplace": "workspace:*" + }, + "devDependencies": { + "starlight-sidebar-topics": "^0.6.2" } } diff --git a/js/docs/src/components/HelpDesk.astro b/js/docs/src/components/HelpDesk.astro new file mode 100644 index 000000000..cddb65f09 --- /dev/null +++ b/js/docs/src/components/HelpDesk.astro @@ -0,0 +1,60 @@ +--- +import { Card, CardGrid } from "@astrojs/starlight/components"; + +interface Props { + searchPlaceholder?: string; +} +--- + +
+ +

How can we help?

+

Search the knowledge base, or check out topics below.

+ + + +

New to Streamplace? Start here to set up your first stream.

+ +
+ + +

Building with Streamplace or running your own node?

+ +
+
+
+ + diff --git a/js/docs/src/content/docs/components/custom_ui.md b/js/docs/src/content/docs/components/custom_ui.md index 6baac05f5..cafe1dc38 100644 --- a/js/docs/src/content/docs/components/custom_ui.md +++ b/js/docs/src/content/docs/components/custom_ui.md @@ -1,7 +1,6 @@ --- title: Creating your own player UI -description: - How to set up your player UI with components from @streamplace/components. +description: How to set up your player UI with components from @streamplace/components. --- # Building a Custom Player UI diff --git a/js/docs/src/content/docs/developers.mdx b/js/docs/src/content/docs/developers.mdx new file mode 100644 index 000000000..ef34bc678 --- /dev/null +++ b/js/docs/src/content/docs/developers.mdx @@ -0,0 +1,37 @@ +--- +title: Developers & Self-Hosters +description: Build with Streamplace or run your own infrastructure. +template: doc +--- + +import { Card, CardGrid } from "@astrojs/starlight/components"; + +## Learn how to deploy, or contribute to Streamplace. + +
+mu + + + + Integrate live video into your project. - [API + reference](/docs/lex-reference/place-stream-defs) - [Our component + library](/docs/components/custom_ui/) + + + + Run your own Streamplace infrastructure. - [Installation + guide](/docs/guides/installing/installing-streamplace) + + + + Help improve Streamplace. - [Development + setup](/docs/guides/streamplace-dev-setup) - [Video + signing](/docs/video-metadata/intro/) + + + + Get help and connect with other developers. - [GitHub + issues](https://github.com/streamplace/streamplace/issues) - [Discord + community](https://discord.stream.place) + + diff --git a/js/docs/src/content/docs/features/danmu.md b/js/docs/src/content/docs/features/danmu.md index 88ed7dc6b..e8b905071 100644 --- a/js/docs/src/content/docs/features/danmu.md +++ b/js/docs/src/content/docs/features/danmu.md @@ -3,7 +3,9 @@ title: Danmu Overlay description: Add flying bullet-style chat comments to the player, or your stream --- -:::note This feature is experimental and may change in future releases. ::: +:::note +This feature is experimental and may change in future releases. +::: [Danmu (or Danmaku)](https://en.wikipedia.org/wiki/Danmaku_subtitling) (弹幕, "bullet curtain") is a comment style where messages fly across the video diff --git a/js/docs/src/content/docs/guides/start-streaming/embed.md b/js/docs/src/content/docs/features/embed.md similarity index 100% rename from js/docs/src/content/docs/guides/start-streaming/embed.md rename to js/docs/src/content/docs/features/embed.md diff --git a/js/docs/src/content/docs/features/multistreaming.md b/js/docs/src/content/docs/features/multistreaming.md new file mode 100644 index 000000000..5b6dac2bd --- /dev/null +++ b/js/docs/src/content/docs/features/multistreaming.md @@ -0,0 +1,52 @@ +--- +title: Multistreaming +description: Forward your Streamplace stream to other providers. +--- + +:::note +This guide isn't about setting up Streamplace as an OBS destination. See [OBS Multistreaming to Streamplace](/docs/guides/start-streaming/obs-multistreaming/) for information on that. +::: + +Multistreaming lets you forward your Streamplace stream to multiple platforms at the same time. Instead of streaming only to Streamplace, you can forward your stream to any platform that accepts RTMP input. + +## Setting up multistream targets + +1. Go to **Settings** > **Streaming** > **Multistream Targets** +2. Click **Create Multistream Target** +3. Enter the RTMP or RTMPS URL from your destination platform +4. Optionally give it a name to identify it later +5. Click **Create** + +### Finding your multistream URL + +Different platforms will provide their own RTMP URLs. Some common examples: + +- **YouTube Live**: Format `rtmp://a.rtmp.youtube.com/live2/your-stream-key` + - Find your stream key at https://studio.youtube.com/channel/UC/livestreaming (click the copy icon in the top right corner of the 'connect your encoder to go live' box) +- **Twitch**: Format `rtmp://usw20.contribute.live-video.net/app/your-stream-key` + - You can get a valid RTMPS url at https://help.twitch.tv/s/twitch-ingest-recommendation + - Find your stream key at https://dashboard.twitch.tv/settings/stream (your 'primary stream key') + +:::note +Your stream key should automatically be hidden once you confirm. Make sure you've entered it correctly! +::: + +## Managing targets during a stream + +When you're live, you can see all your multistream targets on the Live Dashboard with their current status: + +- **Green (Active)**: Successfully streaming to this target +- **Yellow (Pending)**: Connecting to this target +- **Red (Error)**: Connection failed; check your URL and credentials +- **Gray (Inactive)**: This target is disabled + +You can toggle any target on or off with the switch next to its name. Changes take effect immediately. + +## Limits + +- **Maximum targets**: 100 total per account +- **Maximum active targets**: 5 simultaneous streams + +### Credits + +A portion of this documentation was taken from [ndroo.dev](https://bsky.app/profile/ndroo.tv)'s [guide on Streamplace](https://ndroo.tv/streamplace.html#2-configuring-your-account). diff --git a/js/docs/src/content/docs/guides/start-streaming/discord-hooks.md b/js/docs/src/content/docs/features/webhooks.md similarity index 97% rename from js/docs/src/content/docs/guides/start-streaming/discord-hooks.md rename to js/docs/src/content/docs/features/webhooks.md index f261b7e9f..9278c7384 100644 --- a/js/docs/src/content/docs/guides/start-streaming/discord-hooks.md +++ b/js/docs/src/content/docs/features/webhooks.md @@ -5,7 +5,7 @@ sidebar: order: 30 --- -Streamplace supports Discord webhook integration for receiving livestream +Streamplace supports Discord webhooks for receiving livestream notifications and chat messages. You can create, manage, and configure webhooks to customize how events are delivered to your Discord channels. diff --git a/js/docs/src/content/docs/guides/start-contributing/styling-quick-reference.md b/js/docs/src/content/docs/guides/start-contributing/styling-quick-reference.md index d264a2658..2c34c453c 100644 --- a/js/docs/src/content/docs/guides/start-contributing/styling-quick-reference.md +++ b/js/docs/src/content/docs/guides/start-contributing/styling-quick-reference.md @@ -1,7 +1,6 @@ --- title: ZeroCSS Quick Reference -description: - Quick reference for Streamplace ZeroCSS - common patterns and utilities. +description: Quick reference for Streamplace ZeroCSS - common patterns and utilities. sidebar: order: 31 --- diff --git a/js/docs/src/content/docs/guides/start-streaming/obs-multistreaming.md b/js/docs/src/content/docs/guides/start-streaming/obs-multistreaming.md index 3305768ec..0b80ddfab 100644 --- a/js/docs/src/content/docs/guides/start-streaming/obs-multistreaming.md +++ b/js/docs/src/content/docs/guides/start-streaming/obs-multistreaming.md @@ -1,5 +1,5 @@ --- -title: OBS Multistreaming with Streamplace +title: OBS Multistreaming to Streamplace description: Configure OBS for multistreaming to Streamplace and other platforms using the obs-multi-rtmp plugin. @@ -7,6 +7,12 @@ sidebar: order: 20 --- +:::note +This guide is not about the multistreaming feature. Check +[the multistreaming guide](/docs/features/multistreaming) out for more +information. +::: + This guide explains how to configure Open Broadcaster Software (OBS) for simultaneous streaming to Streamplace and other platforms using the `obs-multi-rtmp` plugin. diff --git a/js/docs/src/content/docs/guides/start-streaming/obs.md b/js/docs/src/content/docs/guides/start-streaming/obs.md index ff4792f16..c48602040 100644 --- a/js/docs/src/content/docs/guides/start-streaming/obs.md +++ b/js/docs/src/content/docs/guides/start-streaming/obs.md @@ -63,11 +63,15 @@ sidebar: #### 2e. Suggested Video Encoder Settings - Rate Control: `CBR` -- Keyframe Interval: `1s` +- Keyframe Interval: `1s` (or anything less than once every ~7s) - x264 Options: `bframes=0` - If available, there also may be a 'no bframes' checkbox which should be checked +:::caution +These last two options are very important! Your viewers' experience may be choppy or otherwise subpar if you don't have them correct. +::: + ### 3. Announce your stream 1. Once you're live, go back to the live dashboard. @@ -85,6 +89,9 @@ OBS supports multi-streaming through two available OBS plugins: 2. [**Aitum Multistream Plugin**](https://aitum.tv/products/multi) +Alternatively, you can +[multistream through Streamplace itself.](/docs/features/multistreaming) + ## Best Practices - Test your stream settings before going live diff --git a/js/docs/src/content/docs/guides/start-streaming/quick-start.md b/js/docs/src/content/docs/guides/start-streaming/quick-start.md new file mode 100644 index 000000000..f5fb9480f --- /dev/null +++ b/js/docs/src/content/docs/guides/start-streaming/quick-start.md @@ -0,0 +1,73 @@ +--- +title: Quick Start +description: Get up and streaming on Streamplace quickly. +sidebar: + order: 1 +--- + +This guide gets you from zero to streaming. If you get stuck, check out the full [OBS setup guide](/docs/guides/start-streaming/obs). + +:::tip +You will want to check out our [community guidelines](https://blog.stream.place/3mcqwibo4ks2w) first for guidance on what you can and cannot do on Streamplace. +::: + +## So, what is Streamplace? + +Streamplace is a video streaming service built on top of the AT Protocol (Authenticated Transfer Protocol), the same protocol Bluesky is built on. + +## Step 1: Create your account + +1. Go to [stream.place](https://stream.place) +2. Click "Sign in" in the top right. +3. Use your Atmosphere credentials to log in (ex. your Bluesky handle) + - You'll need to use your actual password here - we're using OAuth so you enter your password on your PDS. We do not receive your password at all. +4. You're done! Your stream profile is live at `stream.place/your-handle` + +## Step 2: Get your stream key + +1. Click **Live Dashboard** (or go to [stream.place/dashboard](https://stream.place/dashboard)) +2. Click **Stream from OBS** +3. Click **Generate Stream Key** +4. Your key is copied to clipboard automatically + +Keep this key private. It's like a password, but for your stream. + +## Step 3: Configure OBS + +Open OBS and go to **Settings → Stream**: + +- **Service**: `Custom...` +- **Server**: `rtmps://stream.place:1935/live` +- **Stream Key**: Paste what you copied in Step 2 + +Then go to **Settings → Output → Streaming**: + +- **Video Encoder**: `libx264` (or `NVIDIA NVENC H.264` if you have an NVIDIA GPU) +- **Rate Control**: `CBR` +- **Bitrate**: `6000` Kbps (adjust down if you drop frames) +- **Keyframe Interval**: `1` +- **x264 Options**: `bframes=0`. If there's a 'bframes' option, you'll want to have that at '0' or unchecked. + +:::caution +These last two options are very important! Your viewers' experience may be choppy or otherwise subpar if you don't have them correct. +::: + +## Step 4: Go live + +1. In OBS, click **Start Streaming** +2. Go back to the Live Dashboard at stream.place +3. Fill in your stream title and optionally pick a thumbnail8 +4. If needed, turn on content warnings. ("Metadata" tab in Stream Settings) +5. Click **Announce Livestream** +6. Your stream is now live and visible to the world! + +## Next steps + +- **Customize your chat**: Change your name color in Settings > Account +- **Stream to other platforms too**: Set your Twitch/YouTube URLs in Settings > Multistream Targets to push your stream there automatically. See the [Multistreaming guide](/docs/features/multistreaming) for more information +- **Improve stream quality**: See the [OBS guide](/docs/guides/start-streaming/obs) for encoder settings and troubleshooting +- **Join the Discord!**: If you need any help, or just want to chat, check out our discord at https://discord.stream.place. + +### Credits + +A portion of this documentation was taken from [ndroo.dev](https://bsky.app/profile/ndroo.tv)'s excellent [guide on Streamplace](https://ndroo.tv/streamplace.html#2-configuring-your-account). diff --git a/js/docs/src/content/docs/index.mdx b/js/docs/src/content/docs/index.mdx index 0aa181e7d..fe84bf87e 100644 --- a/js/docs/src/content/docs/index.mdx +++ b/js/docs/src/content/docs/index.mdx @@ -2,38 +2,8 @@ title: Welcome to Streamplace! description: Begin your development journey with the Streamplace documentation. template: doc -hero: - tagline: Solve live video for your project with Streamplace. - image: - file: ../../assets/cube.png - alt: Streamplace logo. A pink 3d box viewed from a top corner. - actions: - - text: Get Started - link: /docs/guides/start-streaming/obs - icon: right-arrow - - text: Visit Streamplace - link: / - icon: external - variant: minimal --- -import { Card, CardGrid } from "@astrojs/starlight/components"; +import HelpDesk from "../../components/HelpDesk.astro"; -## Next Steps - - - - Learn how to start streaming with - [Streamplace](/docs/guides/start-streaming/obs). - - - [Run your own Streamplace - node](/docs/guides/installing/installing-streamplace). - - - Explore the [Lexicon API reference](/docs/lex-reference/place-stream-defs). - - - Set up your [development environment](/docs/guides/streamplace-dev-setup). - - + diff --git a/js/docs/src/content/docs/lex-reference/livestream/place-stream-livestream-update.md b/js/docs/src/content/docs/lex-reference/livestream/place-stream-livestream-update.md deleted file mode 100644 index 430878fa1..000000000 --- a/js/docs/src/content/docs/lex-reference/livestream/place-stream-livestream-update.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: place.stream.livestream.update -description: Reference for the place.stream.livestream.update lexicon ---- - -**Lexicon Version:** 1 - -## Definitions - - - -### `main` - -**Type:** `procedure` - -Update livestream metadata on behalf of a streamer. Requires 'livestream.manage' -permission. Updates a place.stream.livestream record in the streamer's -repository. - -**Parameters:** _(None defined)_ - -**Input:** - -- **Encoding:** `application/json` -- **Schema:** - -**Schema Type:** `object` - -| Name | Type | Req'd | Description | Constraints | -| --------------- | -------- | ----- | ---------------------------------------------- | --------------------------------------- | -| `streamer` | `string` | ✅ | The DID of the streamer. | Format: `did` | -| `livestreamUri` | `string` | ✅ | The AT-URI of the livestream record to update. | Format: `at-uri` | -| `title` | `string` | ❌ | New title for the livestream. | Max Length: 1400
Max Graphemes: 140 | - -**Output:** - -- **Encoding:** `application/json` -- **Schema:** - -**Schema Type:** `object` - -| Name | Type | Req'd | Description | Constraints | -| ----- | -------- | ----- | -------------------------------------------- | ---------------- | -| `uri` | `string` | ✅ | The AT-URI of the updated livestream record. | Format: `at-uri` | -| `cid` | `string` | ✅ | The CID of the updated livestream record. | Format: `cid` | - -**Possible Errors:** - -- `Unauthorized`: The request lacks valid authentication credentials. -- `Forbidden`: The caller does not have permission to update livestream metadata - for this streamer. -- `SessionNotFound`: The streamer's OAuth session could not be found or is - invalid. -- `RecordNotFound`: The specified livestream record does not exist. - ---- - -## Lexicon Source - -```json -{ - "lexicon": 1, - "id": "place.stream.livestream.update", - "defs": { - "main": { - "type": "procedure", - "description": "Update livestream metadata on behalf of a streamer. Requires 'livestream.manage' permission. Updates a place.stream.livestream record in the streamer's repository.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["streamer", "livestreamUri"], - "properties": { - "streamer": { - "type": "string", - "format": "did", - "description": "The DID of the streamer." - }, - "livestreamUri": { - "type": "string", - "format": "at-uri", - "description": "The AT-URI of the livestream record to update." - }, - "title": { - "type": "string", - "maxLength": 1400, - "maxGraphemes": 140, - "description": "New title for the livestream." - } - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["uri", "cid"], - "properties": { - "uri": { - "type": "string", - "format": "at-uri", - "description": "The AT-URI of the updated livestream record." - }, - "cid": { - "type": "string", - "format": "cid", - "description": "The CID of the updated livestream record." - } - } - } - }, - "errors": [ - { - "name": "Unauthorized", - "description": "The request lacks valid authentication credentials." - }, - { - "name": "Forbidden", - "description": "The caller does not have permission to update livestream metadata for this streamer." - }, - { - "name": "SessionNotFound", - "description": "The streamer's OAuth session could not be found or is invalid." - }, - { - "name": "RecordNotFound", - "description": "The specified livestream record does not exist." - } - ] - } - } -} -``` diff --git a/js/docs/src/content/docs/lex-reference/multistream/com-atproto-repo-deletetarget.md b/js/docs/src/content/docs/lex-reference/multistream/com-atproto-repo-deletetarget.md deleted file mode 100644 index bfc85db8e..000000000 --- a/js/docs/src/content/docs/lex-reference/multistream/com-atproto-repo-deletetarget.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: com.atproto.repo.deleteTarget -description: Reference for the com.atproto.repo.deleteTarget lexicon ---- - -**Lexicon Version:** 1 - -## Definitions - - - -### `main` - -**Type:** `procedure` - -Delete a target for rebroadcasting a Streamplace stream. - -**Parameters:** _(None defined)_ - -**Input:** - -- **Encoding:** `application/json` -- **Schema:** - -**Schema Type:** `object` - -| Name | Type | Req'd | Description | Constraints | -| ------ | -------- | ----- | --------------------------------------- | -------------------- | -| `rkey` | `string` | ✅ | The Record Key of the target to delete. | Format: `record-key` | - -**Output:** - -- **Encoding:** `application/json` -- **Schema:** - -**Schema Type:** `object` - -_(No properties defined)_ - ---- - -## Lexicon Source - -```json -{ - "lexicon": 1, - "id": "com.atproto.repo.deleteTarget", - "defs": { - "main": { - "type": "procedure", - "description": "Delete a target for rebroadcasting a Streamplace stream.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["rkey"], - "properties": { - "rkey": { - "type": "string", - "format": "record-key", - "description": "The Record Key of the target to delete." - } - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "properties": {} - } - }, - "errors": [] - } - } -} -``` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be3cfc3bf..033c48106 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -725,15 +725,25 @@ importers: sharp: specifier: ^0.32.5 version: 0.32.6 + starlight-links-validator: + specifier: ^0.19.2 + version: 0.19.2(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)))(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)) starlight-openapi: specifier: ^0.17.0 version: 0.17.0(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)))(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2))(openapi-types@12.1.3) starlight-openapi-rapidoc: specifier: ^0.8.1-beta version: 0.8.1-beta(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)))(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2))(openapi-types@12.1.3) + starlight-sidebar-swipe: + specifier: ^0.1.1 + version: 0.1.1(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2))) streamplace: specifier: workspace:* version: link:../streamplace + devDependencies: + starlight-sidebar-topics: + specifier: ^0.6.2 + version: 0.6.2(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2))) js/streamplace: dependencies: @@ -4903,6 +4913,9 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/picomatch@3.0.2': + resolution: {integrity: sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -7902,6 +7915,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -8352,6 +8369,10 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -11754,6 +11775,13 @@ packages: standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + starlight-links-validator@0.19.2: + resolution: {integrity: sha512-IHeK3R78fsmv53VfRkGbXkwK1CQEUBHM9QPzBEyoAxjZ/ssi5gjV+F4oNNUppTR48iPp+lEY0MTAmvkX7yNnkw==} + engines: {node: '>=18.17.1'} + peerDependencies: + '@astrojs/starlight': '>=0.32.0' + astro: '>=5.1.5' + starlight-openapi-rapidoc@0.8.1-beta: resolution: {integrity: sha512-CicjuydKZsO8jZvhrtzz+GGWyfHnOZCZY/ww562H58CP/zSnskWcmcgVnCuD7DkKfi0ofvqumyyee1KgfkVipQ==} engines: {node: '>=18.14.1'} @@ -11769,6 +11797,18 @@ packages: '@astrojs/starlight': '>=0.34.0' astro: '>=5.5.0' + starlight-sidebar-swipe@0.1.1: + resolution: {integrity: sha512-Q+xv7LSpSLCG3yQaEmZX4Qpks9dcIEc+FBA0Ql+LbLMO9IMBXt8S2zK5wJDhjJn5lbI0i0ipyP375T1GrVS8ig==} + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + peerDependencies: + '@astrojs/starlight': '>=0.30' + + starlight-sidebar-topics@0.6.2: + resolution: {integrity: sha512-SNCTUZS/hcVor0ZcaXbaSVU37+V+qtvzNirkvnOg3Mqu/awuGpthkH5+uKpiZqWxLffp6TrOlsv5E5QsxrndNg==} + engines: {node: '>=18'} + peerDependencies: + '@astrojs/starlight': '>=0.32.0' + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -11976,6 +12016,10 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -11992,6 +12036,10 @@ packages: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} + supports-hyperlinks@4.4.0: + resolution: {integrity: sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==} + engines: {node: '>=20'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -12055,6 +12103,10 @@ packages: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} + terminal-link@5.0.0: + resolution: {integrity: sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==} + engines: {node: '>=20'} + terser-webpack-plugin@5.3.10: resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -19467,6 +19519,8 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/picomatch@3.0.2': {} + '@types/prop-types@15.7.12': {} '@types/qrcode@1.5.5': @@ -23318,6 +23372,8 @@ snapshots: has-flag@4.0.0: {} + has-flag@5.0.1: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 @@ -23992,6 +24048,8 @@ snapshots: iron-webcrypto@1.2.1: {} + is-absolute-url@4.0.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -28424,6 +28482,24 @@ snapshots: standard-as-callback@2.1.0: {} + starlight-links-validator@0.19.2(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)))(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)): + dependencies: + '@astrojs/starlight': 0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)) + '@types/picomatch': 3.0.2 + astro: 5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2) + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-has-property: 3.0.0 + is-absolute-url: 4.0.1 + kleur: 4.1.5 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-string: 4.0.0 + picomatch: 4.0.2 + terminal-link: 5.0.0 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + starlight-openapi-rapidoc@0.8.1-beta(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)))(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2))(openapi-types@12.1.3): dependencies: '@astrojs/starlight': 0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)) @@ -28445,6 +28521,15 @@ snapshots: transitivePeerDependencies: - openapi-types + starlight-sidebar-swipe@0.1.1(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2))): + dependencies: + '@astrojs/starlight': 0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)) + + starlight-sidebar-topics@0.6.2(@astrojs/starlight@0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2))): + dependencies: + '@astrojs/starlight': 0.34.2(astro@5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(ioredis@5.7.0)(jiti@2.6.1)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.8.2)) + picomatch: 4.0.2 + statuses@1.5.0: {} statuses@2.0.1: {} @@ -28658,6 +28743,8 @@ snapshots: transitivePeerDependencies: - supports-color + supports-color@10.2.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -28675,6 +28762,11 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 + supports-hyperlinks@4.4.0: + dependencies: + has-flag: 5.0.1 + supports-color: 10.2.2 + supports-preserve-symlinks-flag@1.0.0: {} swc-walk@1.0.1: @@ -28770,6 +28862,11 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 + terminal-link@5.0.0: + dependencies: + ansi-escapes: 7.0.0 + supports-hyperlinks: 4.4.0 + terser-webpack-plugin@5.3.10(@swc/core@1.15.4(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.15.4(@swc/helpers@0.5.17))): dependencies: '@jridgewell/trace-mapping': 0.3.25