diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 32c7c4dd..45333328 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -66,6 +66,10 @@ jobs: if: ${{ steps.release.outputs.releases_created == 'true' }} run: pnpm build:packages + - name: Build CDN bundles + if: ${{ steps.release.outputs.releases_created == 'true' }} + run: pnpm build:cdn + - name: Publish if: ${{ steps.release.outputs.releases_created == 'true' }} run: pnpm -r publish --filter "./packages/*" --access public --provenance --no-git-checks diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b81ac7cf..4a657ef4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -150,3 +150,6 @@ jobs: - name: Build run: pnpm build:packages + + - name: Build CDN bundles + run: pnpm build:cdn diff --git a/build/plugins/inline-css-plugin.mjs b/build/plugins/inline-css-plugin.mjs index c5e6fbb4..143cb3be 100644 --- a/build/plugins/inline-css-plugin.mjs +++ b/build/plugins/inline-css-plugin.mjs @@ -1,5 +1,6 @@ import { readFileSync } from 'node:fs'; import { dirname, relative, resolve } from 'node:path'; +import { transform } from 'lightningcss'; import { resolveImports } from './resolve-css-imports.mjs'; const INLINE_PREFIX = 'inline-css:'; @@ -11,10 +12,10 @@ const INLINE_SUFFIX = '?inline'; * modules exporting the resolved CSS string. Mirrors the Vite `?inline` * convention so the same source works in both Vite dev and tsdown builds. * - * @param {{ skinsDir: string; rootDir?: string }} options + * @param {{ skinsDir: string; rootDir?: string; minify?: boolean }} options */ export function inlineCssPlugin(options) { - const { skinsDir, rootDir = process.cwd() } = options; + const { skinsDir, rootDir = process.cwd(), minify = true } = options; return { name: 'inline-css', @@ -37,7 +38,17 @@ export function inlineCssPlugin(options) { const rel = id.slice(INLINE_PREFIX.length).replace(/\.js$/, '.css'); const file = resolve(rootDir, rel); const raw = readFileSync(file, 'utf-8'); - const resolved = resolveImports(raw, dirname(file), skinsDir); + let resolved = resolveImports(raw, dirname(file), skinsDir); + + if (minify) { + const { code } = transform({ + filename: file, + code: Buffer.from(resolved), + minify: true, + }); + + resolved = code.toString(); + } return { code: `export default ${JSON.stringify(resolved)};`, moduleSideEffects: false }; }, diff --git a/build/plugins/inline-template-plugin.mjs b/build/plugins/inline-template-plugin.mjs new file mode 100644 index 00000000..ae3d8ad2 --- /dev/null +++ b/build/plugins/inline-template-plugin.mjs @@ -0,0 +1,341 @@ +import { transform } from 'lightningcss'; + +const HTML_MARKER = '/*html*/'; +const CSS_MARKER = '/* css */'; + +/** + * Rolldown/tsdown transform plugin that minifies tagged template literals + * marked with {@link HTML_MARKER} or {@link CSS_MARKER}. + * + * - `/*html*​/` templates: collapse inter-tag whitespace, strip HTML comments. + * - `/* css *​/` templates: full CSS minification via lightningcss. + * + * Only the static parts (quasis) are processed — `${...}` expression + * interpolations are preserved as-is. + * + * @param {{ minify?: boolean }} options + */ +export function inlineTemplatePlugin(options = {}) { + const { minify = true } = options; + + return { + name: 'inline-template', + + transform(code) { + if (!minify) return null; + if (!code.includes(HTML_MARKER) && !code.includes(CSS_MARKER)) return null; + + const result = processTemplates(code); + + return result === code ? null : { code: result }; + }, + }; +} + +// --------------------------------------------------------------------------- +// Template-literal parser +// --------------------------------------------------------------------------- + +/** + * Walk `code` looking for known markers followed by a backtick template + * literal. For each match, minify the static parts and reassemble. + */ +function processTemplates(code) { + let out = ''; + let pos = 0; + + while (pos < code.length) { + // Find whichever marker comes first. + const htmlIdx = code.indexOf(HTML_MARKER, pos); + const cssIdx = code.indexOf(CSS_MARKER, pos); + + let idx; + let marker; + + if (htmlIdx === -1 && cssIdx === -1) { + out += code.slice(pos); + break; + } else if (cssIdx === -1 || (htmlIdx !== -1 && htmlIdx < cssIdx)) { + idx = htmlIdx; + marker = HTML_MARKER; + } else { + idx = cssIdx; + marker = CSS_MARKER; + } + + // Copy everything before the marker. + out += code.slice(pos, idx); + + // Skip marker + optional whitespace to find the opening backtick. + let i = idx + marker.length; + while (i < code.length && isWhitespace(code[i])) i++; + + if (i >= code.length || code[i] !== '`') { + // Not a tagged template literal — copy the marker verbatim. + out += code.slice(idx, i); + pos = i; + continue; + } + + const { quasis, expressions, end } = parseTemplateLiteral(code, i); + + const minified = + marker === HTML_MARKER + ? minifyHtmlQuasis(quasis) + : minifyCssQuasis(quasis); + + // Reassemble — keep the marker for IDE syntax-highlighting. + out += marker + ' `'; + for (let q = 0; q < minified.length; q++) { + out += minified[q]; + if (q < expressions.length) { + out += '${' + expressions[q] + '}'; + } + } + out += '`'; + pos = end; + } + + return out; +} + +// --------------------------------------------------------------------------- +// HTML minification +// --------------------------------------------------------------------------- + +/** Minify the static parts of an HTML template literal. */ +function minifyHtmlQuasis(quasis) { + return quasis.map((q, qIdx) => { + let s = q; + + // 1. Strip HTML comments. + s = s.replace(//g, ''); + + // 2. Collapse runs of whitespace to a single space. + s = s.replace(/\s{2,}/g, ' '); + + // 3. Remove the single remaining space between tags. + s = s.replace(/> <'); + + // 4. Trim edges of the whole template (first / last quasi only). + if (qIdx === 0) s = s.replace(/^\s+/, ''); + if (qIdx === quasis.length - 1) s = s.replace(/\s+$/, ''); + + return s; + }); +} + +// --------------------------------------------------------------------------- +// CSS minification +// --------------------------------------------------------------------------- + +/** Placeholder that won't appear in real CSS. */ +const EXPR_PLACEHOLDER = '___EXPR_'; + +/** + * Minify the static parts of a CSS template literal via lightningcss. + * + * Expressions are replaced with safe placeholder tokens before minification, + * then restored afterward. + */ +function minifyCssQuasis(quasis) { + // Fast path: single quasi (no expressions) — minify directly. + if (quasis.length === 1) { + return [minifyCss(quasis[0]).trim()]; + } + + // Join quasis with numbered placeholders so lightningcss sees valid-ish CSS. + const joined = quasis.map((q, i) => (i < quasis.length - 1 ? q + EXPR_PLACEHOLDER + i + '___' : q)).join(''); + + const minified = minifyCss(joined); + + // Split back on placeholders to recover individual quasis. + const result = []; + let remaining = minified; + + for (let i = 0; i < quasis.length - 1; i++) { + const token = EXPR_PLACEHOLDER + i + '___'; + const tokenIdx = remaining.indexOf(token); + + if (tokenIdx === -1) { + // Placeholder was removed by minifier (e.g. dead code elimination). + // Fall back to unminified for safety. + return quasis; + } + + result.push(i === 0 ? remaining.slice(0, tokenIdx).trimStart() : remaining.slice(0, tokenIdx)); + remaining = remaining.slice(tokenIdx + token.length); + } + + result.push(remaining.trimEnd()); + + return result; +} + +function minifyCss(css) { + const { code } = transform({ + filename: 'template.css', + code: Buffer.from(css), + minify: true, + }); + + return code.toString(); +} + +// --------------------------------------------------------------------------- +// Template-literal parser (shared) +// --------------------------------------------------------------------------- + +/** + * Parse a backtick template literal starting at `start` (the opening `` ` ``). + * Returns the static quasis, the raw expression source strings, and the index + * immediately after the closing backtick. + */ +function parseTemplateLiteral(code, start) { + /** @type {string[]} */ + const quasis = []; + /** @type {string[]} */ + const expressions = []; + + let i = start + 1; // skip opening backtick + let quasi = ''; + + while (i < code.length) { + const ch = code[i]; + + // Escape sequence — preserve verbatim. + if (ch === '\\' && i + 1 < code.length) { + quasi += ch + code[i + 1]; + i += 2; + continue; + } + + // End of template literal. + if (ch === '`') { + quasis.push(quasi); + i++; + break; + } + + // Start of ${…} expression. + if (ch === '$' && i + 1 < code.length && code[i + 1] === '{') { + quasis.push(quasi); + quasi = ''; + i += 2; // skip ${ + expressions.push(collectExpression(code, i)); + i = expressions[expressions.length - 1]._end; + continue; + } + + quasi += ch; + i++; + } + + return { quasis, expressions: expressions.map((e) => e.src), end: i }; +} + +// --------------------------------------------------------------------------- +// Expression collector — tracks brace depth, skips strings & nested templates. +// --------------------------------------------------------------------------- + +/** + * Starting right after the `${`, collect everything up to the matching `}`. + * Returns `{ src, _end }` where `_end` is the index after the closing `}`. + */ +function collectExpression(code, start) { + let i = start; + let depth = 1; + let src = ''; + + while (i < code.length && depth > 0) { + const ch = code[i]; + + if (ch === '{') { + depth++; + src += ch; + i++; + } else if (ch === '}') { + depth--; + if (depth === 0) { + i++; // skip closing } + break; + } + src += ch; + i++; + } else if (ch === "'" || ch === '"') { + const consumed = skipString(code, i); + src += consumed.text; + i = consumed.end; + } else if (ch === '`') { + const consumed = skipNestedTemplate(code, i); + src += consumed.text; + i = consumed.end; + } else { + src += ch; + i++; + } + } + + return { src, _end: i }; +} + +/** Skip a single- or double-quoted string starting at `start`. */ +function skipString(code, start) { + const quote = code[start]; + let text = quote; + let i = start + 1; + + while (i < code.length && code[i] !== quote) { + if (code[i] === '\\' && i + 1 < code.length) { + text += code[i] + code[i + 1]; + i += 2; + } else { + text += code[i]; + i++; + } + } + + if (i < code.length) { + text += code[i]; // closing quote + i++; + } + + return { text, end: i }; +} + +/** Skip a nested backtick template literal (with its own `${…}` blocks). */ +function skipNestedTemplate(code, start) { + let text = '`'; + let i = start + 1; + let exprDepth = 0; + + while (i < code.length) { + const ch = code[i]; + + if (ch === '\\' && i + 1 < code.length) { + text += ch + code[i + 1]; + i += 2; + } else if (ch === '`' && exprDepth === 0) { + text += ch; + i++; + break; + } else if (ch === '$' && i + 1 < code.length && code[i + 1] === '{') { + text += '${'; + i += 2; + exprDepth++; + } else if (ch === '}' && exprDepth > 0) { + text += ch; + i++; + exprDepth--; + } else { + text += ch; + i++; + } + } + + return { text, end: i }; +} + +function isWhitespace(ch) { + return ch === ' ' || ch === '\n' || ch === '\t' || ch === '\r'; +} diff --git a/package.json b/package.json index af20625e..e97f77e8 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "prepare": "simple-git-hooks", "postinstall": "node build/scripts/link-aliases.mjs", "build:packages": "turbo run build --filter='./packages/*'", + "build:cdn": "turbo run build:cdn --filter=@videojs/html", "build:site": "turbo run build --filter=site", "build": "turbo run build", "clean": "turbo run clean", @@ -44,6 +45,7 @@ "@commitlint/format": "^20.0.0", "@types/node": "^22.18.6", "esbuild": "^0.27.3", + "lightningcss": "^1.32.0", "lint-staged": "^16.2.3", "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1", diff --git a/packages/html/.gitignore b/packages/html/.gitignore new file mode 100644 index 00000000..249d4615 --- /dev/null +++ b/packages/html/.gitignore @@ -0,0 +1 @@ +/cdn/ diff --git a/packages/html/package.json b/packages/html/package.json index 3a8853c7..d2821385 100644 --- a/packages/html/package.json +++ b/packages/html/package.json @@ -16,7 +16,8 @@ "./dist/*/define/**/*.js" ], "files": [ - "dist" + "dist", + "cdn" ], "exports": { ".": { @@ -81,10 +82,11 @@ }, "scripts": { "build": "tsdown", + "build:cdn": "tsdown --config tsdown.cdn.config.ts && node scripts/cdn-copy-css.js", "build:watch": "tsdown --watch ./src --no-clean", "dev": "pnpm run build:watch", "test": "vitest run", - "clean": "rm -rf dist types" + "clean": "rm -rf dist cdn types" }, "dependencies": { "@videojs/spf": "workspace:*", diff --git a/packages/html/scripts/cdn-copy-css.js b/packages/html/scripts/cdn-copy-css.js new file mode 100644 index 00000000..e09fe035 --- /dev/null +++ b/packages/html/scripts/cdn-copy-css.js @@ -0,0 +1,29 @@ +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { transform } from 'lightningcss'; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const htmlDist = resolve(root, 'dist/default/define'); +const outDir = resolve(root, 'cdn'); + +const cssFiles = [ + { src: 'video/skin.css', dest: 'video.css' }, + { src: 'video/minimal-skin.css', dest: 'video-minimal.css' }, + { src: 'audio/skin.css', dest: 'audio.css' }, + { src: 'audio/minimal-skin.css', dest: 'audio-minimal.css' }, + { src: 'background/skin.css', dest: 'background.css' }, +]; + +for (const { src, dest } of cssFiles) { + const srcPath = resolve(htmlDist, src); + const destPath = resolve(outDir, dest); + const raw = readFileSync(srcPath); + + const { code } = transform({ filename: srcPath, code: raw, minify: true }); + + mkdirSync(dirname(destPath), { recursive: true }); + writeFileSync(destPath, code); + + console.log(` ${dest} (${raw.length} → ${code.length})`); +} diff --git a/packages/html/src/cdn/audio-minimal.ts b/packages/html/src/cdn/audio-minimal.ts new file mode 100644 index 00000000..5fece6d6 --- /dev/null +++ b/packages/html/src/cdn/audio-minimal.ts @@ -0,0 +1,2 @@ +import '../define/audio/player'; +import '../define/audio/minimal-skin'; diff --git a/packages/html/src/cdn/audio.ts b/packages/html/src/cdn/audio.ts new file mode 100644 index 00000000..27849430 --- /dev/null +++ b/packages/html/src/cdn/audio.ts @@ -0,0 +1,2 @@ +import '../define/audio/player'; +import '../define/audio/skin'; diff --git a/packages/html/src/cdn/background.ts b/packages/html/src/cdn/background.ts new file mode 100644 index 00000000..ac1ccf74 --- /dev/null +++ b/packages/html/src/cdn/background.ts @@ -0,0 +1,2 @@ +import '../define/background/player'; +import '../define/background/skin'; diff --git a/packages/html/src/cdn/media/hls-video.ts b/packages/html/src/cdn/media/hls-video.ts new file mode 100644 index 00000000..8d292303 --- /dev/null +++ b/packages/html/src/cdn/media/hls-video.ts @@ -0,0 +1 @@ +import '../../define/media/hls-video'; diff --git a/packages/html/src/cdn/media/simple-hls-video.ts b/packages/html/src/cdn/media/simple-hls-video.ts new file mode 100644 index 00000000..0ece7990 --- /dev/null +++ b/packages/html/src/cdn/media/simple-hls-video.ts @@ -0,0 +1 @@ +import '../../define/media/simple-hls-video'; diff --git a/packages/html/src/cdn/video-minimal.ts b/packages/html/src/cdn/video-minimal.ts new file mode 100644 index 00000000..917f2732 --- /dev/null +++ b/packages/html/src/cdn/video-minimal.ts @@ -0,0 +1,2 @@ +import '../define/video/player'; +import '../define/video/minimal-skin'; diff --git a/packages/html/src/cdn/video.ts b/packages/html/src/cdn/video.ts new file mode 100644 index 00000000..a5f4f119 --- /dev/null +++ b/packages/html/src/cdn/video.ts @@ -0,0 +1,2 @@ +import '../define/video/player'; +import '../define/video/skin'; diff --git a/packages/html/tsdown.cdn.config.ts b/packages/html/tsdown.cdn.config.ts new file mode 100644 index 00000000..d682a1e6 --- /dev/null +++ b/packages/html/tsdown.cdn.config.ts @@ -0,0 +1,69 @@ +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { UserConfig } from 'tsdown'; +import { defineConfig } from 'tsdown'; +import { inlineCssPlugin } from '../../build/plugins/inline-css-plugin.mjs'; +import { inlineTemplatePlugin } from '../../build/plugins/inline-template-plugin.mjs'; + +type BuildMode = 'dev' | 'prod'; + +const skinsDir = resolve(dirname(fileURLToPath(import.meta.url)), '../skins/src'); + +const buildModes: BuildMode[] = ['dev', 'prod']; + +const presets = ['video', 'video-minimal', 'audio', 'audio-minimal', 'background']; +const media = ['hls-video', 'simple-hls-video']; + +const entries = [ + ...presets.map((name) => ({ src: `src/cdn/${name}.ts`, name })), + ...media.map((name) => ({ src: `src/cdn/media/${name}.ts`, name: `media/${name}` })), +]; + +/** + * One config per entry per mode → each output is fully self-contained. + * Multiple entries in a single config causes rolldown to code-split shared + * modules into chunks, which breaks the single-file CDN bundle requirement. + */ +const configs: UserConfig[] = []; + +for (const mode of buildModes) { + for (const { src, name } of entries) { + const outName = mode === 'dev' ? `${name}.dev` : name; + + const isProd = mode === 'prod'; + + configs.push({ + entry: { [outName]: src }, + platform: 'browser', + format: 'es', + target: 'es2022', + sourcemap: true, + clean: false, + dts: false, + minify: isProd, + noExternal: [/.*/], + inlineOnly: false, + treeshake: { + moduleSideEffects: [{ test: /\/define\//, sideEffects: true }], + }, + outDir: 'cdn', + alias: { + '@': new URL('./src', import.meta.url).pathname, + }, + define: { + __DEV__: isProd ? 'false' : 'true', + }, + plugins: [inlineCssPlugin({ skinsDir, minify: isProd }), inlineTemplatePlugin({ minify: isProd })], + inputOptions: + mode === 'dev' + ? { + resolve: { + conditionNames: ['development', 'import', 'browser', 'default'], + }, + } + : undefined, + }); + } +} + +export default defineConfig(configs); diff --git a/packages/html/tsdown.config.ts b/packages/html/tsdown.config.ts index 67d13c4a..a642b321 100644 --- a/packages/html/tsdown.config.ts +++ b/packages/html/tsdown.config.ts @@ -5,6 +5,7 @@ import type { UserConfig } from 'tsdown'; import { defineConfig } from 'tsdown'; import { copyCssPlugin } from '../../build/plugins/copy-css-plugin.mjs'; import { inlineCssPlugin } from '../../build/plugins/inline-css-plugin.mjs'; +import { inlineTemplatePlugin } from '../../build/plugins/inline-template-plugin.mjs'; type BuildMode = 'dev' | 'default'; @@ -55,7 +56,11 @@ const createConfig = (mode: BuildMode): UserConfig => ({ __DEV__: mode === 'dev' ? 'true' : 'false', }, dts: mode === 'dev', - plugins: [copyCssPlugin({ skinsDir, outDir: `dist/${mode}` }), inlineCssPlugin({ skinsDir })], + plugins: [ + copyCssPlugin({ skinsDir, outDir: `dist/${mode}` }), + inlineCssPlugin({ skinsDir, minify: mode !== 'dev' }), + inlineTemplatePlugin({ minify: mode !== 'dev' }), + ], }); export default defineConfig(buildModes.map((mode) => createConfig(mode))); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3bb12314..49d0c6f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: esbuild: specifier: ^0.27.3 version: 0.27.3 + lightningcss: + specifier: ^1.32.0 + version: 1.32.0 lint-staged: specifier: ^16.2.3 version: 16.3.2 @@ -92,7 +95,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages/element: dependencies: @@ -111,7 +114,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages/html: dependencies: @@ -151,7 +154,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages/icons: dependencies: @@ -228,7 +231,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages/sandbox: dependencies: @@ -262,7 +265,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.2.0 - version: 4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -277,7 +280,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^5.1.4 - version: 5.1.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) chalk: specifier: ^5.6.2 version: 5.6.2 @@ -310,7 +313,7 @@ importers: version: 5.9.3 vite: specifier: ^6.0.0 - version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages/skins: dependencies: @@ -333,7 +336,7 @@ importers: devDependencies: '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) + version: 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) '@vitest/coverage-v8': specifier: ^3.2.4 version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -351,7 +354,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages/store: dependencies: @@ -385,7 +388,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages/utils: devDependencies: @@ -397,19 +400,19 @@ importers: version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) site: dependencies: '@astrojs/mdx': specifier: ^4.3.7 - version: 4.3.13(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) + version: 4.3.13(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) '@astrojs/netlify': specifier: ^6.6.4 - version: 6.6.4(@types/node@22.19.15)(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(yaml@2.8.2) + version: 6.6.4(@types/node@22.19.15)(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(yaml@2.8.2) '@astrojs/react': specifier: ^4.4.0 - version: 4.4.2(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.31.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2) + version: 4.4.2(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2) '@astrojs/rss': specifier: ^4.0.12 version: 4.0.15 @@ -433,10 +436,10 @@ importers: version: 1.4.0 '@sentry/astro': specifier: ^10.32.1 - version: 10.42.0(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@4.59.0) + version: 10.42.0(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@4.59.0) '@tailwindcss/vite': specifier: ^4.2.1 - version: 4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) '@videojs/html': specifier: workspace:* version: link:../packages/html @@ -445,7 +448,7 @@ importers: version: link:../packages/react astro: specifier: ^5.14.4 - version: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -536,7 +539,7 @@ importers: version: 5.0.6 '@vitejs/plugin-react': specifier: ^5.1.4 - version: 5.1.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/coverage-v8': specifier: ^3.2.4 version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -572,10 +575,10 @@ importers: version: 1.0.0-beta.1(typescript@5.9.3) vite-plugin-svgr: specifier: ^4.5.0 - version: 4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) packages: @@ -5292,30 +5295,60 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.31.1: resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.31.1: resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.31.1: resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.31.1: resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.31.1: resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} @@ -5323,6 +5356,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} @@ -5330,6 +5370,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} @@ -5337,6 +5384,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} @@ -5344,22 +5398,45 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.31.1: resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.31.1: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -7875,12 +7952,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.13(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': + '@astrojs/mdx@4.3.13(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 '@mdx-js/mdx': 3.1.1 acorn: 8.16.0 - astro: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -7894,18 +7971,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/netlify@6.6.4(@types/node@22.19.15)(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(yaml@2.8.2)': + '@astrojs/netlify@6.6.4(@types/node@22.19.15)(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@astrojs/internal-helpers': 0.7.5 '@astrojs/underscore-redirects': 1.0.0 '@netlify/blobs': 10.7.0 '@netlify/functions': 5.1.2 - '@netlify/vite-plugin': 2.10.8(rollup@4.59.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + '@netlify/vite-plugin': 2.10.8(rollup@4.59.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) '@vercel/nft': 0.30.4(rollup@4.59.0) - astro: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) esbuild: 0.25.12 tinyglobby: 0.2.15 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7948,15 +8025,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.31.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2)': + '@astrojs/react@4.4.2(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tsx@4.21.0)(yaml@2.8.2)': dependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -9188,12 +9265,12 @@ snapshots: '@netlify/types@2.3.0': {} - '@netlify/vite-plugin@2.10.8(rollup@4.59.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': + '@netlify/vite-plugin@2.10.8(rollup@4.59.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@netlify/dev': 4.14.1(rollup@4.59.0) '@netlify/dev-utils': 4.3.3 dedent: 1.7.2 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9984,13 +10061,13 @@ snapshots: '@sentry-internal/browser-utils': 10.42.0 '@sentry/core': 10.42.0 - '@sentry/astro@10.42.0(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@4.59.0)': + '@sentry/astro@10.42.0(astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@4.59.0)': dependencies: '@sentry/browser': 10.42.0 '@sentry/core': 10.42.0 '@sentry/node': 10.42.0 '@sentry/vite-plugin': 5.1.1(rollup@4.59.0) - astro: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro: 5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) transitivePeerDependencies: - encoding - rollup @@ -10330,12 +10407,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - '@tailwindcss/vite@4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) '@testing-library/dom@10.4.1': dependencies: @@ -10595,7 +10672,7 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -10603,11 +10680,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.1.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -10615,20 +10692,20 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4)': + '@vitest/browser@3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/utils': 3.2.4 magic-string: 0.30.21 sirv: 3.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) ws: 8.19.0 optionalDependencies: playwright: 1.58.2 @@ -10653,9 +10730,9 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: - '@vitest/browser': 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -10667,13 +10744,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -10704,7 +10781,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) '@vitest/utils@3.2.4': dependencies: @@ -10976,7 +11053,7 @@ snapshots: astring@1.9.0: {} - astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + astro@5.18.0(@netlify/blobs@10.7.0)(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/internal-helpers': 0.7.5 @@ -11033,8 +11110,8 @@ snapshots: unist-util-visit: 5.1.0 unstorage: 1.17.4(@netlify/blobs@10.7.0) vfile: 6.0.3 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -12956,36 +13033,69 @@ snapshots: lightningcss-android-arm64@1.31.1: optional: true + lightningcss-android-arm64@1.32.0: + optional: true + lightningcss-darwin-arm64@1.31.1: optional: true + lightningcss-darwin-arm64@1.32.0: + optional: true + lightningcss-darwin-x64@1.31.1: optional: true + lightningcss-darwin-x64@1.32.0: + optional: true + lightningcss-freebsd-x64@1.31.1: optional: true + lightningcss-freebsd-x64@1.32.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + lightningcss-linux-arm64-gnu@1.31.1: optional: true + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + lightningcss-linux-arm64-musl@1.31.1: optional: true + lightningcss-linux-arm64-musl@1.32.0: + optional: true + lightningcss-linux-x64-gnu@1.31.1: optional: true + lightningcss-linux-x64-gnu@1.32.0: + optional: true + lightningcss-linux-x64-musl@1.31.1: optional: true + lightningcss-linux-x64-musl@1.32.0: + optional: true + lightningcss-win32-arm64-msvc@1.31.1: optional: true + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + lightningcss-win32-x64-msvc@1.31.1: optional: true + lightningcss-win32-x64-msvc@1.32.0: + optional: true + lightningcss@1.31.1: dependencies: detect-libc: 2.1.2 @@ -13002,6 +13112,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + lines-and-columns@1.2.4: {} lint-staged@16.3.2: @@ -15358,13 +15484,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -15379,18 +15505,18 @@ snapshots: - tsx - yaml - vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - rollup - supports-color - typescript - vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -15402,19 +15528,19 @@ snapshots: '@types/node': 22.19.15 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 tsx: 4.21.0 yaml: 2.8.2 - vitefu@1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -15432,13 +15558,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.19.15 - '@vitest/browser': 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4) happy-dom: 18.0.1 jsdom: 26.1.0 @@ -15456,11 +15582,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.15)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -15478,13 +15604,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.19.15 - '@vitest/browser': 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.58.2)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4) happy-dom: 18.0.1 jsdom: 27.4.0 diff --git a/site/src/components/home/Demo/Base.tsx b/site/src/components/home/Demo/Base.tsx index 7101ab07..842dbe9b 100644 --- a/site/src/components/home/Demo/Base.tsx +++ b/site/src/components/home/Demo/Base.tsx @@ -5,15 +5,14 @@ import type { Skin } from '@/stores/homePageDemos'; import { framework, skin } from '@/stores/homePageDemos'; import ClientCode from '../../Code/ClientCode'; +const CDN_BASE = 'https://cdn.jsdelivr.net/npm/@videojs/html/cdn'; + function generateHTMLCode(skin: Skin): string { const skinTag = skin === 'default' ? 'video-skin' : 'video-minimal-skin'; - const skinFile = skin === 'default' ? 'skin' : 'minimal-skin'; + const cdnFile = skin === 'default' ? 'video' : 'video-minimal'; - return ` - + return ` + <${skinTag}> diff --git a/site/src/components/installation/HTMLCdnCodeBlock.tsx b/site/src/components/installation/HTMLCdnCodeBlock.tsx index ae772d66..33f39f1f 100644 --- a/site/src/components/installation/HTMLCdnCodeBlock.tsx +++ b/site/src/components/installation/HTMLCdnCodeBlock.tsx @@ -3,31 +3,20 @@ import ClientCode from '@/components/Code/ClientCode'; import type { Skin, UseCase } from '@/stores/installation'; import { skin, useCase } from '@/stores/installation'; -function getSkinImportParts(skin: Skin): { group: string; skinFile: string } { - if (skin === 'minimal-video') return { group: 'video', skinFile: 'minimal-skin' }; - if (skin === 'minimal-audio') return { group: 'audio', skinFile: 'minimal-skin' }; - return { group: skin, skinFile: 'skin' }; +const CDN_BASE = 'https://cdn.jsdelivr.net/npm/@videojs/html/cdn'; + +function getCdnFileName(useCase: UseCase, skin: Skin): string { + if (useCase === 'background-video') return 'background'; + if (skin === 'minimal-video') return 'video-minimal'; + if (skin === 'minimal-audio') return 'audio-minimal'; + return skin; } -// jsdelivr doesn't resolve Node package exports, so we use the full file path -const CDN_BASE = 'https://cdn.jsdelivr.net/npm/@videojs/html/dist/default/define'; - function generateCdnCode(useCase: UseCase, skin: Skin): string { - if (useCase === 'background-video') { - return ` -`; - } + const name = getCdnFileName(useCase, skin); - const { group, skinFile } = getSkinImportParts(skin); - - return ` -`; + return ` +`; } export default function HTMLCdnCodeBlock() { diff --git a/turbo.json b/turbo.json index 9c58a9e6..b36f7d6c 100644 --- a/turbo.json +++ b/turbo.json @@ -7,6 +7,10 @@ "dependsOn": ["^build"], "outputs": ["dist/**", ".netlify/**"] }, + "build:cdn": { + "dependsOn": ["build"], + "outputs": ["cdn/**"] + }, "dev": { "dependsOn": ["^build"], "cache": false,