chore: rename skins, minor style tweaks (#61)

This commit is contained in:
Sam Potts
2025-10-19 10:16:47 +11:00
committed by GitHub
parent cdebece1eb
commit b63c22ef9f
23 changed files with 292 additions and 120 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
<link rel="preconnect" href="https://rsms.me/" />
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
</head>
<body class="bg-white text-stone-700 dark:bg-stone-900 dark:text-stone-200">
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
+2
View File
@@ -12,8 +12,10 @@
"dependencies": {
"@vjs-10/react": "workspace:*",
"@vjs-10/react-icons": "workspace:*",
"clsx": "^2.1.1",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"screenfull": "^6.0.2",
"tailwindcss": "^4.1.13"
},
"devDependencies": {
+46 -19
View File
@@ -1,25 +1,28 @@
import type { ChangeEventHandler } from 'react';
import { MediaProvider, MediaSkinDefault, MediaSkinToasted, Video } from '@vjs-10/react';
import { FrostedSkin, MediaProvider, MinimalSkin, Video } from '@vjs-10/react';
import { FullscreenEnterAltIcon, FullscreenExitAltIcon } from '@vjs-10/react-icons';
// import FrostedSkin from './skins/frosted/FrostedSkin';
// import MinimalSkin from './skins/toasted/MinimalSkin';
import clsx from 'clsx';
// NOTE: Commented out imports are for testing locally/externally defined skins.
// import { MediaProvider, Video } from '@vjs-10/react';
import { useCallback, useMemo, useState } from 'react';
// import MediaSkinDefault from './skins/frosted/MediaSkinDefault';
// import MediaSkinToasted from './skins/toasted/MediaSkinToasted';
import { useCallback, useMemo, useRef, useState } from 'react';
import { useFullscreen } from './hooks/useFullscreen';
import './globals.css';
const skins = [
{
key: 'default',
key: 'frosted',
name: 'Frosted',
component: MediaSkinDefault,
component: FrostedSkin,
},
{
key: 'toasted',
name: 'Toasted',
component: MediaSkinToasted,
key: 'minimal',
name: 'Minimal',
component: MinimalSkin,
},
] as const;
@@ -62,12 +65,14 @@ function setParam(key: string, value: string) {
window.history.replaceState(null, '', url);
}
const DEFAULT_SKIN: SkinKey = 'toasted';
const DEFAULT_SKIN: SkinKey = 'frosted';
const DEFAULT_MEDIA_SOURCE: MediaSourceKey = '1';
export default function App(): JSX.Element {
const [skinKey, setSkinKey] = useState<SkinKey>(() => getParam('skin', DEFAULT_SKIN));
const [mediaSourceKey, setMediaSourceKey] = useState<MediaSourceKey>(() => getParam('source', DEFAULT_MEDIA_SOURCE));
const containerRef = useRef<HTMLDivElement>(null);
const { isFullscreen, toggle: toggleFullscreen } = useFullscreen(containerRef);
const mediaSource = useMemo(() => {
let match = mediaSources.find(m => m.key === mediaSourceKey);
@@ -103,10 +108,10 @@ export default function App(): JSX.Element {
const skinClassName = useMemo(() => {
switch (skinKey) {
case 'default':
case 'frosted':
return 'rounded-4xl shadow shadow-lg shadow-black/15';
case 'toasted':
return 'rounded-lg shadow shadow-lg shadow-black/15';
case 'minimal':
return 'rounded-2xl shadow shadow-lg shadow-black/15';
default:
return '';
}
@@ -116,8 +121,20 @@ export default function App(): JSX.Element {
const poster = playbackId ? `https://image.mux.com/${playbackId}/thumbnail.webp` : undefined;
return (
<>
<header className="fixed top-0 inset-x-0 bg-white dark:bg-stone-800 shadow shadow-black/10 after:h-px after:absolute after:inset-x-0 after:top-full after:bg-black/5">
<div
ref={containerRef}
className={clsx('', {
'bg-black text-stone-200 h-screen': isFullscreen,
'min-h-screen bg-white text-stone-700 dark:bg-black dark:text-stone-200': !isFullscreen,
})}
>
<header className={clsx(
'fixed top-0 z-10 inset-x-0 bg-white dark:bg-stone-800 shadow shadow-black/10 after:h-px after:absolute after:inset-x-0 after:top-full after:bg-black/5 transition-transform',
{
'-translate-y-full': isFullscreen,
},
)}
>
<div className="grid grid-cols-5 h-2" aria-hidden="true">
<div className="bg-yellow-500"></div>
<div className="bg-orange-500"></div>
@@ -147,11 +164,21 @@ export default function App(): JSX.Element {
</option>
))}
</select>
<button type="button" className="p-2" onClick={toggleFullscreen}>
{isFullscreen ? <FullscreenExitAltIcon /> : <FullscreenEnterAltIcon />}
<span className="sr-only">Toggle fullscreen</span>
</button>
</nav>
</div>
</header>
<main className="min-h-screen flex justify-center items-center bg-radial bg-size-[16px_16px] from-stone-300 dark:from-stone-700 via-10% via-transparent to-transparent">
<main className={clsx(
'min-h-screen flex justify-center items-center',
{
'bg-radial bg-size-[16px_16px] from-stone-300 dark:from-stone-700 via-10% via-transparent to-transparent': !isFullscreen,
},
)}
>
<div className="w-full max-w-5xl mx-auto p-6">
<MediaProvider key={key}>
<Skin className={skinClassName}>
@@ -161,6 +188,6 @@ export default function App(): JSX.Element {
</MediaProvider>
</div>
</main>
</>
</div>
);
}
@@ -0,0 +1,132 @@
import type { RefObject } from 'react';
import { useCallback, useEffect, useState } from 'react';
import screenfull from 'screenfull';
export interface UseFullscreenOptions {
/**
* When true, automatically handles fullscreen change events
* to synchronize the state with browser fullscreen status
* @default true
*/
trackChanges?: boolean;
/**
* Callback fired when fullscreen state changes
*/
onFullscreenChange?: (isFullscreen: boolean) => void;
/**
* Callback fired when fullscreen encounters an error
*/
onFullscreenError?: (error: Error) => void;
}
export interface UseFullscreenResult {
/**
* Whether the element is currently in fullscreen mode
*/
isFullscreen: boolean;
/**
* Whether fullscreen is supported in the current environment
*/
isSupported: boolean;
/**
* Request fullscreen for the target element
* @returns Promise that resolves when fullscreen is entered
*/
enter: () => Promise<void>;
/**
* Exit fullscreen mode
* @returns Promise that resolves when fullscreen is exited
*/
exit: () => Promise<void>;
/**
* Toggle fullscreen mode for the target element
* @returns Promise that resolves when the toggle is complete
*/
toggle: () => Promise<void>;
}
/**
* Hook that provides fullscreen functionality for a DOM element
*
* @param elementRef - Ref to the element to make fullscreen
* @param options - Configuration options
* @returns Methods and state for managing fullscreen
*/
export function useFullscreen(
elementRef: RefObject<HTMLElement | null>,
options: UseFullscreenOptions = {},
): UseFullscreenResult {
const {
trackChanges = true,
onFullscreenChange,
onFullscreenError,
} = options;
const [isFullscreen, setIsFullscreen] = useState(
screenfull.isEnabled ? screenfull.isFullscreen : false,
);
// Handle fullscreen change events
useEffect(() => {
if (!screenfull.isEnabled || !trackChanges) return;
const handleChange = () => {
const newIsFullscreen = screenfull.isFullscreen;
setIsFullscreen(newIsFullscreen);
onFullscreenChange?.(newIsFullscreen);
};
const handleError = () => {
onFullscreenError?.(new Error('Fullscreen error occurred'));
};
screenfull.on('change', handleChange);
screenfull.on('error', handleError);
return () => {
screenfull.off('change', handleChange);
screenfull.off('error', handleError);
};
}, [trackChanges, onFullscreenChange, onFullscreenError]);
// Request fullscreen for the target element
const enter = useCallback(async (): Promise<void> => {
if (!screenfull.isEnabled || !elementRef.current) return;
try {
await screenfull.request(elementRef.current);
} catch (error) {
onFullscreenError?.(error instanceof Error ? error : new Error(String(error)));
}
}, [elementRef, onFullscreenError]);
// Exit fullscreen mode
const exit = useCallback(async (): Promise<void> => {
if (!screenfull.isEnabled) return;
try {
await screenfull.exit();
} catch (error) {
onFullscreenError?.(error instanceof Error ? error : new Error(String(error)));
}
}, [onFullscreenError]);
// Toggle fullscreen mode for the target element
const toggle = useCallback(async (): Promise<void> => {
if (!screenfull.isEnabled || !elementRef.current) return;
try {
await screenfull.toggle(elementRef.current);
} catch (error) {
onFullscreenError?.(error instanceof Error ? error : new Error(String(error)));
}
}, [elementRef, onFullscreenError]);
return {
isFullscreen,
isSupported: screenfull.isEnabled,
enter,
exit,
toggle,
};
}
@@ -29,7 +29,7 @@ type SkinProps = PropsWithChildren<{
className?: string;
}>;
export default function MediaSkinDefault({ children, className = '' }: SkinProps): JSX.Element {
export default function FrostedSkin({ children, className = '' }: SkinProps): JSX.Element {
return (
<MediaContainer className={`${styles.MediaContainer} ${className}`}>
{children}
@@ -1,4 +1,4 @@
import type { MediaDefaultSkinStyles } from './types';
import type { FrostedSkinStyles } from './types';
// NOTE: Removing import to sidestep for compiler complexity (CJP)
// import { cn } from '../../utils/cn';
@@ -9,7 +9,7 @@ function cn(...classes: (string | undefined)[]): string {
return classes.filter(Boolean).join(' ');
}
const styles: MediaDefaultSkinStyles = {
const styles: FrostedSkinStyles = {
MediaContainer: cn(
'relative @container/root group/root overflow-clip',
// Base typography
@@ -1,4 +1,4 @@
export interface MediaDefaultSkinStyles {
export interface FrostedSkinStyles {
readonly MediaContainer: string;
readonly Overlay: string;
readonly Controls: string;
@@ -26,7 +26,7 @@ type SkinProps = PropsWithChildren<{
className?: string;
}>;
export default function MediaSkinToasted({ children, className = '' }: SkinProps): JSX.Element {
export default function MinimalSkin({ children, className = '' }: SkinProps): JSX.Element {
return (
<MediaContainer className={`${styles.MediaContainer} ${className}`}>
{children}
@@ -1,4 +1,4 @@
import type { MediaToastedSkinStyles } from './types';
import type { MinimalSkinStyles } from './types';
// NOTE: Removing import to sidestep for compiler complexity (CJP)
// import { cn } from '../../utils/cn';
@@ -9,7 +9,7 @@ function cn(...classes: (string | undefined)[]): string {
return classes.filter(Boolean).join(' ');
}
const styles: MediaToastedSkinStyles = {
const styles: MinimalSkinStyles = {
MediaContainer: cn(
'relative @container/root group/root overflow-clip bg-black',
// Base typography
@@ -1,4 +1,4 @@
export interface MediaToastedSkinStyles {
export interface MinimalSkinStyles {
readonly MediaContainer: string;
readonly Overlay: string;
readonly Controls: string;
@@ -1 +0,0 @@
export { default as MediaSkinToasted } from './MediaSkinToasted';
@@ -1 +0,0 @@
export { default as MediaSkinDefault } from './MediaSkinDefault';
@@ -27,7 +27,7 @@ type SkinProps = PropsWithChildren<{
className?: string;
}>;
export default function MediaSkinDefault({ children, className = '' }: SkinProps): JSX.Element {
export default function FrostedSkin({ children, className = '' }: SkinProps): JSX.Element {
return (
<MediaContainer className={`${styles.MediaContainer} ${className}`}>
{children}
@@ -0,0 +1 @@
export { default as FrostedSkin } from './FrostedSkin';
@@ -1,4 +1,4 @@
import type { MediaDefaultSkinStyles } from './types';
import type { FrostedSkinStyles } from './types';
// NOTE: Removing import to sidestep for compiler complexity (CJP)
// import { cn } from '../../utils/cn';
@@ -9,16 +9,16 @@ function cn(...classes: (string | undefined)[]): string {
return classes.filter(Boolean).join(' ');
}
const styles: MediaDefaultSkinStyles = {
const styles: FrostedSkinStyles = {
MediaContainer: cn(
'relative @container/root group/root overflow-clip',
'relative isolate @container/root group/root overflow-clip',
// Base typography
'text-[0.8125rem]', // 13px
// Prevent rounded corners in fullscreen.
'[&:fullscreen]:rounded-none [&:fullscreen]:[&_video]:h-full [&:fullscreen]:[&_video]:w-full',
// Fancy borders.
'after:absolute after:inset-0 after:ring-black/10 after:ring-1 dark:after:ring-black/40 after:ring-inset after:z-10 after:pointer-events-none after:rounded-[inherit]',
'before:absolute before:inset-px before:rounded-[inherit] before:ring-white/15 before:ring-1 before:ring-inset before:z-10 before:pointer-events-none',
'after:absolute after:inset-0 after:ring-black/10 after:ring-1 dark:after:ring-white/10 after:ring-inset after:z-10 after:pointer-events-none after:rounded-[inherit]',
'before:absolute before:inset-px before:rounded-[inherit] before:ring-white/15 before:ring-1 before:ring-inset before:z-10 before:pointer-events-none dark:before:ring-0',
// Ensure the nested video inherits the radius.
'[&_video]:rounded-[inherit] [&_video]:w-full [&_video]:h-auto',
),
@@ -1,4 +1,4 @@
export interface MediaDefaultSkinStyles {
export interface FrostedSkinStyles {
readonly MediaContainer: string;
readonly Overlay: string;
readonly Controls: string;
+2 -2
View File
@@ -1,2 +1,2 @@
export * from './default';
export * from './toasted';
export * from './frosted';
export * from './minimal';
@@ -27,7 +27,7 @@ type SkinProps = PropsWithChildren<{
className?: string;
}>;
export default function MediaSkinDefault({ children, className = '' }: SkinProps): JSX.Element {
export default function MinimalSkin({ children, className = '' }: SkinProps): JSX.Element {
return (
<MediaContainer className={`${styles.MediaContainer} ${className}`}>
{children}
@@ -0,0 +1 @@
export { default as MinimalSkin } from './MinimalSkin';
@@ -1,4 +1,4 @@
import type { MediaToastedSkinStyles } from './types';
import type { MinimalSkinStyles } from './types';
// NOTE: Removing import to sidestep for compiler complexity (CJP)
// import { cn } from '../../utils/cn';
@@ -9,9 +9,9 @@ function cn(...classes: (string | undefined)[]): string {
return classes.filter(Boolean).join(' ');
}
const styles: MediaToastedSkinStyles = {
const styles: MinimalSkinStyles = {
MediaContainer: cn(
'relative @container/root group/root overflow-clip bg-black',
'relative isolate @container/root group/root overflow-clip bg-black',
// Base typography
'text-[0.8125rem]', // 13px
// 'ring-1 ring-inset ring-black/10 dark:ring-white/10',
@@ -22,8 +22,8 @@ const styles: MediaToastedSkinStyles = {
'[&_video]:rounded-[inherit] [&_video]:w-full [&_video]:h-auto',
),
Overlay: cn(
'absolute inset-0 rounded-[inherit] bg-black/30',
'bg-gradient-to-t from-black/30 to-transparent to-[120px]',
'absolute inset-0 rounded-[inherit]',
'bg-gradient-to-t from-black/70 via-black/50 via-[120px] to-transparent',
'opacity-0 delay-500 duration-300',
// FIXME: Temporary hide/show logic
'has-[+.controls_[data-paused]]:opacity-100 has-[+.controls_[data-paused]]:delay-0 has-[+.controls_[data-paused]]:duration-75',
@@ -125,8 +125,8 @@ const styles: MediaToastedSkinStyles = {
),
SliderTrack: cn(
'relative select-none rounded-full bg-white/10 transition-[height,width] ease-in-out',
'[&[data-orientation="horizontal"]]:w-full [&[data-orientation="horizontal"]]:h-0.5',
'[&[data-orientation="vertical"]]:w-0.5',
'[&[data-orientation="horizontal"]]:w-full [&[data-orientation="horizontal"]]:h-[0.1875rem]',
'[&[data-orientation="vertical"]]:w-[0.1875rem]',
),
SliderProgress: cn('bg-white rounded-[inherit]'),
SliderPointer: cn('hidden'),
@@ -1,4 +1,4 @@
export interface MediaToastedSkinStyles {
export interface MinimalSkinStyles {
readonly MediaContainer: string;
readonly Overlay: string;
readonly Controls: string;
@@ -1 +0,0 @@
export { default as MediaSkinToasted } from './MediaSkinToasted';
+83 -71
View File
@@ -84,12 +84,18 @@ importers:
'@vjs-10/react-icons':
specifier: workspace:*
version: link:../../packages/react/react-icons
clsx:
specifier: ^2.1.1
version: 2.1.1
react:
specifier: ^18.0.0
version: 18.3.1
react-dom:
specifier: ^18.0.0
version: 18.3.1(react@18.3.1)
screenfull:
specifier: ^6.0.2
version: 6.0.2
tailwindcss:
specifier: ^4.1.13
version: 4.1.14
@@ -1093,8 +1099,8 @@ packages:
'@mdx-js/mdx@3.1.1':
resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
'@napi-rs/wasm-runtime@1.0.6':
resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==}
'@napi-rs/wasm-runtime@1.0.7':
resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==}
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@@ -1133,89 +1139,89 @@ packages:
'@quansync/fs@0.1.5':
resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==}
'@rolldown/binding-android-arm64@1.0.0-beta.42':
resolution: {integrity: sha512-W5ZKF3TP3bOWuBfotAGp+UGjxOkGV7jRmIRbBA7NFjggx7Oi6vOmGDqpHEIX7kDCiry1cnIsWQaxNvWbMdkvzQ==}
'@rolldown/binding-android-arm64@1.0.0-beta.43':
resolution: {integrity: sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
'@rolldown/binding-darwin-arm64@1.0.0-beta.42':
resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==}
'@rolldown/binding-darwin-arm64@1.0.0-beta.43':
resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
'@rolldown/binding-darwin-x64@1.0.0-beta.42':
resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==}
'@rolldown/binding-darwin-x64@1.0.0-beta.43':
resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
'@rolldown/binding-freebsd-x64@1.0.0-beta.42':
resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==}
'@rolldown/binding-freebsd-x64@1.0.0-beta.43':
resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42':
resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==}
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43':
resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42':
resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==}
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43':
resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.42':
resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==}
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.43':
resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.42':
resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==}
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.43':
resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rolldown/binding-linux-x64-musl@1.0.0-beta.42':
resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==}
'@rolldown/binding-linux-x64-musl@1.0.0-beta.43':
resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@rolldown/binding-openharmony-arm64@1.0.0-beta.42':
resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==}
'@rolldown/binding-openharmony-arm64@1.0.0-beta.43':
resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
'@rolldown/binding-wasm32-wasi@1.0.0-beta.42':
resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==}
'@rolldown/binding-wasm32-wasi@1.0.0-beta.43':
resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42':
resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==}
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43':
resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42':
resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==}
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43':
resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.42':
resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==}
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.43':
resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
@@ -1226,8 +1232,8 @@ packages:
'@rolldown/pluginutils@1.0.0-beta.35':
resolution: {integrity: sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==}
'@rolldown/pluginutils@1.0.0-beta.42':
resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==}
'@rolldown/pluginutils@1.0.0-beta.43':
resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==}
'@rollup/pluginutils@5.3.0':
resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
@@ -3921,8 +3927,8 @@ packages:
vue-tsc:
optional: true
rolldown@1.0.0-beta.42:
resolution: {integrity: sha512-xaPcckj+BbJhYLsv8gOqezc8EdMcKKe/gk8v47B0KPvgABDrQ0qmNPAiT/gh9n9Foe0bUkEv2qzj42uU5q1WRg==}
rolldown@1.0.0-beta.43:
resolution: {integrity: sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -3952,6 +3958,10 @@ packages:
scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
screenfull@6.0.2:
resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==}
engines: {node: ^14.13.1 || >=16.0.0}
scslre@0.3.0:
resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==}
engines: {node: ^14.0.0 || >=16.0.0}
@@ -5450,7 +5460,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@napi-rs/wasm-runtime@1.0.6':
'@napi-rs/wasm-runtime@1.0.7':
dependencies:
'@emnapi/core': 1.5.0
'@emnapi/runtime': 1.5.0
@@ -5488,55 +5498,55 @@ snapshots:
dependencies:
quansync: 0.2.11
'@rolldown/binding-android-arm64@1.0.0-beta.42':
'@rolldown/binding-android-arm64@1.0.0-beta.43':
optional: true
'@rolldown/binding-darwin-arm64@1.0.0-beta.42':
'@rolldown/binding-darwin-arm64@1.0.0-beta.43':
optional: true
'@rolldown/binding-darwin-x64@1.0.0-beta.42':
'@rolldown/binding-darwin-x64@1.0.0-beta.43':
optional: true
'@rolldown/binding-freebsd-x64@1.0.0-beta.42':
'@rolldown/binding-freebsd-x64@1.0.0-beta.43':
optional: true
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42':
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43':
optional: true
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42':
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43':
optional: true
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.42':
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.43':
optional: true
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.42':
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.43':
optional: true
'@rolldown/binding-linux-x64-musl@1.0.0-beta.42':
'@rolldown/binding-linux-x64-musl@1.0.0-beta.43':
optional: true
'@rolldown/binding-openharmony-arm64@1.0.0-beta.42':
'@rolldown/binding-openharmony-arm64@1.0.0-beta.43':
optional: true
'@rolldown/binding-wasm32-wasi@1.0.0-beta.42':
'@rolldown/binding-wasm32-wasi@1.0.0-beta.43':
dependencies:
'@napi-rs/wasm-runtime': 1.0.6
'@napi-rs/wasm-runtime': 1.0.7
optional: true
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42':
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43':
optional: true
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42':
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43':
optional: true
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.42':
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.43':
optional: true
'@rolldown/pluginutils@1.0.0-beta.27': {}
'@rolldown/pluginutils@1.0.0-beta.35': {}
'@rolldown/pluginutils@1.0.0-beta.42': {}
'@rolldown/pluginutils@1.0.0-beta.43': {}
'@rollup/pluginutils@5.3.0(rollup@4.52.0)':
dependencies:
@@ -8932,7 +8942,7 @@ snapshots:
rfdc@1.4.1: {}
rolldown-plugin-dts@0.16.7(rolldown@1.0.0-beta.42)(typescript@5.9.2):
rolldown-plugin-dts@0.16.7(rolldown@1.0.0-beta.43)(typescript@5.9.2):
dependencies:
'@babel/generator': 7.28.3
'@babel/parser': 7.28.4
@@ -8943,33 +8953,33 @@ snapshots:
dts-resolver: 2.1.2
get-tsconfig: 4.10.1
magic-string: 0.30.19
rolldown: 1.0.0-beta.42
rolldown: 1.0.0-beta.43
optionalDependencies:
typescript: 5.9.2
transitivePeerDependencies:
- oxc-resolver
- supports-color
rolldown@1.0.0-beta.42:
rolldown@1.0.0-beta.43:
dependencies:
'@oxc-project/types': 0.94.0
'@rolldown/pluginutils': 1.0.0-beta.42
'@rolldown/pluginutils': 1.0.0-beta.43
ansis: 4.2.0
optionalDependencies:
'@rolldown/binding-android-arm64': 1.0.0-beta.42
'@rolldown/binding-darwin-arm64': 1.0.0-beta.42
'@rolldown/binding-darwin-x64': 1.0.0-beta.42
'@rolldown/binding-freebsd-x64': 1.0.0-beta.42
'@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.42
'@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.42
'@rolldown/binding-linux-arm64-musl': 1.0.0-beta.42
'@rolldown/binding-linux-x64-gnu': 1.0.0-beta.42
'@rolldown/binding-linux-x64-musl': 1.0.0-beta.42
'@rolldown/binding-openharmony-arm64': 1.0.0-beta.42
'@rolldown/binding-wasm32-wasi': 1.0.0-beta.42
'@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.42
'@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42
'@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42
'@rolldown/binding-android-arm64': 1.0.0-beta.43
'@rolldown/binding-darwin-arm64': 1.0.0-beta.43
'@rolldown/binding-darwin-x64': 1.0.0-beta.43
'@rolldown/binding-freebsd-x64': 1.0.0-beta.43
'@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.43
'@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.43
'@rolldown/binding-linux-arm64-musl': 1.0.0-beta.43
'@rolldown/binding-linux-x64-gnu': 1.0.0-beta.43
'@rolldown/binding-linux-x64-musl': 1.0.0-beta.43
'@rolldown/binding-openharmony-arm64': 1.0.0-beta.43
'@rolldown/binding-wasm32-wasi': 1.0.0-beta.43
'@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.43
'@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43
'@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43
rollup@4.52.0:
dependencies:
@@ -9028,6 +9038,8 @@ snapshots:
dependencies:
loose-envify: 1.4.0
screenfull@6.0.2: {}
scslre@0.3.0:
dependencies:
'@eslint-community/regexpp': 4.12.1
@@ -9356,8 +9368,8 @@ snapshots:
diff: 8.0.2
empathic: 2.0.0
hookable: 5.5.3
rolldown: 1.0.0-beta.42
rolldown-plugin-dts: 0.16.7(rolldown@1.0.0-beta.42)(typescript@5.9.2)
rolldown: 1.0.0-beta.43
rolldown-plugin-dts: 0.16.7(rolldown@1.0.0-beta.43)(typescript@5.9.2)
semver: 7.7.2
tinyexec: 1.0.1
tinyglobby: 0.2.15