From 439b2332c1341d8e8374f0ccbf868e61f5c945d2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 16 May 2026 12:52:55 +0000 Subject: [PATCH 1/2] feat(demo): add MDsveX /docs with enhanced-video-sveltekit guide --- apps/demo/package.json | 3 + .../src/lib/docs/DocsInstallSwitcher.svelte | 51 ++ .../demo/src/lib/docs/DocsVideoFeature.svelte | 17 + apps/demo/src/lib/mdsvex/Callout.svelte | 32 + .../src/lib/mdsvex/MdsvexArticleLayout.svelte | 98 +++ apps/demo/src/lib/mdsvex/md/MdA.svelte | 25 + .../src/lib/mdsvex/md/MdBlockquote.svelte | 5 + apps/demo/src/lib/mdsvex/md/MdH1.svelte | 3 + apps/demo/src/lib/mdsvex/md/MdH2.svelte | 5 + apps/demo/src/lib/mdsvex/md/MdH3.svelte | 3 + apps/demo/src/lib/mdsvex/md/MdHr.svelte | 1 + apps/demo/src/lib/mdsvex/md/MdLi.svelte | 1 + apps/demo/src/lib/mdsvex/md/MdOl.svelte | 3 + apps/demo/src/lib/mdsvex/md/MdP.svelte | 1 + apps/demo/src/lib/mdsvex/md/MdPre.svelte | 3 + apps/demo/src/lib/mdsvex/md/MdStrong.svelte | 1 + apps/demo/src/lib/mdsvex/md/MdTable.svelte | 7 + apps/demo/src/lib/mdsvex/md/MdTd.svelte | 1 + apps/demo/src/lib/mdsvex/md/MdTh.svelte | 5 + apps/demo/src/lib/mdsvex/md/MdThead.svelte | 5 + apps/demo/src/lib/mdsvex/md/MdTr.svelte | 5 + apps/demo/src/lib/mdsvex/md/MdUl.svelte | 3 + apps/demo/src/routes/+page.svelte | 18 +- apps/demo/src/routes/docs/+layout.svelte | 44 ++ apps/demo/src/routes/docs/+page.svx | 187 +++++ apps/demo/svelte.config.js | 28 +- pnpm-lock.yaml | 689 ++++++++++++++++++ 27 files changed, 1237 insertions(+), 7 deletions(-) create mode 100644 apps/demo/src/lib/docs/DocsInstallSwitcher.svelte create mode 100644 apps/demo/src/lib/docs/DocsVideoFeature.svelte create mode 100644 apps/demo/src/lib/mdsvex/Callout.svelte create mode 100644 apps/demo/src/lib/mdsvex/MdsvexArticleLayout.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdA.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdBlockquote.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdH1.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdH2.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdH3.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdHr.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdLi.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdOl.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdP.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdPre.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdStrong.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdTable.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdTd.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdTh.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdThead.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdTr.svelte create mode 100644 apps/demo/src/lib/mdsvex/md/MdUl.svelte create mode 100644 apps/demo/src/routes/docs/+layout.svelte create mode 100644 apps/demo/src/routes/docs/+page.svx diff --git a/apps/demo/package.json b/apps/demo/package.json index bc39d89..49a5784 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -27,6 +27,9 @@ "bits-ui": "^2.18.1", "clsx": "^2.1.1", "enhanced-video-sveltekit": "workspace:*", + "mdsvex": "^0.12.7", + "prism-themes": "^1.9.0", + "remark-gfm": "^4.0.1", "shadcn-svelte": "^1.2.7", "svelte": "^5.0.0", "svelte-check": "^4.0.0", diff --git a/apps/demo/src/lib/docs/DocsInstallSwitcher.svelte b/apps/demo/src/lib/docs/DocsInstallSwitcher.svelte new file mode 100644 index 0000000..444ff78 --- /dev/null +++ b/apps/demo/src/lib/docs/DocsInstallSwitcher.svelte @@ -0,0 +1,51 @@ + + +
+ + + Example +
+ + +
+
+ + {#if tab === 'cli'} +
+
+ shell + Install into a SvelteKit app +
+
pnpm add -D enhanced-video-sveltekit
+
+ {:else} +
+
+ vite.config.ts + Plugin order matters +
+
plugins: [tailwindcss(), enhancedVideos(), sveltekit()]
+
+ {/if} +
+
+
diff --git a/apps/demo/src/lib/docs/DocsVideoFeature.svelte b/apps/demo/src/lib/docs/DocsVideoFeature.svelte new file mode 100644 index 0000000..1329759 --- /dev/null +++ b/apps/demo/src/lib/docs/DocsVideoFeature.svelte @@ -0,0 +1,17 @@ +
+
+

+ Live clip (build pipeline) +

+
+ +
diff --git a/apps/demo/src/lib/mdsvex/Callout.svelte b/apps/demo/src/lib/mdsvex/Callout.svelte new file mode 100644 index 0000000..1695c0e --- /dev/null +++ b/apps/demo/src/lib/mdsvex/Callout.svelte @@ -0,0 +1,32 @@ + + + + {title} + + {@render children()} + + diff --git a/apps/demo/src/lib/mdsvex/MdsvexArticleLayout.svelte b/apps/demo/src/lib/mdsvex/MdsvexArticleLayout.svelte new file mode 100644 index 0000000..310ad67 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/MdsvexArticleLayout.svelte @@ -0,0 +1,98 @@ + + + + +
+
+
+ + SvelteKit + + + Vite + +
+

{title}

+ {#if description} +

{description}

+ {/if} + {#if updated} +

Last updated

+ {/if} +
+ +
+ {@render children()} +
+ + + + +
diff --git a/apps/demo/src/lib/mdsvex/md/MdA.svelte b/apps/demo/src/lib/mdsvex/md/MdA.svelte new file mode 100644 index 0000000..e25b7b1 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdA.svelte @@ -0,0 +1,25 @@ + + + + {#if children}{@render children()}{/if} + diff --git a/apps/demo/src/lib/mdsvex/md/MdBlockquote.svelte b/apps/demo/src/lib/mdsvex/md/MdBlockquote.svelte new file mode 100644 index 0000000..2adf9db --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdBlockquote.svelte @@ -0,0 +1,5 @@ +
+ +
diff --git a/apps/demo/src/lib/mdsvex/md/MdH1.svelte b/apps/demo/src/lib/mdsvex/md/MdH1.svelte new file mode 100644 index 0000000..3f34d6b --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdH1.svelte @@ -0,0 +1,3 @@ +

+ +

diff --git a/apps/demo/src/lib/mdsvex/md/MdH2.svelte b/apps/demo/src/lib/mdsvex/md/MdH2.svelte new file mode 100644 index 0000000..efa94a4 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdH2.svelte @@ -0,0 +1,5 @@ +

+ +

diff --git a/apps/demo/src/lib/mdsvex/md/MdH3.svelte b/apps/demo/src/lib/mdsvex/md/MdH3.svelte new file mode 100644 index 0000000..8d986bf --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdH3.svelte @@ -0,0 +1,3 @@ +

+ +

diff --git a/apps/demo/src/lib/mdsvex/md/MdHr.svelte b/apps/demo/src/lib/mdsvex/md/MdHr.svelte new file mode 100644 index 0000000..8db62d6 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdHr.svelte @@ -0,0 +1 @@ +
diff --git a/apps/demo/src/lib/mdsvex/md/MdLi.svelte b/apps/demo/src/lib/mdsvex/md/MdLi.svelte new file mode 100644 index 0000000..49be709 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdLi.svelte @@ -0,0 +1 @@ +
  • diff --git a/apps/demo/src/lib/mdsvex/md/MdOl.svelte b/apps/demo/src/lib/mdsvex/md/MdOl.svelte new file mode 100644 index 0000000..a5a82bd --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdOl.svelte @@ -0,0 +1,3 @@ +
      + +
    diff --git a/apps/demo/src/lib/mdsvex/md/MdP.svelte b/apps/demo/src/lib/mdsvex/md/MdP.svelte new file mode 100644 index 0000000..377ff67 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdP.svelte @@ -0,0 +1 @@ +

    diff --git a/apps/demo/src/lib/mdsvex/md/MdPre.svelte b/apps/demo/src/lib/mdsvex/md/MdPre.svelte new file mode 100644 index 0000000..5505124 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdPre.svelte @@ -0,0 +1,3 @@ +
    diff --git a/apps/demo/src/lib/mdsvex/md/MdStrong.svelte b/apps/demo/src/lib/mdsvex/md/MdStrong.svelte new file mode 100644 index 0000000..5fdbce5 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdStrong.svelte @@ -0,0 +1 @@ + diff --git a/apps/demo/src/lib/mdsvex/md/MdTable.svelte b/apps/demo/src/lib/mdsvex/md/MdTable.svelte new file mode 100644 index 0000000..766607c --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdTable.svelte @@ -0,0 +1,7 @@ +
    + + +
    +
    diff --git a/apps/demo/src/lib/mdsvex/md/MdTd.svelte b/apps/demo/src/lib/mdsvex/md/MdTd.svelte new file mode 100644 index 0000000..aab62a4 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdTd.svelte @@ -0,0 +1 @@ + diff --git a/apps/demo/src/lib/mdsvex/md/MdTh.svelte b/apps/demo/src/lib/mdsvex/md/MdTh.svelte new file mode 100644 index 0000000..338a22a --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdTh.svelte @@ -0,0 +1,5 @@ + + + diff --git a/apps/demo/src/lib/mdsvex/md/MdThead.svelte b/apps/demo/src/lib/mdsvex/md/MdThead.svelte new file mode 100644 index 0000000..04e65d2 --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdThead.svelte @@ -0,0 +1,5 @@ + + + diff --git a/apps/demo/src/lib/mdsvex/md/MdTr.svelte b/apps/demo/src/lib/mdsvex/md/MdTr.svelte new file mode 100644 index 0000000..f41e05a --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdTr.svelte @@ -0,0 +1,5 @@ + + + diff --git a/apps/demo/src/lib/mdsvex/md/MdUl.svelte b/apps/demo/src/lib/mdsvex/md/MdUl.svelte new file mode 100644 index 0000000..05aa7ff --- /dev/null +++ b/apps/demo/src/lib/mdsvex/md/MdUl.svelte @@ -0,0 +1,3 @@ +
      + +
    diff --git a/apps/demo/src/routes/+page.svelte b/apps/demo/src/routes/+page.svelte index e06dd54..ecdaff0 100644 --- a/apps/demo/src/routes/+page.svelte +++ b/apps/demo/src/routes/+page.svelte @@ -20,12 +20,18 @@ > enhanced-video-sveltekit - GitHub ↗ +
    diff --git a/apps/demo/src/routes/docs/+layout.svelte b/apps/demo/src/routes/docs/+layout.svelte new file mode 100644 index 0000000..f0eab65 --- /dev/null +++ b/apps/demo/src/routes/docs/+layout.svelte @@ -0,0 +1,44 @@ + + +
    + +
    + +
    + +
    + {@render children()} +
    +
    diff --git a/apps/demo/src/routes/docs/+page.svx b/apps/demo/src/routes/docs/+page.svx new file mode 100644 index 0000000..ef274d5 --- /dev/null +++ b/apps/demo/src/routes/docs/+page.svx @@ -0,0 +1,187 @@ +--- +title: enhanced-video-sveltekit +description: Build-time video pipeline for SvelteKit — multi-format transcodes, auto poster, lazy loading, and a single custom element in your markup. +updated: '2026-05-16' +--- + + + + + {title} — documentation + + + +## Overview + +**enhanced-video-sveltekit** is a pair of Vite plugins (markup transform + virtual module loader) that turn a single custom element in your Svelte files into **encoded video variants**, an **auto-extracted poster** (`jpg` plus optional `webp` / `avif`), and a small **runtime component** that handles lazy loading, optional click-to-play, autoplay discipline, and poster fade tied to real playback. + +You write a static tag with a **string literal** `src`; the build probes the file with ffprobe, runs ffmpeg for each selected format and resolution, deduplicates work via a **content-hashed disk cache**, and emits optimized assets. The browser receives `` for the poster and ordered `` elements so it picks the first format it can play. + + + +The package on npm is **`enhanced-video-sveltekit`**. Internal names (`?enhanced-video`, `/@enhanced-video/`, cache folder `enhanced-video`) stay short on purpose. + + + +## Requirements + +| Requirement | Notes | +| --- | --- | +| **Node** | ≥ 18 | +| **Svelte** | ^5 | +| **Vite** | ^6.3 or ≥ 7 | +| **@sveltejs/vite-plugin-svelte** | ^6 or ^7 | +| **ffmpeg / ffprobe** | On `PATH` at build time, or pass `advanced.ffmpegPath` / `ffprobePath`, or install `ffmpeg-ffprobe-static` | + + + +Encoding runs **during dev** (background + HMR) and **synchronously on production build**. Missing ffmpeg or a failed encode **fails the build**. Install a build that includes **libx264**, **libx265** (HEVC), **libvpx-vp9**, and **libsvtav1** (AV1) if you enable those formats. + + + +## Install + + + +```bash +# optional: vendored binaries so CI machines do not need system ffmpeg +pnpm add -D ffmpeg-ffprobe-static +``` + +## Vite setup + +Add **`enhancedVideos()`** from `enhanced-video-sveltekit` **before** the SvelteKit (or `vite-plugin-svelte`) plugin so the markup transform runs ahead of compilation. If you use Tailwind’s Vite plugin, keep the order shown in this demo: + +```ts +import tailwindcss from '@tailwindcss/vite'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { enhancedVideos } from 'enhanced-video-sveltekit'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), enhancedVideos({ resolutions: [360] }), sveltekit()] +}); +``` + +This demo passes **`resolutions: [360]`** so cold encodes stay quick; the default ladder is **`[1080, 720, 480]`** (variants taller than the source are skipped). + +## Authoring in Svelte + +Use the custom element in any **`.svelte`** file (not in raw `.svx` / markdown — put the tag in a `.svelte` wrapper if you author MDsveX). Standard **`