diff --git a/apps/playground/components/audio-components-demo/index.tsx b/apps/playground/components/audio-components-demo/index.tsx index 6ef5bd90..a8fd0ff4 100644 --- a/apps/playground/components/audio-components-demo/index.tsx +++ b/apps/playground/components/audio-components-demo/index.tsx @@ -5,6 +5,8 @@ import { InlineStatusChipLive, } from '@/components/audio-components-demo/variants'; import { Demo2 } from '@/components/audio-components-demo/demo-2'; +import { Card } from '@elevenlabs/ui/components/card'; +import { PlayerDemoWrapper } from './player-demo'; export function AudioComponentsDemo() { return ( @@ -17,6 +19,11 @@ export function AudioComponentsDemo() { {/* Middle row - Live and Transcribing */}
+
+ + + +
diff --git a/apps/playground/components/audio-components-demo/player-demo.tsx b/apps/playground/components/audio-components-demo/player-demo.tsx new file mode 100644 index 00000000..b1ba3df7 --- /dev/null +++ b/apps/playground/components/audio-components-demo/player-demo.tsx @@ -0,0 +1,116 @@ +import { + PlayerButton, + PlayerDuration, + PlayerProgress, + PlayerProvider, + PlayerTime, + usePlayer, +} from '@/registry/audio-components/ui/player'; +import { cn } from '@elevenlabs/ui/lib/utils'; + +export const PlayerDemoWrapper = () => { + return ( + + + + ); +}; + +const PlayerDemo = () => { + return ( +
+ + +
+ ); +}; + +const Player = () => { + const player = usePlayer(); + + return ( +
+ +
+

{player.activeItem ? player.activeItem?.data.name : '-------'}

+
+ + + +
+
+
+ ); +}; + +type Song = { + id: string; + name: string; + url: string; +}; + +const songs = [ + { + id: '1', + name: 'Rise up rap', + url: '/audio/rap.mp3', + }, + { + id: '2', + name: 'Midnight swing', + url: '/audio/jazz.mp3', + }, +]; + +const SongListItem = ({ song }: { song: Song }) => { + const player = usePlayer(); + + return ( +
  • { + if (player.isPlaying && player.isItemActive(song.id)) { + player.pause(); + } else { + player.play({ + id: song.id, + src: song.url, + data: song, + }); + } + }} + className={cn( + 'group flex items-center justify-between rounded-xl p-2 hover:bg-foreground/5 cursor-pointer', + player.isItemActive(song.id) && 'bg-foreground/5', + )} + tabIndex={0} + > +

    {song.name}

    +
    + { + e.stopPropagation(); + }} + /> +
    +
  • + ); +}; diff --git a/apps/playground/public/audio/jazz.mp3 b/apps/playground/public/audio/jazz.mp3 new file mode 100644 index 00000000..64e9a764 Binary files /dev/null and b/apps/playground/public/audio/jazz.mp3 differ diff --git a/apps/playground/public/audio/rap.mp3 b/apps/playground/public/audio/rap.mp3 new file mode 100644 index 00000000..6133e5fb Binary files /dev/null and b/apps/playground/public/audio/rap.mp3 differ diff --git a/apps/playground/registry/audio-components/ui/player.tsx b/apps/playground/registry/audio-components/ui/player.tsx new file mode 100644 index 00000000..38d97057 --- /dev/null +++ b/apps/playground/registry/audio-components/ui/player.tsx @@ -0,0 +1,443 @@ +import { Button } from '@elevenlabs/ui/components/button'; +import { PauseIcon, PlayIcon } from 'lucide-react'; +import { + ComponentProps, + createContext, + HTMLProps, + ReactNode, + RefObject, + useCallback, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import * as SliderPrimitive from '@radix-ui/react-slider'; +import { cn } from '../lib/utils'; + +enum ReadyState { + HAVE_NOTHING = 0, + HAVE_METADATA = 1, + HAVE_CURRENT_DATA = 2, + HAVE_FUTURE_DATA = 3, + HAVE_ENOUGH_DATA = 4, +} + +enum NetworkState { + NETWORK_EMPTY = 0, + NETWORK_IDLE = 1, + NETWORK_LOADING = 2, + NETWORK_NO_SOURCE = 3, +} + +function formatTime(seconds: number) { + const hrs = Math.floor(seconds / 3600); + const mins = Math.floor((seconds % 3600) / 60); + const secs = Math.floor(seconds % 60); + + const formattedMins = mins < 10 ? `0${mins}` : mins; + const formattedSecs = secs < 10 ? `0${secs}` : secs; + + return hrs > 0 + ? `${hrs}:${formattedMins}:${formattedSecs}` + : `${mins}:${formattedSecs}`; +} + +export interface PlayerProviderProps {} + +interface PlayerItem { + id: string | number; + src: string; + data?: any; +} + +interface PlayerApi { + ref: RefObject; + activeItem: PlayerItem | null; + duration: number | undefined; + error: MediaError | null; + isPlaying: boolean; + isBuffering: boolean; + isItemActive: (id: string | number | null) => boolean; + setActiveItem: (item: PlayerItem | null) => Promise; + play: (item?: PlayerItem | null) => Promise; + pause: () => void; + seek: (time: number) => void; +} + +const PlayerContext = createContext(null); + +export const usePlayer = () => { + const api = useContext(PlayerContext); + if (!api) { + throw new Error('usePlayer cannot be called outside of PlayerProvider'); + } + return api; +}; + +const PlayerTimeContext = createContext(null); + +export const usePlayerTime = () => { + const time = useContext(PlayerTimeContext); + if (time === null) { + throw new Error('usePlayerTime cannot be called outside of PlayerProvider'); + } + return time; +}; + +export const PlayerProvider = ({ children }: { children: ReactNode }) => { + const audioRef = useRef(null); + const itemRef = useRef(null); + const [readyState, setReadyState] = useState(0); + const [networkState, setNetworkState] = useState(0); + const [time, setTime] = useState(0); + const [duration, setDuration] = useState(undefined); + const [error, setError] = useState(null); + const [activeItem, _setActiveItem] = useState(null); + const [paused, setPaused] = useState(true); + + const setActiveItem = useCallback(async (item: PlayerItem | null) => { + if (!audioRef.current) return; + + if (item?.id === itemRef.current?.id) { + return; + } else { + itemRef.current = item; + audioRef.current.pause(); + audioRef.current.currentTime = 0; + if (item === null) { + audioRef.current.removeAttribute('src'); + } else { + audioRef.current.src = item.src; + } + await audioRef.current.load(); + } + }, []); + + const play = useCallback( + async (item?: PlayerItem | null) => { + if (!audioRef.current) return; + + if (item === undefined) { + return audioRef.current.play(); + } else if (item?.id === activeItem?.id) { + return audioRef.current.play(); + } else { + itemRef.current = item; + audioRef.current.pause(); + audioRef.current.currentTime = 0; + if (item === null) { + audioRef.current.removeAttribute('src'); + } else { + audioRef.current.src = item.src; + } + await audioRef.current.load(); + return audioRef.current.play(); + } + }, + [activeItem], + ); + + const pause = useCallback(() => { + if (!audioRef.current) return; + audioRef.current.pause(); + }, []); + + const seek = useCallback((time: number) => { + if (!audioRef.current) return; + audioRef.current.currentTime = time; + }, []); + + const isItemActive = useCallback( + (id: string | number | null) => { + return activeItem?.id === id; + }, + [activeItem], + ); + + useAnimationFrame(() => { + if (audioRef.current) { + _setActiveItem(itemRef.current); + setReadyState(audioRef.current.readyState); + setNetworkState(audioRef.current.networkState); + setTime(audioRef.current.currentTime); + setDuration(audioRef.current.duration); + setPaused(audioRef.current.paused); + setError(audioRef.current.error); + } + }); + + const isPlaying = !paused; + const isBuffering = + readyState < ReadyState.HAVE_FUTURE_DATA && + networkState === NetworkState.NETWORK_LOADING; + + const api = useMemo( + () => ({ + ref: audioRef, + duration, + error, + isPlaying, + isBuffering, + activeItem, + isItemActive, + setActiveItem, + play, + pause, + seek, + }), + [ + audioRef, + duration, + error, + isPlaying, + isBuffering, + activeItem, + isItemActive, + setActiveItem, + play, + pause, + seek, + ], + ); + + return ( + + + + + ); +}; + +export interface PlayerProgressProps + extends Omit< + ComponentProps, + 'min' | 'max' | 'value' + > {} + +export const PlayerProgress = ({ ...otherProps }: PlayerProgressProps) => { + const player = usePlayer(); + const time = usePlayerTime(); + const wasPlayingRef = useRef(false); + + return ( + { + player.seek(vals[0]); + otherProps.onValueChange?.(vals); + }} + min={0} + max={player.duration ?? 0} + step={otherProps.step || 0.25} + onPointerDown={e => { + wasPlayingRef.current = player.isPlaying; + player.pause(); + otherProps.onPointerDown?.(e); + }} + onPointerUp={e => { + if (wasPlayingRef.current) { + player.play(); + } + otherProps.onPointerUp?.(e); + }} + className={cn( + 'relative group/player flex h-4 touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col', + otherProps.className, + )} + onKeyDown={e => { + if (e.key === ' ') { + e.preventDefault(); + if (!player.isPlaying) { + player.play(); + } else { + player.pause(); + } + } + otherProps.onKeyDown?.(e); + }} + disabled={ + player.duration === undefined || + !Number.isFinite(player.duration) || + Number.isNaN(player.duration) + } + > + + + + +
    + + + ); +}; + +interface PlayerTimeProps extends HTMLProps {} + +export const PlayerTime = ({ className, ...otherProps }: PlayerTimeProps) => { + const time = usePlayerTime(); + return ( + + {formatTime(time)} + + ); +}; + +interface PlayerDurationProps extends HTMLProps {} + +export const PlayerDuration = ({ + className, + ...otherProps +}: PlayerDurationProps) => { + const player = usePlayer(); + return ( + + {player.duration != null && !Number.isNaN(player.duration) + ? formatTime(player.duration) + : '--:--'} + + ); +}; + +interface SpinnerProps { + className?: string; +} + +function Spinner({ className }: SpinnerProps) { + return ( +
    + Loading... +
    + ); +} + +interface PlayButtonProps extends React.ComponentProps { + playing: boolean; + onPlayingChange: (playing: boolean) => void; + loading?: boolean; +} + +const PlayButton = ({ + playing, + onPlayingChange, + className, + onClick, + loading, + ...otherProps +}: PlayButtonProps) => { + return ( + + ); +}; + +export interface PlayerButtonProps extends React.ComponentProps { + item?: PlayerItem; +} + +export const PlayerButton = ({ item, ...otherProps }: PlayerButtonProps) => { + const player = usePlayer(); + + if (item) { + return ( + { + if (shouldPlay) { + player.play(item); + } else { + player.pause(); + } + }} + loading={ + player.isItemActive(item.id) && player.isBuffering && player.isPlaying + } + /> + ); + } else { + return ( + { + if (shouldPlay) { + player.play(); + } else { + player.pause(); + } + }} + loading={player.isBuffering && player.isPlaying} + /> + ); + } +}; + +type Callback = (delta: number) => void; + +function useAnimationFrame(callback: Callback) { + const requestRef = useRef(null); + const previousTimeRef = useRef(null); + const callbackRef = useRef(callback); + + // Keep callback ref always up to date + useEffect(() => { + callbackRef.current = callback; + }, [callback]); + + useEffect(() => { + const animate = (time: number) => { + if (previousTimeRef.current != null) { + const delta = time - previousTimeRef.current; + callbackRef.current(delta); + } + previousTimeRef.current = time; + requestRef.current = requestAnimationFrame(animate); + }; + + requestRef.current = requestAnimationFrame(animate); + + return () => { + if (requestRef.current) cancelAnimationFrame(requestRef.current); + previousTimeRef.current = null; + }; + }, []); +} diff --git a/package.json b/package.json index 41114fff..f312a838 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "check-types": "turbo run check-types" }, "dependencies": { + "@radix-ui/react-slider": "^1.3.6", "tsx": "^4.1.4" }, "devDependencies": { diff --git a/packages/types/generated/types/index.ts b/packages/types/generated/types/index.ts index 7b06a0f9..5ec654ea 100644 --- a/packages/types/generated/types/index.ts +++ b/packages/types/generated/types/index.ts @@ -16,7 +16,6 @@ export * from './ConversationInitiationPayload'; export * from './ConversationMetadataData'; export * from './ConversationMetadataPayload'; export * from './FeedbackScore'; -export * from './index'; export * from './InterruptionData'; export * from './InterruptionPayload'; export * from './McpConnectionStatusData'; @@ -38,7 +37,8 @@ export * from './UserActivityPayload'; export * from './UserAudioPayload'; export * from './UserFeedbackPayload'; export * from './UserMessagePayload'; -export * from './UserTranscriptionData'; export * from './UserTranscriptPayload'; +export * from './UserTranscriptionData'; export * from './VadScoreData'; export * from './VadScorePayload'; +export * from './index'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb6609c9..6ee92cc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@radix-ui/react-slider': + specifier: ^1.3.6 + version: 1.3.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607) tsx: specifier: ^4.1.4 version: 4.20.5 @@ -308,7 +311,7 @@ importers: devDependencies: '@asyncapi/cli': specifier: ^2.17.0 - version: 2.17.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(@types/babel__core@7.20.5)(@types/node@22.15.3)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2)) + version: 2.17.0(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(@types/babel__core@7.20.5)(@types/node@22.15.3)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2)) '@asyncapi/modelina': specifier: ^4.4.3 version: 4.4.3(encoding@0.1.13) @@ -12287,7 +12290,7 @@ snapshots: js-yaml: 4.1.0 lodash: 4.17.21 - '@asyncapi/cli@2.17.0(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(@types/babel__core@7.20.5)(@types/node@22.15.3)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2))': + '@asyncapi/cli@2.17.0(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(@types/babel__core@7.20.5)(@types/node@22.15.3)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2))': dependencies: '@asyncapi/avro-schema-parser': 3.0.24(encoding@0.1.13) '@asyncapi/bundler': 0.6.4 @@ -12300,7 +12303,7 @@ snapshots: '@asyncapi/parser': 3.4.0(encoding@0.1.13) '@asyncapi/protobuf-schema-parser': 3.6.0(encoding@0.1.13) '@asyncapi/raml-dt-schema-parser': 4.0.24(encoding@0.1.13) - '@asyncapi/studio': 0.23.1(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2)) + '@asyncapi/studio': 0.23.1(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2)) '@changesets/changelog-git': 0.2.1 '@clack/prompts': 0.7.0 '@oclif/core': 4.5.2 @@ -12314,7 +12317,7 @@ snapshots: https-proxy-agent: 7.0.6 inquirer: 8.2.7(@types/node@22.15.3) js-yaml: 4.1.0 - next: 14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 14.2.32(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607) node-fetch: 2.7.0(encoding@0.1.13) oclif: 4.22.16(@types/node@22.15.3) open: 8.4.2 @@ -12690,7 +12693,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@asyncapi/studio@0.23.1(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2))': + '@asyncapi/studio@0.23.1(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(csstype@3.1.3)(encoding@0.1.13)(immer@9.0.21)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.9.2))': dependencies: '@asyncapi/avro-schema-parser': 3.0.24(encoding@0.1.13) '@asyncapi/converter': 1.5.0(encoding@0.1.13) @@ -12719,7 +12722,7 @@ snapshots: js-yaml: 4.1.0 monaco-editor: 0.34.1 monaco-yaml: 4.0.2(monaco-editor@0.34.1) - next: 14.2.3(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 14.2.3(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -16658,6 +16661,18 @@ snapshots: '@types/react': 19.1.12 '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + react: 19.0.0-rc-cc1ec60d0d-20240607 + react-dom: 19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607) + optionalDependencies: + '@types/react': 19.1.12 + '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) @@ -16670,6 +16685,12 @@ snapshots: '@types/react': 19.1.12 '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.12)(react@19.1.1)': dependencies: react: 19.1.1 @@ -16690,6 +16711,12 @@ snapshots: '@types/react': 19.1.12 '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-context@1.1.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-context@1.1.2(@types/react@19.1.12)(react@19.1.1)': dependencies: react: 19.1.1 @@ -16718,6 +16745,12 @@ snapshots: '@types/react': 19.1.12 '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-direction@1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-direction@1.1.1(@types/react@19.1.12)(react@19.1.1)': dependencies: react: 19.1.1 @@ -16894,6 +16927,15 @@ snapshots: '@types/react': 19.1.12 '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + react: 19.0.0-rc-cc1ec60d0d-20240607 + react-dom: 19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607) + optionalDependencies: + '@types/react': 19.1.12 + '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.1) @@ -16975,6 +17017,25 @@ snapshots: '@types/react': 19.1.12 '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + react: 19.0.0-rc-cc1ec60d0d-20240607 + react-dom: 19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607) + optionalDependencies: + '@types/react': 19.1.12 + '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 @@ -16994,6 +17055,13 @@ snapshots: '@types/react': 19.1.12 '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@radix-ui/react-slot@1.2.3(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-slot@1.2.3(@types/react@19.1.12)(react@19.1.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.1) @@ -17084,6 +17152,14 @@ snapshots: optionalDependencies: '@types/react': 19.1.12 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.12)(react@19.1.1)': dependencies: '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.12)(react@19.1.1) @@ -17092,6 +17168,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.12 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.12)(react@19.1.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) @@ -17113,12 +17196,24 @@ snapshots: optionalDependencies: '@types/react': 19.1.12 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.12)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: '@types/react': 19.1.12 + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.12)(react@19.1.1)': dependencies: react: 19.1.1 @@ -17132,6 +17227,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.12 + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.0.0-rc-cc1ec60d0d-20240607) + react: 19.0.0-rc-cc1ec60d0d-20240607 + optionalDependencies: + '@types/react': 19.1.12 + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.12)(react@19.1.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.1) @@ -23973,7 +24075,7 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next@14.2.3(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@14.2.3(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 14.2.3 '@swc/helpers': 0.5.5 @@ -23983,7 +24085,7 @@ snapshots: postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.28.3)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.12.9)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.2.3 '@next/swc-darwin-x64': 14.2.3 @@ -24000,7 +24102,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@14.2.32(@babel/core@7.12.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607))(react@19.0.0-rc-cc1ec60d0d-20240607): dependencies: '@next/env': 14.2.32 '@swc/helpers': 0.5.5 @@ -24008,9 +24110,9 @@ snapshots: caniuse-lite: 1.0.30001739 graceful-fs: 4.2.11 postcss: 8.4.31 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - styled-jsx: 5.1.1(@babel/core@7.28.3)(react@19.1.1) + react: 19.0.0-rc-cc1ec60d0d-20240607 + react-dom: 19.0.0-rc-cc1ec60d0d-20240607(react@19.0.0-rc-cc1ec60d0d-20240607) + styled-jsx: 5.1.1(@babel/core@7.12.9)(react@19.0.0-rc-cc1ec60d0d-20240607) optionalDependencies: '@next/swc-darwin-arm64': 14.2.32 '@next/swc-darwin-x64': 14.2.32 @@ -26471,19 +26573,19 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.1(@babel/core@7.28.3)(react@18.2.0): + styled-jsx@5.1.1(@babel/core@7.12.9)(react@18.2.0): dependencies: client-only: 0.0.1 react: 18.2.0 optionalDependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.12.9 - styled-jsx@5.1.1(@babel/core@7.28.3)(react@19.1.1): + styled-jsx@5.1.1(@babel/core@7.12.9)(react@19.0.0-rc-cc1ec60d0d-20240607): dependencies: client-only: 0.0.1 - react: 19.1.1 + react: 19.0.0-rc-cc1ec60d0d-20240607 optionalDependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.12.9 styled-jsx@5.1.6(@babel/core@7.28.3)(babel-plugin-macros@3.1.0)(react@19.1.1): dependencies: