├── .gitignore ├── .idea ├── .gitignore ├── fuma-animate.iml ├── modules.xml ├── prettier.xml └── vcs.xml ├── README.md ├── components ├── control │ ├── create-custom-song.tsx │ ├── player-controls.tsx │ ├── song-list.tsx │ └── timeline.tsx ├── gradient.tsx ├── menu.tsx ├── music-visualizer │ ├── index.tsx │ └── utils.ts ├── player.tsx └── ui │ ├── button.tsx │ ├── dialog.tsx │ ├── popover.tsx │ └── slider.tsx ├── index.html ├── lib ├── cn.ts ├── format.ts ├── music-manager.ts ├── queue-manager.ts ├── shortcut-manager.ts └── storage-manager.ts ├── music ├── data.d.ts ├── data.json └── generate.mjs ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public ├── cold-brew-ra-main-version-29719-02-38.mp3 ├── cold-brew-ra-main-version-29719-02-38.mp3-info.jpeg ├── favicon.ico ├── moonshine-prigida-main-version-01-36-17027.mp3 ├── moonshine-prigida-main-version-01-36-17027.mp3-info.jpeg ├── night-in-kyoto-avbe-main-version-21302-01-57.mp3 ├── night-in-kyoto-avbe-main-version-21302-01-57.mp3-info.jpeg └── preview.png ├── src ├── app.tsx ├── globals.css └── main.tsx ├── tailwind.config.ts ├── tsconfig.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | *.pem 18 | 19 | # debug 20 | npm-debug.log* 21 | yarn-debug.log* 22 | yarn-error.log* 23 | 24 | # local env files 25 | .env*.local 26 | 27 | # vercel 28 | .vercel 29 | 30 | # typescript 31 | *.tsbuildinfo 32 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.idea/fuma-animate.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/prettier.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Fuma Lofi 2 | 3 | Some nice lofi music and a music player. 4 | 5 | **Demo:** https://fuma-lofi.vercel.app 6 | 7 | ![Preview](./public/preview.png) 8 | 9 | ### Run on local 10 | 11 | Clone the repository. 12 | 13 | ```bash 14 | git clone https://github.com/fuma-nama/fuma-lofi.git 15 | ``` 16 | 17 | Install with [pnpm](https://pnpm.io). 18 | 19 | ```bash 20 | pnpm i 21 | ``` 22 | 23 | Run in development mode. 24 | 25 | ```bash 26 | pnpm dev 27 | ``` 28 | 29 | #### Add Songs 30 | 31 | Put your songs in the `./public` folder, and run `pnpm run generate:music` to sync songs data with web player. 32 | 33 | #### Build 34 | 35 | This project uses Vite and React.js. 36 | 37 | ```bash 38 | pnpm build && pnpm preview 39 | ``` 40 | 41 | ### Custom Songs 42 | 43 | With an URL of the song (must be available to client, e.g. served from `http://localhost`), you can add a custom song in the menu. 44 | 45 | ### Demo Songs 46 | 47 | Music from [Uppbeat](https://uppbeat.io). 48 | It is encouraged to bring your own songs. 49 | 50 | - https://uppbeat.io/t/ra/cold-brew 51 | License code: `OZKJV3M2MXHS6NBX` 52 | 53 | - https://uppbeat.io/t/avbe/night-in-kyoto 54 | License code: `NNDPYSZCN8HVGASH` 55 | 56 | - https://uppbeat.io/t/prigida/moonshine 57 | License code: `OM8JENTZZEBMACX1` -------------------------------------------------------------------------------- /components/control/create-custom-song.tsx: -------------------------------------------------------------------------------- 1 | import { StorageManager } from "@/lib/storage-manager"; 2 | import { Song } from "@/music/data"; 3 | import { FormEventHandler, useState } from "react"; 4 | import { cva } from "cva"; 5 | import { cn } from "@/lib/cn"; 6 | import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; 7 | import { MusicManager } from "@/lib/music-manager"; 8 | import { buttonVariants } from "@/components/ui/button"; 9 | 10 | const inputVariants = cva( 11 | "bg-transparent rounded-lg bg-purple-200/10 text-sm px-2 py-1 -mx-2 placeholder:text-purple-200/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-purple-400", 12 | ); 13 | 14 | export function CreateCustomSongDialog({ 15 | musicManager, 16 | }: { 17 | musicManager: MusicManager; 18 | }) { 19 | const [open, setOpen] = useState(false); 20 | 21 | return ( 22 | 23 | 30 | Custom Songs 31 | 32 | 33 | { 36 | // reload 37 | musicManager.queueManager.setSongs( 38 | musicManager.storageManager.loadSongs(), 39 | ); 40 | setOpen(false); 41 | }} 42 | /> 43 | 44 | 45 | ); 46 | } 47 | 48 | function CreateCustomSong({ 49 | storage, 50 | onClose, 51 | }: { 52 | storage: StorageManager; 53 | onClose: () => void; 54 | }) { 55 | return ( 56 |
57 |

Add Custom Song

58 |

59 | Bring your own songs to here 60 |

61 | { 63 | const update = [...storage.getCustomSongs(), song]; 64 | 65 | storage.saveCustomSongs(update); 66 | onClose(); 67 | }} 68 | /> 69 |
70 | ); 71 | } 72 | 73 | function NewSong({ onAdd }: { onAdd: (song: Song) => void }) { 74 | const [name, setName] = useState(""); 75 | const [url, setUrl] = useState(""); 76 | 77 | const onSubmit: FormEventHandler = (e) => { 78 | e.preventDefault(); 79 | 80 | if (name.trim().length === 0 || url.trim().length === 0) return; 81 | onAdd({ 82 | name, 83 | url, 84 | author: "User", 85 | isCustom: true, 86 | }); 87 | }; 88 | 89 | return ( 90 |
91 |
92 | 95 | setName(e.target.value)} 99 | placeholder="Name of song" 100 | className={cn(inputVariants())} 101 | /> 102 |
103 | 104 |
105 | 108 | setUrl(e.target.value)} 114 | className={cn(inputVariants())} 115 | /> 116 |
117 | 124 |
125 | ); 126 | } 127 | -------------------------------------------------------------------------------- /components/control/player-controls.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/cn"; 2 | import { MusicManager } from "@/lib/music-manager"; 3 | import { buttonVariants } from "@/components/ui/button"; 4 | import { Song } from "@/music/data"; 5 | import { Slider } from "@/components/ui/slider"; 6 | import { useState } from "react"; 7 | 8 | export interface TimeControlsProps { 9 | musicManager: MusicManager; 10 | } 11 | 12 | export function PlayerControls({ musicManager }: TimeControlsProps) { 13 | const randomize = () => { 14 | const songs = [...musicManager.queueManager.songs]; 15 | const newList: Song[] = []; 16 | 17 | while (songs.length > 0) { 18 | const idx = Math.floor(Math.random() * songs.length); 19 | const selected = songs.splice(idx, 1)[0]; 20 | 21 | newList.push(selected); 22 | } 23 | 24 | musicManager.queueManager.setSongs(newList); 25 | }; 26 | 27 | return ( 28 |
29 | {musicManager.isPaused() ? ( 30 | 49 | ) : ( 50 | 70 | )} 71 | 95 | 96 |
97 | ); 98 | } 99 | 100 | function VolumeSlider({ musicManager }: { musicManager: MusicManager }) { 101 | const [value, setValue] = useState(() => musicManager.getVolume()); 102 | 103 | return ( 104 | <> 105 | 116 | 117 | {value > 0.2 && } 118 | {value > 0.7 && } 119 | 120 | { 125 | setValue(v); 126 | musicManager.setVolume(v); 127 | }} 128 | /> 129 | 130 | ); 131 | } 132 | -------------------------------------------------------------------------------- /components/control/song-list.tsx: -------------------------------------------------------------------------------- 1 | import { MusicManager } from "@/lib/music-manager"; 2 | import { cn } from "@/lib/cn"; 3 | import { QueueItem } from "@/lib/queue-manager"; 4 | import { buttonVariants } from "@/components/ui/button"; 5 | 6 | export interface SongListProps { 7 | musicManager: MusicManager; 8 | } 9 | 10 | export function SongList({ musicManager }: SongListProps) { 11 | const onPlay = (item: QueueItem) => { 12 | musicManager.queueManager.setIndex(item.id); 13 | }; 14 | 15 | const onRemove = (item: QueueItem) => { 16 | musicManager.storageManager.saveCustomSongs( 17 | musicManager.storageManager 18 | .getCustomSongs() 19 | .filter((song) => song.url !== item.url), 20 | ); 21 | 22 | musicManager.queueManager.setSongs(musicManager.storageManager.loadSongs()); 23 | }; 24 | 25 | return ( 26 |
27 | {musicManager.queueManager.songs.map((song) => ( 28 | 35 | ))} 36 |
37 | ); 38 | } 39 | 40 | function Item({ 41 | song, 42 | playing, 43 | onPlay, 44 | onRemove, 45 | }: { 46 | song: QueueItem; 47 | playing: boolean; 48 | onPlay: (item: QueueItem) => void; 49 | onRemove: (item: QueueItem) => void; 50 | }) { 51 | return ( 52 | 103 | ); 104 | } 105 | -------------------------------------------------------------------------------- /components/control/timeline.tsx: -------------------------------------------------------------------------------- 1 | import { MusicManager } from "@/lib/music-manager"; 2 | import { MutableRefObject, useEffect, useRef, useState } from "react"; 3 | import { Slider } from "@/components/ui/slider"; 4 | 5 | export type DurationControl = (percent: number) => void; 6 | 7 | export function Timeline({ 8 | musicManager, 9 | durationRef, 10 | }: { 11 | musicManager?: MusicManager; 12 | durationRef: MutableRefObject; 13 | }) { 14 | const [value, setValue] = useState(0); 15 | const isDrawingRef = useRef(false); 16 | 17 | useEffect(() => { 18 | durationRef.current = (percent) => { 19 | if (isDrawingRef.current) return; 20 | 21 | setValue(percent / 100); 22 | }; 23 | }, []); 24 | 25 | return ( 26 | { 30 | isDrawingRef.current = true; 31 | }} 32 | onValueChange={setValue} 33 | onSlideEnd={(v) => { 34 | isDrawingRef.current = false; 35 | setValue(v); 36 | 37 | if (musicManager) { 38 | musicManager.setTime(v * musicManager.getDuration()); 39 | } 40 | }} 41 | /> 42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /components/gradient.tsx: -------------------------------------------------------------------------------- 1 | import { ShaderGradient, ShaderGradientCanvas } from "shadergradient"; 2 | import React, { useMemo } from "react"; 3 | 4 | const colorSets = [ 5 | ["#606080", "#8d7dca", "#212121"], 6 | ["#80ffc3", "#a6574e", "#00298a"], 7 | ["#f57ff3", "#58426e", "#210c1c"], 8 | ]; 9 | 10 | export function Gradient({ currentId }: { currentId: number }) { 11 | const set = useMemo(() => { 12 | return colorSets[currentId % colorSets.length]; 13 | }, [currentId]); 14 | 15 | return ( 16 | 17 | 52 | 53 | ); 54 | } 55 | -------------------------------------------------------------------------------- /components/menu.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Popover, 3 | PopoverContent, 4 | PopoverTrigger, 5 | } from "@/components/ui/popover"; 6 | import { SongList } from "@/components/control/song-list"; 7 | import { PlayerControls } from "@/components/control/player-controls"; 8 | import { MusicManager } from "@/lib/music-manager"; 9 | import { cn } from "@/lib/cn"; 10 | import { buttonVariants } from "@/components/ui/button"; 11 | import { CreateCustomSongDialog } from "@/components/control/create-custom-song"; 12 | 13 | export function Menu({ musicManager }: { musicManager: MusicManager }) { 14 | return ( 15 | 16 | 26 | 37 | 38 | 39 | 40 | 41 | Menu 42 | 43 | 44 | 45 | 46 |
47 | 48 | 58 | GitHub 59 | 60 |
61 |
62 |
63 | ); 64 | } 65 | -------------------------------------------------------------------------------- /components/music-visualizer/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | From https://github.com/samhirtarif/react-audio-visualize 3 | */ 4 | 5 | import { 6 | type CanvasHTMLAttributes, 7 | type ReactElement, 8 | useCallback, 9 | useEffect, 10 | useRef, 11 | } from "react"; 12 | import { calculateBarData, draw } from "./utils"; 13 | 14 | export interface Props extends CanvasHTMLAttributes { 15 | analyser: AnalyserNode; 16 | 17 | /** 18 | * Width of each individual bar in the visualization. Default: `2` 19 | */ 20 | barWidth?: number; 21 | /** 22 | * Gap between each bar in the visualization. Default `1` 23 | */ 24 | gap?: number; 25 | /** 26 | * BackgroundColor for the visualization: Default `transparent` 27 | */ 28 | backgroundColor?: string; 29 | /** 30 | * Color of the bars drawn in the visualization. Default: `"rgb(160, 198, 255)"` 31 | */ 32 | barColor?: string; 33 | /** 34 | * An unsigned integer, representing the window size of the FFT, given in number of samples. 35 | * A higher value will result in more details in the frequency domain but fewer details in the amplitude domain. 36 | * For more details {@link https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/fftSize MDN AnalyserNode: fftSize property} 37 | * Default: `1024` 38 | */ 39 | fftSize?: 40 | | 32 41 | | 64 42 | | 128 43 | | 256 44 | | 512 45 | | 1024 46 | | 2048 47 | | 4096 48 | | 8192 49 | | 16384 50 | | 32768; 51 | /** 52 | * A double, representing the maximum decibel value for scaling the FFT analysis data 53 | * For more details {@link https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/maxDecibels MDN AnalyserNode: maxDecibels property} 54 | * Default: `-10` 55 | */ 56 | maxDecibels?: number; 57 | /** 58 | * A double, representing the minimum decibel value for scaling the FFT analysis data, where 0 dB is the loudest possible sound 59 | * For more details {@link https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/minDecibels MDN AnalyserNode: minDecibels property} 60 | * Default: `-90` 61 | */ 62 | minDecibels?: number; 63 | /** 64 | * A double within the range 0 to 1 (0 meaning no time averaging). 65 | * If 0 is set, there is no averaging done, whereas a value of 1 means "overlap the previous and current buffer quite a lot while computing the value", 66 | * which essentially smooths the changes across 67 | * For more details {@link https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/smoothingTimeConstant MDN AnalyserNode: smoothingTimeConstant property} 68 | * Default: `0.4` 69 | */ 70 | smoothingTimeConstant?: number; 71 | } 72 | 73 | export const MusicVisualizer: (props: Props) => ReactElement = ({ 74 | analyser, 75 | barWidth = 2, 76 | gap = 1, 77 | backgroundColor = "transparent", 78 | barColor = "rgb(160, 198, 255)", 79 | fftSize = 1024, 80 | maxDecibels = -10, 81 | minDecibels = -90, 82 | smoothingTimeConstant = 0.4, 83 | ...props 84 | }: Props) => { 85 | const canvasRef = useRef(null); 86 | 87 | useEffect(() => { 88 | analyser.fftSize = fftSize; 89 | analyser.minDecibels = minDecibels; 90 | analyser.maxDecibels = maxDecibels; 91 | analyser.smoothingTimeConstant = smoothingTimeConstant; 92 | 93 | report(); 94 | }, [analyser]); 95 | 96 | const report = useCallback(() => { 97 | if (analyser.context.state === "closed") return; 98 | 99 | const data = new Uint8Array(analyser.frequencyBinCount); 100 | 101 | if (analyser.context.state === "running") { 102 | analyser.getByteFrequencyData(data); 103 | } 104 | 105 | processFrequencyData(data); 106 | requestAnimationFrame(report); 107 | }, [analyser]); 108 | 109 | const processFrequencyData = (data: Uint8Array): void => { 110 | if (!canvasRef.current) return; 111 | 112 | const dataPoints = calculateBarData( 113 | data, 114 | canvasRef.current.width, 115 | barWidth, 116 | gap, 117 | ); 118 | draw( 119 | dataPoints, 120 | canvasRef.current, 121 | barWidth, 122 | gap, 123 | backgroundColor, 124 | barColor, 125 | ); 126 | }; 127 | 128 | return ; 129 | }; 130 | -------------------------------------------------------------------------------- /components/music-visualizer/utils.ts: -------------------------------------------------------------------------------- 1 | export const calculateBarData = ( 2 | frequencyData: Uint8Array, 3 | width: number, 4 | barWidth: number, 5 | gap: number, 6 | ): number[] => { 7 | let units = width / (barWidth + gap); 8 | let step = Math.floor(frequencyData.length / units); 9 | 10 | if (units > frequencyData.length) { 11 | units = frequencyData.length; 12 | step = 1; 13 | } 14 | 15 | const data: number[] = []; 16 | 17 | for (let i = 0; i < units; i++) { 18 | let sum = 0; 19 | 20 | for (let j = 0; j < step && i * step + j < frequencyData.length; j++) { 21 | sum += frequencyData[i * step + j]; 22 | } 23 | data.push(sum / step); 24 | } 25 | return data; 26 | }; 27 | 28 | export const draw = ( 29 | data: number[], 30 | canvas: HTMLCanvasElement, 31 | barWidth: number, 32 | gap: number, 33 | backgroundColor: string, 34 | barColor: string, 35 | ): void => { 36 | const ctx = canvas.getContext("2d"); 37 | if (!ctx) return; 38 | 39 | ctx.clearRect(0, 0, canvas.width, canvas.height); 40 | 41 | if (backgroundColor !== "transparent") { 42 | ctx.fillStyle = backgroundColor; 43 | ctx.fillRect(0, 0, canvas.width, canvas.height); 44 | } 45 | 46 | data.forEach((dp, i) => { 47 | ctx.fillStyle = barColor; 48 | 49 | const x = i * (barWidth + gap); 50 | const y = canvas.height - (dp || 1) / 2; 51 | const w = barWidth; 52 | const h = dp || 1; 53 | 54 | if (ctx.roundRect) { 55 | // making sure roundRect is supported by the browser 56 | ctx.beginPath(); 57 | ctx.roundRect(x, y, w, h, 20); 58 | ctx.fill(); 59 | } else { 60 | // fallback for browsers that do not support roundRect 61 | ctx.fillRect(x, y, w, h); 62 | } 63 | }); 64 | }; 65 | -------------------------------------------------------------------------------- /components/player.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef, useState, useMemo, MouseEventHandler } from "react"; 2 | import { Gradient } from "@/components/gradient"; 3 | import { createMusicManager, MusicManager } from "@/lib/music-manager"; 4 | import { createShortcutManager } from "@/lib/shortcut-manager"; 5 | import { MusicVisualizer } from "@/components/music-visualizer"; 6 | import { formatSeconds } from "@/lib/format"; 7 | import { AnimatePresence, motion } from "framer-motion"; 8 | import { Menu } from "@/components/menu"; 9 | import { QueueItem } from "@/lib/queue-manager"; 10 | import { Timeline, DurationControl } from "@/components/control/timeline"; 11 | 12 | export default function MusicPlayer() { 13 | const timelineRef = useRef(); 14 | const timeLabelRef = useRef(null); 15 | 16 | const [musicManager, setMusicManager] = useState(); 17 | // trigger re-renders 18 | const [, setDigit] = useState(0); 19 | 20 | const paused = musicManager?.isPaused() ?? true; 21 | const currentSong = musicManager?.queueManager.getCurrentSong(); 22 | 23 | useEffect(() => { 24 | const manager = createMusicManager({ 25 | onTimeUpdate: (currentTime, duration) => { 26 | if (timeLabelRef.current) { 27 | timeLabelRef.current.innerText = formatSeconds(currentTime); 28 | } 29 | 30 | timelineRef.current?.((currentTime / duration) * 100); 31 | }, 32 | onStateChange: () => { 33 | setDigit((prev) => prev + 1); 34 | }, 35 | onNext() { 36 | setDigit((prev) => prev + 1); 37 | }, 38 | onSongListUpdated() { 39 | setDigit((prev) => prev + 1); 40 | }, 41 | }); 42 | 43 | const shortcut = createShortcutManager({ musicManager: manager }); 44 | 45 | shortcut.bind(); 46 | setMusicManager(manager); 47 | 48 | return () => { 49 | shortcut.destroy(); 50 | manager.destroy(); 51 | }; 52 | }, []); 53 | 54 | const onClick: MouseEventHandler = (e) => { 55 | if (!musicManager || e.button !== 0) return; 56 | 57 | const target = e.target as Element; 58 | const isTrigger = target.matches( 59 | "[data-trigger-container] *, [data-trigger-container], [data-trigger]", 60 | ); 61 | 62 | if (!isTrigger) return; 63 | 64 | if (musicManager.isPaused()) musicManager.play(); 65 | else musicManager.pause(); 66 | }; 67 | 68 | return ( 69 | 79 | 80 |
81 | 82 | 83 | {currentSong ? : null} 84 | 85 |
86 |
90 | {musicManager && } 91 |
92 | {musicManager && ( 93 | 103 | )} 104 |

105 | --:-- 106 |

107 |
108 |
109 | 123 | 124 | 125 |
126 | ); 127 | } 128 | 129 | function SongDisplay({ song }: { song: QueueItem }) { 130 | return ( 131 | 139 | {song.picture && ( 140 | picture 141 | )} 142 |
143 |

{song.name}

144 |

{song.author}

145 |
146 |
147 | ); 148 | } 149 | 150 | function AnimatedTitle({ text }: { text: string }) { 151 | const words = useMemo(() => text.split(" "), [text]); 152 | let index = 0; 153 | 154 | return ( 155 |

156 | {words.map((word, i) => ( 157 | 158 | {word.split("").map((c, j) => ( 159 | 173 | {c} 174 | 175 | ))} 176 | 177 | ))} 178 |

179 | ); 180 | } 181 | -------------------------------------------------------------------------------- /components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import { cva } from "cva"; 2 | 3 | export const buttonVariants = cva( 4 | "inline-flex items-center justify-center gap-2 text-sm font-medium rounded-md px-3 py-2 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-purple-400", 5 | { 6 | variants: { 7 | variant: { 8 | primary: "bg-purple-500 text-purple-100 hover:bg-purple-400", 9 | ghost: "text-purple-100 hover:bg-purple-200/20", 10 | secondary: "rounded-full p-1.5 bg-purple-200/10 hover:bg-purple-200/20", 11 | destructive: "p-1 bg-red-600/50", 12 | }, 13 | }, 14 | }, 15 | ); 16 | -------------------------------------------------------------------------------- /components/ui/dialog.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import * as DialogPrimitive from "@radix-ui/react-dialog"; 3 | 4 | import { cn } from "@/lib/cn"; 5 | 6 | const Dialog = DialogPrimitive.Root; 7 | 8 | const DialogTrigger = DialogPrimitive.Trigger; 9 | 10 | const DialogPortal = DialogPrimitive.Portal; 11 | 12 | const DialogOverlay = React.forwardRef< 13 | React.ElementRef, 14 | React.ComponentPropsWithoutRef 15 | >(({ className, ...props }, ref) => ( 16 | 24 | )); 25 | DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; 26 | 27 | const DialogContent = React.forwardRef< 28 | React.ElementRef, 29 | React.ComponentPropsWithoutRef 30 | >(({ className, children, ...props }, ref) => ( 31 | 32 | 33 | 41 | {children} 42 | 43 | 54 | 55 | 56 | 57 | Close 58 | 59 | 60 | 61 | )); 62 | DialogContent.displayName = DialogPrimitive.Content.displayName; 63 | 64 | export { Dialog, DialogPortal, DialogOverlay, DialogTrigger, DialogContent }; 65 | -------------------------------------------------------------------------------- /components/ui/popover.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import * as PopoverPrimitive from "@radix-ui/react-popover"; 3 | import { cn } from "@/lib/cn"; 4 | 5 | const Popover = PopoverPrimitive.Root; 6 | 7 | const PopoverTrigger = PopoverPrimitive.Trigger; 8 | 9 | const PopoverContent = React.forwardRef< 10 | React.ElementRef, 11 | React.ComponentPropsWithoutRef 12 | >( 13 | ( 14 | { className, align = "center", side = "top", sideOffset = 4, ...props }, 15 | ref, 16 | ) => ( 17 | 18 | 29 | 30 | ), 31 | ); 32 | PopoverContent.displayName = PopoverPrimitive.Content.displayName; 33 | 34 | export { Popover, PopoverTrigger, PopoverContent }; 35 | -------------------------------------------------------------------------------- /components/ui/slider.tsx: -------------------------------------------------------------------------------- 1 | import type * as React from "react"; 2 | import { forwardRef, useRef } from "react"; 3 | import { cn } from "@/lib/cn"; 4 | import { composeEventHandlers } from "@radix-ui/primitive"; 5 | import { useComposedRefs } from "@radix-ui/react-compose-refs"; 6 | 7 | export interface SliderProps extends React.HTMLAttributes { 8 | /** 9 | * Value from 0 to 1 (percentage) 10 | */ 11 | value: number; 12 | 13 | onValueChange: (v: number) => void; 14 | onSlideEnd?: (v: number) => void; 15 | onSlideStart?: () => void; 16 | } 17 | 18 | export const Slider = forwardRef( 19 | ({ value, onValueChange, onSlideEnd, onSlideStart, ...props }, ref) => { 20 | const containerRef = useRef(null); 21 | const mergedRef = useComposedRefs(ref, containerRef); 22 | 23 | const getPercent = (x: number) => { 24 | if (!containerRef.current) return 0; 25 | 26 | const bound = containerRef.current.getBoundingClientRect(); 27 | const percent = (x - bound.left) / bound.width; 28 | 29 | return Math.min(Math.max(percent, 0), 1); 30 | }; 31 | 32 | return ( 33 | { 38 | const thumb = containerRef.current?.children[0]; 39 | const target = event.target as HTMLElement; 40 | target.setPointerCapture(event.pointerId); 41 | // Prevent browser focus behaviour because we focus a thumb manually when values change. 42 | event.preventDefault(); 43 | onSlideStart?.(); 44 | 45 | // Touch devices have a delay before focusing so won't focus if touch immediately moves 46 | // away from target (sliding). We want thumb to focus regardless. 47 | if (thumb && thumb === target) { 48 | target.focus(); 49 | } 50 | })} 51 | onPointerMove={composeEventHandlers(props.onPointerMove, (event) => { 52 | const target = event.target as HTMLElement; 53 | 54 | if (target.hasPointerCapture(event.pointerId)) { 55 | onValueChange(getPercent(event.clientX)); 56 | } 57 | })} 58 | onPointerUp={composeEventHandlers(props.onPointerUp, (event) => { 59 | const target = event.target as HTMLElement; 60 | if (target.hasPointerCapture(event.pointerId)) { 61 | target.releasePointerCapture(event.pointerId); 62 | 63 | onSlideEnd?.(getPercent(event.clientX)); 64 | } 65 | })} 66 | > 67 | 68 | 77 | 78 | 79 | ); 80 | }, 81 | ); 82 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Fuma Lofi 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /lib/cn.ts: -------------------------------------------------------------------------------- 1 | export { twMerge as cn } from "tailwind-merge"; 2 | -------------------------------------------------------------------------------- /lib/format.ts: -------------------------------------------------------------------------------- 1 | export function formatSeconds(totalSeconds: number): string { 2 | const minutes = Math.floor(totalSeconds / 60); 3 | const seconds = Math.floor(totalSeconds % 60); 4 | 5 | return `${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; 6 | } 7 | -------------------------------------------------------------------------------- /lib/music-manager.ts: -------------------------------------------------------------------------------- 1 | import { Song } from "@/music/data"; 2 | import { 3 | createQueueManager, 4 | QueueItem, 5 | QueueManager, 6 | QueueManagerOptions, 7 | } from "@/lib/queue-manager"; 8 | import { createStorageManager, StorageManager } from "@/lib/storage-manager"; 9 | 10 | export interface MusicManager { 11 | storageManager: StorageManager; 12 | queueManager: QueueManager; 13 | analyser: AnalyserNode; 14 | 15 | play(): void; 16 | pause(): void; 17 | setPlaying(song: Song): void; 18 | destroy(): void; 19 | 20 | isPaused(): boolean; 21 | getTime(): number; 22 | getDuration(): number; 23 | setTime(time: number): void; 24 | 25 | getVolume(): number; 26 | setVolume(v: number): void; 27 | } 28 | 29 | export interface MusicManagerOptions 30 | extends Omit { 31 | onNext?: (song: QueueItem | undefined) => void; 32 | onStateChange?: () => void; 33 | onTimeUpdate?: (currentTime: number, duration: number) => void; 34 | } 35 | 36 | export function createMusicManager({ 37 | onSongListUpdated, 38 | ...options 39 | }: MusicManagerOptions): MusicManager { 40 | const context = new AudioContext(); 41 | const analyser = context.createAnalyser(); 42 | const audio = new Audio(); 43 | 44 | const onStateChange = () => { 45 | options.onStateChange?.(); 46 | }; 47 | const onTimeUpdate = () => { 48 | options.onTimeUpdate?.(audio.currentTime, audio.duration); 49 | }; 50 | const onEnded = () => { 51 | manager.queueManager.next(); 52 | manager.play(); 53 | }; 54 | 55 | const storageManager = createStorageManager(); 56 | const queueManager = createQueueManager({ 57 | onUpdate: (song) => { 58 | if (song) manager.setPlaying(song); 59 | options?.onNext?.(song); 60 | options.onTimeUpdate?.(0, 0); 61 | }, 62 | onSongListUpdated, 63 | }); 64 | 65 | const init = () => { 66 | const source = context.createMediaElementSource(audio); 67 | source.connect(analyser); 68 | analyser.connect(context.destination); 69 | 70 | audio.addEventListener("timeupdate", onTimeUpdate); 71 | audio.addEventListener("play", onStateChange); 72 | audio.addEventListener("pause", onStateChange); 73 | audio.addEventListener("ended", onEnded); 74 | queueManager.setSongs(storageManager.loadSongs()); 75 | }; 76 | 77 | const manager: MusicManager = { 78 | queueManager, 79 | storageManager, 80 | analyser, 81 | getTime(): number { 82 | return audio.currentTime; 83 | }, 84 | getDuration(): number { 85 | return audio.duration; 86 | }, 87 | setTime(time: number) { 88 | audio.currentTime = time; 89 | }, 90 | isPaused(): boolean { 91 | return context.state === "suspended" || (audio != null && audio.paused); 92 | }, 93 | getVolume(): number { 94 | return audio.volume; 95 | }, 96 | setVolume(v: number) { 97 | audio.volume = v; 98 | }, 99 | async play() { 100 | // When AudioContext is initialized before the first interaction, it is suspended 101 | // we have to resume it 102 | if (context.state === "suspended") { 103 | await context.resume(); 104 | } 105 | 106 | await audio.play(); 107 | }, 108 | pause() { 109 | void audio.pause(); 110 | }, 111 | setPlaying(song) { 112 | const wasPlaying = !this.isPaused(); 113 | audio.src = song.url; 114 | 115 | if (wasPlaying) { 116 | this.play(); 117 | } 118 | }, 119 | destroy() { 120 | this.pause(); 121 | audio.removeEventListener("play", onStateChange); 122 | audio.removeEventListener("pause", onStateChange); 123 | audio.removeEventListener("timeupdate", onTimeUpdate); 124 | audio.removeEventListener("ended", onEnded); 125 | }, 126 | }; 127 | 128 | init(); 129 | 130 | return manager; 131 | } 132 | -------------------------------------------------------------------------------- /lib/queue-manager.ts: -------------------------------------------------------------------------------- 1 | import { Song } from "@/music/data"; 2 | import songs from "@/music/data.json"; 3 | 4 | export interface QueueItem extends Song { 5 | /** 6 | * Absolute index in the queue 7 | */ 8 | id: number; 9 | } 10 | 11 | export interface QueueManagerOptions { 12 | onUpdate?: (song: QueueItem | undefined) => void; 13 | onSongListUpdated?: (songs: QueueItem[]) => void; 14 | } 15 | 16 | export interface QueueManager { 17 | currentIndex: number; 18 | songs: QueueItem[]; 19 | 20 | getPendingSongs(): QueueItem[]; 21 | getCurrentSong(): QueueItem | undefined; 22 | setIndex(id: number): void; 23 | setSongs(songs: Song[]): void; 24 | 25 | previous(): void; 26 | next(): void; 27 | } 28 | 29 | export function createQueueManager(options: QueueManagerOptions): QueueManager { 30 | return { 31 | currentIndex: -1, 32 | songs: [], 33 | setSongs(songs: Song[]) { 34 | this.songs = songs.map((song, i) => ({ ...song, id: i })); 35 | 36 | // Ensure index is in the songs list 37 | this.setIndex(this.currentIndex === -1 ? 0 : this.currentIndex); 38 | 39 | // fire update 40 | options.onUpdate?.(this.getCurrentSong()); 41 | options.onSongListUpdated?.(this.songs); 42 | }, 43 | getPendingSongs() { 44 | return this.songs.slice(this.currentIndex + 1); 45 | }, 46 | getCurrentSong() { 47 | return this.songs[this.currentIndex]; 48 | }, 49 | setIndex(id) { 50 | let target: number; 51 | 52 | if (this.songs.length === 0) target = -1; 53 | else if (id >= this.songs.length) target = 0; 54 | else if (id < 0) target = songs.length - 1; 55 | else target = id; 56 | 57 | if (this.currentIndex === target) return; 58 | this.currentIndex = target; 59 | options.onUpdate?.(this.getCurrentSong()); 60 | }, 61 | next() { 62 | this.setIndex(this.currentIndex + 1); 63 | }, 64 | previous() { 65 | this.setIndex(this.currentIndex - 1); 66 | }, 67 | }; 68 | } 69 | -------------------------------------------------------------------------------- /lib/shortcut-manager.ts: -------------------------------------------------------------------------------- 1 | import { MusicManager } from "@/lib/music-manager"; 2 | 3 | export interface ShortcutManagerOptions { 4 | musicManager: MusicManager; 5 | } 6 | 7 | export interface ShortcutManager { 8 | bind(): void; 9 | onPress(event: KeyboardEvent): void; 10 | destroy(): void; 11 | } 12 | 13 | export function createShortcutManager({ 14 | musicManager, 15 | }: ShortcutManagerOptions): ShortcutManager { 16 | return { 17 | onPress(event: KeyboardEvent) { 18 | const target = event.target as HTMLElement; 19 | if (target !== document.body && target.id !== "menu-trigger") return; 20 | 21 | switch (event.key) { 22 | case "ArrowUp": 23 | musicManager.queueManager.previous(); 24 | event.preventDefault(); 25 | break; 26 | case "ArrowDown": 27 | musicManager.queueManager.next(); 28 | event.preventDefault(); 29 | break; 30 | case "ArrowLeft": 31 | musicManager.setTime(musicManager.getTime() - 1); 32 | event.preventDefault(); 33 | break; 34 | case "ArrowRight": 35 | musicManager.setTime(musicManager.getTime() + 1); 36 | event.preventDefault(); 37 | break; 38 | case " ": 39 | if (musicManager.isPaused()) musicManager.play(); 40 | else musicManager.pause(); 41 | 42 | event.preventDefault(); 43 | break; 44 | } 45 | }, 46 | bind() { 47 | window.addEventListener("keydown", this.onPress); 48 | }, 49 | destroy() { 50 | window.removeEventListener("keydown", this.onPress); 51 | }, 52 | }; 53 | } 54 | -------------------------------------------------------------------------------- /lib/storage-manager.ts: -------------------------------------------------------------------------------- 1 | import defaultSongs from "@/music/data.json"; 2 | import { Song } from "@/music/data"; 3 | 4 | export interface StorageManager { 5 | getCustomSongs(): Song[]; 6 | loadSongs(): Song[]; 7 | saveCustomSongs(songs: Song[]): void; 8 | } 9 | 10 | type Storage = { 11 | custom_songs: Song[]; 12 | }; 13 | 14 | export function createStorageManager(): StorageManager { 15 | return { 16 | saveCustomSongs(songs: Song[]) { 17 | localStorage.setItem("custom_songs", JSON.stringify(songs)); 18 | }, 19 | getCustomSongs() { 20 | const customSongs = localStorage.getItem("custom_songs"); 21 | 22 | if (customSongs) { 23 | return JSON.parse(customSongs) as Storage["custom_songs"]; 24 | } 25 | 26 | return []; 27 | }, 28 | loadSongs() { 29 | return [...defaultSongs, ...this.getCustomSongs()]; 30 | }, 31 | }; 32 | } 33 | -------------------------------------------------------------------------------- /music/data.d.ts: -------------------------------------------------------------------------------- 1 | export interface Song { 2 | name: string; 3 | author: string; 4 | url: string; 5 | picture?: string; 6 | 7 | /** 8 | * Whether the song is customised 9 | */ 10 | isCustom?: boolean; 11 | } 12 | -------------------------------------------------------------------------------- /music/data.json: -------------------------------------------------------------------------------- 1 | [{"name":"Moonshine","author":"Prigida","url":"/moonshine-prigida-main-version-01-36-17027.mp3","picture":"/moonshine-prigida-main-version-01-36-17027.mp3-info.jpeg"},{"name":"Night In Kyoto","author":"AVBE","url":"/night-in-kyoto-avbe-main-version-21302-01-57.mp3","picture":"/night-in-kyoto-avbe-main-version-21302-01-57.mp3-info.jpeg"},{"name":"Cold Brew","author":"RA","url":"/cold-brew-ra-main-version-29719-02-38.mp3","picture":"/cold-brew-ra-main-version-29719-02-38.mp3-info.jpeg"}] -------------------------------------------------------------------------------- /music/generate.mjs: -------------------------------------------------------------------------------- 1 | import { parseFile } from "music-metadata"; 2 | import * as fs from "node:fs/promises"; 3 | import * as path from "node:path"; 4 | 5 | const songFormats = ['mp3', 'ogg', 'wav', 'mp4', 'webm'] 6 | 7 | async function main() { 8 | const publicDir = await fs.readdir("./public"); 9 | const items = []; 10 | 11 | const tasks = publicDir 12 | .filter((item) => songFormats.includes(path.extname(item).slice(1))) 13 | .map(async (item) => { 14 | const metadata = await parseFile(path.resolve("public", item)); 15 | 16 | const base = { 17 | name: metadata.common.title, 18 | author: metadata.common.artist, 19 | url: `/${item}`, 20 | }; 21 | 22 | if (metadata.common.picture) { 23 | const { format, data } = metadata.common.picture[0]; 24 | const ext = format.split("/")[1]; 25 | const name = `${item}-info.${ext}`; 26 | 27 | await fs.writeFile(path.resolve("public", name), data); 28 | base.picture = `/${name}`; 29 | } 30 | 31 | items.push(base); 32 | }); 33 | 34 | await Promise.all(tasks); 35 | await fs.writeFile("./music/data.json", JSON.stringify(items)); 36 | console.log(`${items.length} items written.`) 37 | } 38 | 39 | void main(); 40 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fuma-lofi", 3 | "version": "0.1.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "generate:music": "node music/generate.mjs" 11 | }, 12 | "dependencies": { 13 | "@fontsource-variable/inter": "^5.0.17", 14 | "@radix-ui/primitive": "^1.0.1", 15 | "@radix-ui/react-compose-refs": "^1.0.1", 16 | "@radix-ui/react-dialog": "^1.0.5", 17 | "@radix-ui/react-popover": "^1.0.7", 18 | "@react-spring/three": "^9.7.3", 19 | "@react-three/drei": "^9.47.1", 20 | "@react-three/fiber": "^8.12.2", 21 | "@vitejs/plugin-react": "^4.2.1", 22 | "cva": "npm:class-variance-authority@^0.7.0", 23 | "framer-motion": "^10.9.2", 24 | "music-metadata": "^7.14.0", 25 | "react": "^18.2.0", 26 | "react-dom": "^18.2.0", 27 | "shadergradient": "^1.2.5", 28 | "tailwind-merge": "^2.2.1", 29 | "three": "^0.150.0", 30 | "three-stdlib": "^2.21.6", 31 | "vite": "^5.1.6" 32 | }, 33 | "devDependencies": { 34 | "@types/node": "^20.11.25", 35 | "@types/react": "^18.2.7", 36 | "@types/react-dom": "^18.2.7", 37 | "@types/three": "^0.150.0", 38 | "autoprefixer": "^10.0.1", 39 | "postcss": "^8.4.35", 40 | "tailwindcss": "^3.3.7", 41 | "typescript": "^5.4.2" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | dependencies: 4 | '@fontsource-variable/inter': 5 | specifier: ^5.0.17 6 | version: 5.0.17 7 | '@radix-ui/primitive': 8 | specifier: ^1.0.1 9 | version: 1.0.1 10 | '@radix-ui/react-compose-refs': 11 | specifier: ^1.0.1 12 | version: 1.0.1(@types/react@18.2.64)(react@18.2.0) 13 | '@radix-ui/react-dialog': 14 | specifier: ^1.0.5 15 | version: 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 16 | '@radix-ui/react-popover': 17 | specifier: ^1.0.7 18 | version: 1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 19 | '@react-spring/three': 20 | specifier: ^9.7.3 21 | version: 9.7.3(@react-three/fiber@8.15.19)(react@18.2.0)(three@0.150.0) 22 | '@react-three/drei': 23 | specifier: ^9.47.1 24 | version: 9.47.1(@react-three/fiber@8.15.19)(react-dom@18.2.0)(react@18.2.0)(three@0.150.0) 25 | '@react-three/fiber': 26 | specifier: ^8.12.2 27 | version: 8.15.19(react-dom@18.2.0)(react@18.2.0)(three@0.150.0) 28 | '@vitejs/plugin-react': 29 | specifier: ^4.2.1 30 | version: 4.2.1(vite@5.1.6) 31 | cva: 32 | specifier: npm:class-variance-authority@^0.7.0 33 | version: /class-variance-authority@0.7.0 34 | framer-motion: 35 | specifier: ^10.9.2 36 | version: 10.9.2(react-dom@18.2.0)(react@18.2.0) 37 | music-metadata: 38 | specifier: ^7.14.0 39 | version: 7.14.0 40 | react: 41 | specifier: ^18.2.0 42 | version: 18.2.0 43 | react-dom: 44 | specifier: ^18.2.0 45 | version: 18.2.0(react@18.2.0) 46 | shadergradient: 47 | specifier: ^1.2.5 48 | version: 1.2.5(@babel/runtime@7.24.0)(@react-spring/three@9.7.3)(@react-three/drei@9.47.1)(@react-three/fiber@8.15.19)(@types/react@18.2.64)(framer-motion@10.9.2)(react-dom@18.2.0)(react@18.2.0)(three-stdlib@2.29.5)(three@0.150.0) 49 | tailwind-merge: 50 | specifier: ^2.2.1 51 | version: 2.2.1 52 | three: 53 | specifier: ^0.150.0 54 | version: 0.150.0 55 | three-stdlib: 56 | specifier: ^2.21.6 57 | version: 2.29.5(three@0.150.0) 58 | vite: 59 | specifier: ^5.1.6 60 | version: 5.1.6(@types/node@20.11.25) 61 | 62 | devDependencies: 63 | '@types/node': 64 | specifier: ^20.11.25 65 | version: 20.11.25 66 | '@types/react': 67 | specifier: ^18.2.7 68 | version: 18.2.64 69 | '@types/react-dom': 70 | specifier: ^18.2.7 71 | version: 18.2.21 72 | '@types/three': 73 | specifier: ^0.150.0 74 | version: 0.150.0 75 | autoprefixer: 76 | specifier: ^10.0.1 77 | version: 10.4.18(postcss@8.4.35) 78 | postcss: 79 | specifier: ^8.4.35 80 | version: 8.4.35 81 | tailwindcss: 82 | specifier: ^3.3.7 83 | version: 3.4.1 84 | typescript: 85 | specifier: ^5.4.2 86 | version: 5.4.2 87 | 88 | packages: 89 | 90 | /@alloc/quick-lru@5.2.0: 91 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 92 | engines: {node: '>=10'} 93 | dev: true 94 | 95 | /@ampproject/remapping@2.3.0: 96 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 97 | engines: {node: '>=6.0.0'} 98 | dependencies: 99 | '@jridgewell/gen-mapping': 0.3.5 100 | '@jridgewell/trace-mapping': 0.3.25 101 | dev: false 102 | 103 | /@babel/code-frame@7.23.5: 104 | resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} 105 | engines: {node: '>=6.9.0'} 106 | dependencies: 107 | '@babel/highlight': 7.23.4 108 | chalk: 2.4.2 109 | dev: false 110 | 111 | /@babel/compat-data@7.23.5: 112 | resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} 113 | engines: {node: '>=6.9.0'} 114 | dev: false 115 | 116 | /@babel/core@7.24.0: 117 | resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} 118 | engines: {node: '>=6.9.0'} 119 | dependencies: 120 | '@ampproject/remapping': 2.3.0 121 | '@babel/code-frame': 7.23.5 122 | '@babel/generator': 7.23.6 123 | '@babel/helper-compilation-targets': 7.23.6 124 | '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) 125 | '@babel/helpers': 7.24.0 126 | '@babel/parser': 7.24.0 127 | '@babel/template': 7.24.0 128 | '@babel/traverse': 7.24.0 129 | '@babel/types': 7.24.0 130 | convert-source-map: 2.0.0 131 | debug: 4.3.4 132 | gensync: 1.0.0-beta.2 133 | json5: 2.2.3 134 | semver: 6.3.1 135 | transitivePeerDependencies: 136 | - supports-color 137 | dev: false 138 | 139 | /@babel/generator@7.23.6: 140 | resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} 141 | engines: {node: '>=6.9.0'} 142 | dependencies: 143 | '@babel/types': 7.24.0 144 | '@jridgewell/gen-mapping': 0.3.5 145 | '@jridgewell/trace-mapping': 0.3.25 146 | jsesc: 2.5.2 147 | dev: false 148 | 149 | /@babel/helper-compilation-targets@7.23.6: 150 | resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} 151 | engines: {node: '>=6.9.0'} 152 | dependencies: 153 | '@babel/compat-data': 7.23.5 154 | '@babel/helper-validator-option': 7.23.5 155 | browserslist: 4.23.0 156 | lru-cache: 5.1.1 157 | semver: 6.3.1 158 | dev: false 159 | 160 | /@babel/helper-environment-visitor@7.22.20: 161 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 162 | engines: {node: '>=6.9.0'} 163 | dev: false 164 | 165 | /@babel/helper-function-name@7.23.0: 166 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 167 | engines: {node: '>=6.9.0'} 168 | dependencies: 169 | '@babel/template': 7.24.0 170 | '@babel/types': 7.24.0 171 | dev: false 172 | 173 | /@babel/helper-hoist-variables@7.22.5: 174 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 175 | engines: {node: '>=6.9.0'} 176 | dependencies: 177 | '@babel/types': 7.24.0 178 | dev: false 179 | 180 | /@babel/helper-module-imports@7.22.15: 181 | resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} 182 | engines: {node: '>=6.9.0'} 183 | dependencies: 184 | '@babel/types': 7.24.0 185 | dev: false 186 | 187 | /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): 188 | resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} 189 | engines: {node: '>=6.9.0'} 190 | peerDependencies: 191 | '@babel/core': ^7.0.0 192 | dependencies: 193 | '@babel/core': 7.24.0 194 | '@babel/helper-environment-visitor': 7.22.20 195 | '@babel/helper-module-imports': 7.22.15 196 | '@babel/helper-simple-access': 7.22.5 197 | '@babel/helper-split-export-declaration': 7.22.6 198 | '@babel/helper-validator-identifier': 7.22.20 199 | dev: false 200 | 201 | /@babel/helper-plugin-utils@7.24.0: 202 | resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} 203 | engines: {node: '>=6.9.0'} 204 | dev: false 205 | 206 | /@babel/helper-simple-access@7.22.5: 207 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 208 | engines: {node: '>=6.9.0'} 209 | dependencies: 210 | '@babel/types': 7.24.0 211 | dev: false 212 | 213 | /@babel/helper-split-export-declaration@7.22.6: 214 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 215 | engines: {node: '>=6.9.0'} 216 | dependencies: 217 | '@babel/types': 7.24.0 218 | dev: false 219 | 220 | /@babel/helper-string-parser@7.23.4: 221 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 222 | engines: {node: '>=6.9.0'} 223 | dev: false 224 | 225 | /@babel/helper-validator-identifier@7.22.20: 226 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 227 | engines: {node: '>=6.9.0'} 228 | dev: false 229 | 230 | /@babel/helper-validator-option@7.23.5: 231 | resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} 232 | engines: {node: '>=6.9.0'} 233 | dev: false 234 | 235 | /@babel/helpers@7.24.0: 236 | resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} 237 | engines: {node: '>=6.9.0'} 238 | dependencies: 239 | '@babel/template': 7.24.0 240 | '@babel/traverse': 7.24.0 241 | '@babel/types': 7.24.0 242 | transitivePeerDependencies: 243 | - supports-color 244 | dev: false 245 | 246 | /@babel/highlight@7.23.4: 247 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 248 | engines: {node: '>=6.9.0'} 249 | dependencies: 250 | '@babel/helper-validator-identifier': 7.22.20 251 | chalk: 2.4.2 252 | js-tokens: 4.0.0 253 | dev: false 254 | 255 | /@babel/parser@7.24.0: 256 | resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} 257 | engines: {node: '>=6.0.0'} 258 | hasBin: true 259 | dependencies: 260 | '@babel/types': 7.24.0 261 | dev: false 262 | 263 | /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.24.0): 264 | resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} 265 | engines: {node: '>=6.9.0'} 266 | peerDependencies: 267 | '@babel/core': ^7.0.0-0 268 | dependencies: 269 | '@babel/core': 7.24.0 270 | '@babel/helper-plugin-utils': 7.24.0 271 | dev: false 272 | 273 | /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.24.0): 274 | resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} 275 | engines: {node: '>=6.9.0'} 276 | peerDependencies: 277 | '@babel/core': ^7.0.0-0 278 | dependencies: 279 | '@babel/core': 7.24.0 280 | '@babel/helper-plugin-utils': 7.24.0 281 | dev: false 282 | 283 | /@babel/runtime@7.24.0: 284 | resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} 285 | engines: {node: '>=6.9.0'} 286 | dependencies: 287 | regenerator-runtime: 0.14.1 288 | dev: false 289 | 290 | /@babel/template@7.24.0: 291 | resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} 292 | engines: {node: '>=6.9.0'} 293 | dependencies: 294 | '@babel/code-frame': 7.23.5 295 | '@babel/parser': 7.24.0 296 | '@babel/types': 7.24.0 297 | dev: false 298 | 299 | /@babel/traverse@7.24.0: 300 | resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} 301 | engines: {node: '>=6.9.0'} 302 | dependencies: 303 | '@babel/code-frame': 7.23.5 304 | '@babel/generator': 7.23.6 305 | '@babel/helper-environment-visitor': 7.22.20 306 | '@babel/helper-function-name': 7.23.0 307 | '@babel/helper-hoist-variables': 7.22.5 308 | '@babel/helper-split-export-declaration': 7.22.6 309 | '@babel/parser': 7.24.0 310 | '@babel/types': 7.24.0 311 | debug: 4.3.4 312 | globals: 11.12.0 313 | transitivePeerDependencies: 314 | - supports-color 315 | dev: false 316 | 317 | /@babel/types@7.24.0: 318 | resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} 319 | engines: {node: '>=6.9.0'} 320 | dependencies: 321 | '@babel/helper-string-parser': 7.23.4 322 | '@babel/helper-validator-identifier': 7.22.20 323 | to-fast-properties: 2.0.0 324 | dev: false 325 | 326 | /@emotion/is-prop-valid@0.8.8: 327 | resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} 328 | requiresBuild: true 329 | dependencies: 330 | '@emotion/memoize': 0.7.4 331 | dev: false 332 | optional: true 333 | 334 | /@emotion/memoize@0.7.4: 335 | resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} 336 | dev: false 337 | optional: true 338 | 339 | /@esbuild/aix-ppc64@0.19.12: 340 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 341 | engines: {node: '>=12'} 342 | cpu: [ppc64] 343 | os: [aix] 344 | requiresBuild: true 345 | dev: false 346 | optional: true 347 | 348 | /@esbuild/android-arm64@0.19.12: 349 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 350 | engines: {node: '>=12'} 351 | cpu: [arm64] 352 | os: [android] 353 | requiresBuild: true 354 | dev: false 355 | optional: true 356 | 357 | /@esbuild/android-arm@0.19.12: 358 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 359 | engines: {node: '>=12'} 360 | cpu: [arm] 361 | os: [android] 362 | requiresBuild: true 363 | dev: false 364 | optional: true 365 | 366 | /@esbuild/android-x64@0.19.12: 367 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 368 | engines: {node: '>=12'} 369 | cpu: [x64] 370 | os: [android] 371 | requiresBuild: true 372 | dev: false 373 | optional: true 374 | 375 | /@esbuild/darwin-arm64@0.19.12: 376 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 377 | engines: {node: '>=12'} 378 | cpu: [arm64] 379 | os: [darwin] 380 | requiresBuild: true 381 | dev: false 382 | optional: true 383 | 384 | /@esbuild/darwin-x64@0.19.12: 385 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 386 | engines: {node: '>=12'} 387 | cpu: [x64] 388 | os: [darwin] 389 | requiresBuild: true 390 | dev: false 391 | optional: true 392 | 393 | /@esbuild/freebsd-arm64@0.19.12: 394 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 395 | engines: {node: '>=12'} 396 | cpu: [arm64] 397 | os: [freebsd] 398 | requiresBuild: true 399 | dev: false 400 | optional: true 401 | 402 | /@esbuild/freebsd-x64@0.19.12: 403 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 404 | engines: {node: '>=12'} 405 | cpu: [x64] 406 | os: [freebsd] 407 | requiresBuild: true 408 | dev: false 409 | optional: true 410 | 411 | /@esbuild/linux-arm64@0.19.12: 412 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 413 | engines: {node: '>=12'} 414 | cpu: [arm64] 415 | os: [linux] 416 | requiresBuild: true 417 | dev: false 418 | optional: true 419 | 420 | /@esbuild/linux-arm@0.19.12: 421 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 422 | engines: {node: '>=12'} 423 | cpu: [arm] 424 | os: [linux] 425 | requiresBuild: true 426 | dev: false 427 | optional: true 428 | 429 | /@esbuild/linux-ia32@0.19.12: 430 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 431 | engines: {node: '>=12'} 432 | cpu: [ia32] 433 | os: [linux] 434 | requiresBuild: true 435 | dev: false 436 | optional: true 437 | 438 | /@esbuild/linux-loong64@0.19.12: 439 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 440 | engines: {node: '>=12'} 441 | cpu: [loong64] 442 | os: [linux] 443 | requiresBuild: true 444 | dev: false 445 | optional: true 446 | 447 | /@esbuild/linux-mips64el@0.19.12: 448 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 449 | engines: {node: '>=12'} 450 | cpu: [mips64el] 451 | os: [linux] 452 | requiresBuild: true 453 | dev: false 454 | optional: true 455 | 456 | /@esbuild/linux-ppc64@0.19.12: 457 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 458 | engines: {node: '>=12'} 459 | cpu: [ppc64] 460 | os: [linux] 461 | requiresBuild: true 462 | dev: false 463 | optional: true 464 | 465 | /@esbuild/linux-riscv64@0.19.12: 466 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 467 | engines: {node: '>=12'} 468 | cpu: [riscv64] 469 | os: [linux] 470 | requiresBuild: true 471 | dev: false 472 | optional: true 473 | 474 | /@esbuild/linux-s390x@0.19.12: 475 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 476 | engines: {node: '>=12'} 477 | cpu: [s390x] 478 | os: [linux] 479 | requiresBuild: true 480 | dev: false 481 | optional: true 482 | 483 | /@esbuild/linux-x64@0.19.12: 484 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 485 | engines: {node: '>=12'} 486 | cpu: [x64] 487 | os: [linux] 488 | requiresBuild: true 489 | dev: false 490 | optional: true 491 | 492 | /@esbuild/netbsd-x64@0.19.12: 493 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 494 | engines: {node: '>=12'} 495 | cpu: [x64] 496 | os: [netbsd] 497 | requiresBuild: true 498 | dev: false 499 | optional: true 500 | 501 | /@esbuild/openbsd-x64@0.19.12: 502 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 503 | engines: {node: '>=12'} 504 | cpu: [x64] 505 | os: [openbsd] 506 | requiresBuild: true 507 | dev: false 508 | optional: true 509 | 510 | /@esbuild/sunos-x64@0.19.12: 511 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 512 | engines: {node: '>=12'} 513 | cpu: [x64] 514 | os: [sunos] 515 | requiresBuild: true 516 | dev: false 517 | optional: true 518 | 519 | /@esbuild/win32-arm64@0.19.12: 520 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 521 | engines: {node: '>=12'} 522 | cpu: [arm64] 523 | os: [win32] 524 | requiresBuild: true 525 | dev: false 526 | optional: true 527 | 528 | /@esbuild/win32-ia32@0.19.12: 529 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 530 | engines: {node: '>=12'} 531 | cpu: [ia32] 532 | os: [win32] 533 | requiresBuild: true 534 | dev: false 535 | optional: true 536 | 537 | /@esbuild/win32-x64@0.19.12: 538 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 539 | engines: {node: '>=12'} 540 | cpu: [x64] 541 | os: [win32] 542 | requiresBuild: true 543 | dev: false 544 | optional: true 545 | 546 | /@floating-ui/core@1.6.0: 547 | resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} 548 | dependencies: 549 | '@floating-ui/utils': 0.2.1 550 | dev: false 551 | 552 | /@floating-ui/dom@1.6.3: 553 | resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} 554 | dependencies: 555 | '@floating-ui/core': 1.6.0 556 | '@floating-ui/utils': 0.2.1 557 | dev: false 558 | 559 | /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): 560 | resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} 561 | peerDependencies: 562 | react: '>=16.8.0' 563 | react-dom: '>=16.8.0' 564 | dependencies: 565 | '@floating-ui/dom': 1.6.3 566 | react: 18.2.0 567 | react-dom: 18.2.0(react@18.2.0) 568 | dev: false 569 | 570 | /@floating-ui/utils@0.2.1: 571 | resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} 572 | dev: false 573 | 574 | /@fontsource-variable/inter@5.0.17: 575 | resolution: {integrity: sha512-sa80nNnqF8kzhBvqusWiL9vlPMVpdmOwMmDBup46Jggsr1VBqo+YuzwB36Ls+X6uHJtb8Yv3ALBHL/zGmT862A==} 576 | dev: false 577 | 578 | /@isaacs/cliui@8.0.2: 579 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 580 | engines: {node: '>=12'} 581 | dependencies: 582 | string-width: 5.1.2 583 | string-width-cjs: /string-width@4.2.3 584 | strip-ansi: 7.1.0 585 | strip-ansi-cjs: /strip-ansi@6.0.1 586 | wrap-ansi: 8.1.0 587 | wrap-ansi-cjs: /wrap-ansi@7.0.0 588 | dev: true 589 | 590 | /@jridgewell/gen-mapping@0.3.5: 591 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 592 | engines: {node: '>=6.0.0'} 593 | dependencies: 594 | '@jridgewell/set-array': 1.2.1 595 | '@jridgewell/sourcemap-codec': 1.4.15 596 | '@jridgewell/trace-mapping': 0.3.25 597 | 598 | /@jridgewell/resolve-uri@3.1.2: 599 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 600 | engines: {node: '>=6.0.0'} 601 | 602 | /@jridgewell/set-array@1.2.1: 603 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 604 | engines: {node: '>=6.0.0'} 605 | 606 | /@jridgewell/sourcemap-codec@1.4.15: 607 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 608 | 609 | /@jridgewell/trace-mapping@0.3.25: 610 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 611 | dependencies: 612 | '@jridgewell/resolve-uri': 3.1.2 613 | '@jridgewell/sourcemap-codec': 1.4.15 614 | 615 | /@nodelib/fs.scandir@2.1.5: 616 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 617 | engines: {node: '>= 8'} 618 | dependencies: 619 | '@nodelib/fs.stat': 2.0.5 620 | run-parallel: 1.2.0 621 | dev: true 622 | 623 | /@nodelib/fs.stat@2.0.5: 624 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 625 | engines: {node: '>= 8'} 626 | dev: true 627 | 628 | /@nodelib/fs.walk@1.2.8: 629 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 630 | engines: {node: '>= 8'} 631 | dependencies: 632 | '@nodelib/fs.scandir': 2.1.5 633 | fastq: 1.17.1 634 | dev: true 635 | 636 | /@pkgjs/parseargs@0.11.0: 637 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 638 | engines: {node: '>=14'} 639 | requiresBuild: true 640 | dev: true 641 | optional: true 642 | 643 | /@radix-ui/primitive@1.0.1: 644 | resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} 645 | dependencies: 646 | '@babel/runtime': 7.24.0 647 | dev: false 648 | 649 | /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 650 | resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} 651 | peerDependencies: 652 | '@types/react': '*' 653 | '@types/react-dom': '*' 654 | react: ^16.8 || ^17.0 || ^18.0 655 | react-dom: ^16.8 || ^17.0 || ^18.0 656 | peerDependenciesMeta: 657 | '@types/react': 658 | optional: true 659 | '@types/react-dom': 660 | optional: true 661 | dependencies: 662 | '@babel/runtime': 7.24.0 663 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 664 | '@types/react': 18.2.64 665 | '@types/react-dom': 18.2.21 666 | react: 18.2.0 667 | react-dom: 18.2.0(react@18.2.0) 668 | dev: false 669 | 670 | /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.64)(react@18.2.0): 671 | resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} 672 | peerDependencies: 673 | '@types/react': '*' 674 | react: ^16.8 || ^17.0 || ^18.0 675 | peerDependenciesMeta: 676 | '@types/react': 677 | optional: true 678 | dependencies: 679 | '@babel/runtime': 7.24.0 680 | '@types/react': 18.2.64 681 | react: 18.2.0 682 | dev: false 683 | 684 | /@radix-ui/react-context@1.0.1(@types/react@18.2.64)(react@18.2.0): 685 | resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 686 | peerDependencies: 687 | '@types/react': '*' 688 | react: ^16.8 || ^17.0 || ^18.0 689 | peerDependenciesMeta: 690 | '@types/react': 691 | optional: true 692 | dependencies: 693 | '@babel/runtime': 7.24.0 694 | '@types/react': 18.2.64 695 | react: 18.2.0 696 | dev: false 697 | 698 | /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 699 | resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} 700 | peerDependencies: 701 | '@types/react': '*' 702 | '@types/react-dom': '*' 703 | react: ^16.8 || ^17.0 || ^18.0 704 | react-dom: ^16.8 || ^17.0 || ^18.0 705 | peerDependenciesMeta: 706 | '@types/react': 707 | optional: true 708 | '@types/react-dom': 709 | optional: true 710 | dependencies: 711 | '@babel/runtime': 7.24.0 712 | '@radix-ui/primitive': 1.0.1 713 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 714 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 715 | '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 716 | '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) 717 | '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 718 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 719 | '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 720 | '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 721 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 722 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 723 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 724 | '@types/react': 18.2.64 725 | '@types/react-dom': 18.2.21 726 | aria-hidden: 1.2.3 727 | react: 18.2.0 728 | react-dom: 18.2.0(react@18.2.0) 729 | react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) 730 | dev: false 731 | 732 | /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 733 | resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} 734 | peerDependencies: 735 | '@types/react': '*' 736 | '@types/react-dom': '*' 737 | react: ^16.8 || ^17.0 || ^18.0 738 | react-dom: ^16.8 || ^17.0 || ^18.0 739 | peerDependenciesMeta: 740 | '@types/react': 741 | optional: true 742 | '@types/react-dom': 743 | optional: true 744 | dependencies: 745 | '@babel/runtime': 7.24.0 746 | '@radix-ui/primitive': 1.0.1 747 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 748 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 749 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 750 | '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.64)(react@18.2.0) 751 | '@types/react': 18.2.64 752 | '@types/react-dom': 18.2.21 753 | react: 18.2.0 754 | react-dom: 18.2.0(react@18.2.0) 755 | dev: false 756 | 757 | /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.64)(react@18.2.0): 758 | resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} 759 | peerDependencies: 760 | '@types/react': '*' 761 | react: ^16.8 || ^17.0 || ^18.0 762 | peerDependenciesMeta: 763 | '@types/react': 764 | optional: true 765 | dependencies: 766 | '@babel/runtime': 7.24.0 767 | '@types/react': 18.2.64 768 | react: 18.2.0 769 | dev: false 770 | 771 | /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 772 | resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} 773 | peerDependencies: 774 | '@types/react': '*' 775 | '@types/react-dom': '*' 776 | react: ^16.8 || ^17.0 || ^18.0 777 | react-dom: ^16.8 || ^17.0 || ^18.0 778 | peerDependenciesMeta: 779 | '@types/react': 780 | optional: true 781 | '@types/react-dom': 782 | optional: true 783 | dependencies: 784 | '@babel/runtime': 7.24.0 785 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 786 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 787 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 788 | '@types/react': 18.2.64 789 | '@types/react-dom': 18.2.21 790 | react: 18.2.0 791 | react-dom: 18.2.0(react@18.2.0) 792 | dev: false 793 | 794 | /@radix-ui/react-id@1.0.1(@types/react@18.2.64)(react@18.2.0): 795 | resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} 796 | peerDependencies: 797 | '@types/react': '*' 798 | react: ^16.8 || ^17.0 || ^18.0 799 | peerDependenciesMeta: 800 | '@types/react': 801 | optional: true 802 | dependencies: 803 | '@babel/runtime': 7.24.0 804 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 805 | '@types/react': 18.2.64 806 | react: 18.2.0 807 | dev: false 808 | 809 | /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 810 | resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} 811 | peerDependencies: 812 | '@types/react': '*' 813 | '@types/react-dom': '*' 814 | react: ^16.8 || ^17.0 || ^18.0 815 | react-dom: ^16.8 || ^17.0 || ^18.0 816 | peerDependenciesMeta: 817 | '@types/react': 818 | optional: true 819 | '@types/react-dom': 820 | optional: true 821 | dependencies: 822 | '@babel/runtime': 7.24.0 823 | '@radix-ui/primitive': 1.0.1 824 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 825 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 826 | '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 827 | '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) 828 | '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 829 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 830 | '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 831 | '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 832 | '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 833 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 834 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 835 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 836 | '@types/react': 18.2.64 837 | '@types/react-dom': 18.2.21 838 | aria-hidden: 1.2.3 839 | react: 18.2.0 840 | react-dom: 18.2.0(react@18.2.0) 841 | react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) 842 | dev: false 843 | 844 | /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 845 | resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} 846 | peerDependencies: 847 | '@types/react': '*' 848 | '@types/react-dom': '*' 849 | react: ^16.8 || ^17.0 || ^18.0 850 | react-dom: ^16.8 || ^17.0 || ^18.0 851 | peerDependenciesMeta: 852 | '@types/react': 853 | optional: true 854 | '@types/react-dom': 855 | optional: true 856 | dependencies: 857 | '@babel/runtime': 7.24.0 858 | '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) 859 | '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 860 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 861 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 862 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 863 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 864 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 865 | '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 866 | '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0) 867 | '@radix-ui/rect': 1.0.1 868 | '@types/react': 18.2.64 869 | '@types/react-dom': 18.2.21 870 | react: 18.2.0 871 | react-dom: 18.2.0(react@18.2.0) 872 | dev: false 873 | 874 | /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 875 | resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} 876 | peerDependencies: 877 | '@types/react': '*' 878 | '@types/react-dom': '*' 879 | react: ^16.8 || ^17.0 || ^18.0 880 | react-dom: ^16.8 || ^17.0 || ^18.0 881 | peerDependenciesMeta: 882 | '@types/react': 883 | optional: true 884 | '@types/react-dom': 885 | optional: true 886 | dependencies: 887 | '@babel/runtime': 7.24.0 888 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) 889 | '@types/react': 18.2.64 890 | '@types/react-dom': 18.2.21 891 | react: 18.2.0 892 | react-dom: 18.2.0(react@18.2.0) 893 | dev: false 894 | 895 | /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 896 | resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} 897 | peerDependencies: 898 | '@types/react': '*' 899 | '@types/react-dom': '*' 900 | react: ^16.8 || ^17.0 || ^18.0 901 | react-dom: ^16.8 || ^17.0 || ^18.0 902 | peerDependenciesMeta: 903 | '@types/react': 904 | optional: true 905 | '@types/react-dom': 906 | optional: true 907 | dependencies: 908 | '@babel/runtime': 7.24.0 909 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 910 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 911 | '@types/react': 18.2.64 912 | '@types/react-dom': 18.2.21 913 | react: 18.2.0 914 | react-dom: 18.2.0(react@18.2.0) 915 | dev: false 916 | 917 | /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): 918 | resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 919 | peerDependencies: 920 | '@types/react': '*' 921 | '@types/react-dom': '*' 922 | react: ^16.8 || ^17.0 || ^18.0 923 | react-dom: ^16.8 || ^17.0 || ^18.0 924 | peerDependenciesMeta: 925 | '@types/react': 926 | optional: true 927 | '@types/react-dom': 928 | optional: true 929 | dependencies: 930 | '@babel/runtime': 7.24.0 931 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 932 | '@types/react': 18.2.64 933 | '@types/react-dom': 18.2.21 934 | react: 18.2.0 935 | react-dom: 18.2.0(react@18.2.0) 936 | dev: false 937 | 938 | /@radix-ui/react-slot@1.0.2(@types/react@18.2.64)(react@18.2.0): 939 | resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} 940 | peerDependencies: 941 | '@types/react': '*' 942 | react: ^16.8 || ^17.0 || ^18.0 943 | peerDependenciesMeta: 944 | '@types/react': 945 | optional: true 946 | dependencies: 947 | '@babel/runtime': 7.24.0 948 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 949 | '@types/react': 18.2.64 950 | react: 18.2.0 951 | dev: false 952 | 953 | /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.64)(react@18.2.0): 954 | resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} 955 | peerDependencies: 956 | '@types/react': '*' 957 | react: ^16.8 || ^17.0 || ^18.0 958 | peerDependenciesMeta: 959 | '@types/react': 960 | optional: true 961 | dependencies: 962 | '@babel/runtime': 7.24.0 963 | '@types/react': 18.2.64 964 | react: 18.2.0 965 | dev: false 966 | 967 | /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.64)(react@18.2.0): 968 | resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} 969 | peerDependencies: 970 | '@types/react': '*' 971 | react: ^16.8 || ^17.0 || ^18.0 972 | peerDependenciesMeta: 973 | '@types/react': 974 | optional: true 975 | dependencies: 976 | '@babel/runtime': 7.24.0 977 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 978 | '@types/react': 18.2.64 979 | react: 18.2.0 980 | dev: false 981 | 982 | /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.64)(react@18.2.0): 983 | resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} 984 | peerDependencies: 985 | '@types/react': '*' 986 | react: ^16.8 || ^17.0 || ^18.0 987 | peerDependenciesMeta: 988 | '@types/react': 989 | optional: true 990 | dependencies: 991 | '@babel/runtime': 7.24.0 992 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 993 | '@types/react': 18.2.64 994 | react: 18.2.0 995 | dev: false 996 | 997 | /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.64)(react@18.2.0): 998 | resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} 999 | peerDependencies: 1000 | '@types/react': '*' 1001 | react: ^16.8 || ^17.0 || ^18.0 1002 | peerDependenciesMeta: 1003 | '@types/react': 1004 | optional: true 1005 | dependencies: 1006 | '@babel/runtime': 7.24.0 1007 | '@types/react': 18.2.64 1008 | react: 18.2.0 1009 | dev: false 1010 | 1011 | /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.64)(react@18.2.0): 1012 | resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} 1013 | peerDependencies: 1014 | '@types/react': '*' 1015 | react: ^16.8 || ^17.0 || ^18.0 1016 | peerDependenciesMeta: 1017 | '@types/react': 1018 | optional: true 1019 | dependencies: 1020 | '@babel/runtime': 7.24.0 1021 | '@radix-ui/rect': 1.0.1 1022 | '@types/react': 18.2.64 1023 | react: 18.2.0 1024 | dev: false 1025 | 1026 | /@radix-ui/react-use-size@1.0.1(@types/react@18.2.64)(react@18.2.0): 1027 | resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} 1028 | peerDependencies: 1029 | '@types/react': '*' 1030 | react: ^16.8 || ^17.0 || ^18.0 1031 | peerDependenciesMeta: 1032 | '@types/react': 1033 | optional: true 1034 | dependencies: 1035 | '@babel/runtime': 7.24.0 1036 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 1037 | '@types/react': 18.2.64 1038 | react: 18.2.0 1039 | dev: false 1040 | 1041 | /@radix-ui/rect@1.0.1: 1042 | resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} 1043 | dependencies: 1044 | '@babel/runtime': 7.24.0 1045 | dev: false 1046 | 1047 | /@react-spring/animated@9.7.3(react@18.2.0): 1048 | resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} 1049 | peerDependencies: 1050 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1051 | dependencies: 1052 | '@react-spring/shared': 9.7.3(react@18.2.0) 1053 | '@react-spring/types': 9.7.3 1054 | react: 18.2.0 1055 | dev: false 1056 | 1057 | /@react-spring/core@9.7.3(react@18.2.0): 1058 | resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} 1059 | peerDependencies: 1060 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1061 | dependencies: 1062 | '@react-spring/animated': 9.7.3(react@18.2.0) 1063 | '@react-spring/shared': 9.7.3(react@18.2.0) 1064 | '@react-spring/types': 9.7.3 1065 | react: 18.2.0 1066 | dev: false 1067 | 1068 | /@react-spring/shared@9.7.3(react@18.2.0): 1069 | resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} 1070 | peerDependencies: 1071 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1072 | dependencies: 1073 | '@react-spring/types': 9.7.3 1074 | react: 18.2.0 1075 | dev: false 1076 | 1077 | /@react-spring/three@9.7.3(@react-three/fiber@8.15.19)(react@18.2.0)(three@0.150.0): 1078 | resolution: {integrity: sha512-Q1p512CqUlmMK8UMBF/Rj79qndhOWq4XUTayxMP9S892jiXzWQuj+xC3Xvm59DP/D4JXusXpxxqfgoH+hmOktA==} 1079 | peerDependencies: 1080 | '@react-three/fiber': '>=6.0' 1081 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1082 | three: '>=0.126' 1083 | dependencies: 1084 | '@react-spring/animated': 9.7.3(react@18.2.0) 1085 | '@react-spring/core': 9.7.3(react@18.2.0) 1086 | '@react-spring/shared': 9.7.3(react@18.2.0) 1087 | '@react-spring/types': 9.7.3 1088 | '@react-three/fiber': 8.15.19(react-dom@18.2.0)(react@18.2.0)(three@0.150.0) 1089 | react: 18.2.0 1090 | three: 0.150.0 1091 | dev: false 1092 | 1093 | /@react-spring/types@9.7.3: 1094 | resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} 1095 | dev: false 1096 | 1097 | /@react-three/drei@9.47.1(@react-three/fiber@8.15.19)(react-dom@18.2.0)(react@18.2.0)(three@0.150.0): 1098 | resolution: {integrity: sha512-Pu4vfpUvE7BSjvAOXDb/XBQIqzzoe1BL97CqpV0Q+dMfgQxm2rw0I5WGzYvF4VXN68qu5iTZUPS8G1u5zebDFw==} 1099 | peerDependencies: 1100 | '@react-three/fiber': '>=8.0' 1101 | react: '>=18.0' 1102 | react-dom: '>=18.0' 1103 | three: '>=0.137' 1104 | peerDependenciesMeta: 1105 | react-dom: 1106 | optional: true 1107 | dependencies: 1108 | '@babel/runtime': 7.24.0 1109 | '@react-spring/three': 9.7.3(@react-three/fiber@8.15.19)(react@18.2.0)(three@0.150.0) 1110 | '@react-three/fiber': 8.15.19(react-dom@18.2.0)(react@18.2.0)(three@0.150.0) 1111 | '@use-gesture/react': 10.3.0(react@18.2.0) 1112 | detect-gpu: 5.0.38 1113 | glsl-noise: 0.0.0 1114 | lodash.clamp: 4.0.3 1115 | lodash.omit: 4.5.0 1116 | lodash.pick: 4.4.0 1117 | meshline: 3.2.0(three@0.150.0) 1118 | react: 18.2.0 1119 | react-composer: 5.0.3(react@18.2.0) 1120 | react-dom: 18.2.0(react@18.2.0) 1121 | react-merge-refs: 1.1.0 1122 | stats.js: 0.17.0 1123 | suspend-react: 0.0.8(react@18.2.0) 1124 | three: 0.150.0 1125 | three-mesh-bvh: 0.5.24(three@0.150.0) 1126 | three-stdlib: 2.29.5(three@0.150.0) 1127 | troika-three-text: 0.47.2(three@0.150.0) 1128 | utility-types: 3.11.0 1129 | zustand: 3.7.2(react@18.2.0) 1130 | dev: false 1131 | 1132 | /@react-three/fiber@8.15.19(react-dom@18.2.0)(react@18.2.0)(three@0.150.0): 1133 | resolution: {integrity: sha512-WbFU7T6485v8Onnp+JJnrzKFvvGP7OFyJmHlqXiXc2RcXl9Sax+ykJxiNwEXWjGjcgF9/KTfv0+pAVkP0vZlKg==} 1134 | peerDependencies: 1135 | expo: '>=43.0' 1136 | expo-asset: '>=8.4' 1137 | expo-file-system: '>=11.0' 1138 | expo-gl: '>=11.0' 1139 | react: '>=18.0' 1140 | react-dom: '>=18.0' 1141 | react-native: '>=0.64' 1142 | three: '>=0.133' 1143 | peerDependenciesMeta: 1144 | expo: 1145 | optional: true 1146 | expo-asset: 1147 | optional: true 1148 | expo-file-system: 1149 | optional: true 1150 | expo-gl: 1151 | optional: true 1152 | react-dom: 1153 | optional: true 1154 | react-native: 1155 | optional: true 1156 | dependencies: 1157 | '@babel/runtime': 7.24.0 1158 | '@types/react-reconciler': 0.26.7 1159 | '@types/webxr': 0.5.14 1160 | base64-js: 1.5.1 1161 | buffer: 6.0.3 1162 | its-fine: 1.1.1(react@18.2.0) 1163 | react: 18.2.0 1164 | react-dom: 18.2.0(react@18.2.0) 1165 | react-reconciler: 0.27.0(react@18.2.0) 1166 | react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) 1167 | scheduler: 0.21.0 1168 | suspend-react: 0.1.3(react@18.2.0) 1169 | three: 0.150.0 1170 | zustand: 3.7.2(react@18.2.0) 1171 | dev: false 1172 | 1173 | /@rollup/rollup-android-arm-eabi@4.13.0: 1174 | resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} 1175 | cpu: [arm] 1176 | os: [android] 1177 | requiresBuild: true 1178 | dev: false 1179 | optional: true 1180 | 1181 | /@rollup/rollup-android-arm64@4.13.0: 1182 | resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} 1183 | cpu: [arm64] 1184 | os: [android] 1185 | requiresBuild: true 1186 | dev: false 1187 | optional: true 1188 | 1189 | /@rollup/rollup-darwin-arm64@4.13.0: 1190 | resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} 1191 | cpu: [arm64] 1192 | os: [darwin] 1193 | requiresBuild: true 1194 | dev: false 1195 | optional: true 1196 | 1197 | /@rollup/rollup-darwin-x64@4.13.0: 1198 | resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} 1199 | cpu: [x64] 1200 | os: [darwin] 1201 | requiresBuild: true 1202 | dev: false 1203 | optional: true 1204 | 1205 | /@rollup/rollup-linux-arm-gnueabihf@4.13.0: 1206 | resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} 1207 | cpu: [arm] 1208 | os: [linux] 1209 | requiresBuild: true 1210 | dev: false 1211 | optional: true 1212 | 1213 | /@rollup/rollup-linux-arm64-gnu@4.13.0: 1214 | resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} 1215 | cpu: [arm64] 1216 | os: [linux] 1217 | requiresBuild: true 1218 | dev: false 1219 | optional: true 1220 | 1221 | /@rollup/rollup-linux-arm64-musl@4.13.0: 1222 | resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} 1223 | cpu: [arm64] 1224 | os: [linux] 1225 | requiresBuild: true 1226 | dev: false 1227 | optional: true 1228 | 1229 | /@rollup/rollup-linux-riscv64-gnu@4.13.0: 1230 | resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} 1231 | cpu: [riscv64] 1232 | os: [linux] 1233 | requiresBuild: true 1234 | dev: false 1235 | optional: true 1236 | 1237 | /@rollup/rollup-linux-x64-gnu@4.13.0: 1238 | resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} 1239 | cpu: [x64] 1240 | os: [linux] 1241 | requiresBuild: true 1242 | dev: false 1243 | optional: true 1244 | 1245 | /@rollup/rollup-linux-x64-musl@4.13.0: 1246 | resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} 1247 | cpu: [x64] 1248 | os: [linux] 1249 | requiresBuild: true 1250 | dev: false 1251 | optional: true 1252 | 1253 | /@rollup/rollup-win32-arm64-msvc@4.13.0: 1254 | resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} 1255 | cpu: [arm64] 1256 | os: [win32] 1257 | requiresBuild: true 1258 | dev: false 1259 | optional: true 1260 | 1261 | /@rollup/rollup-win32-ia32-msvc@4.13.0: 1262 | resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} 1263 | cpu: [ia32] 1264 | os: [win32] 1265 | requiresBuild: true 1266 | dev: false 1267 | optional: true 1268 | 1269 | /@rollup/rollup-win32-x64-msvc@4.13.0: 1270 | resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} 1271 | cpu: [x64] 1272 | os: [win32] 1273 | requiresBuild: true 1274 | dev: false 1275 | optional: true 1276 | 1277 | /@supabase/functions-js@2.1.5: 1278 | resolution: {integrity: sha512-BNzC5XhCzzCaggJ8s53DP+WeHHGT/NfTsx2wUSSGKR2/ikLFQTBCDzMvGz/PxYMqRko/LwncQtKXGOYp1PkPaw==} 1279 | dependencies: 1280 | '@supabase/node-fetch': 2.6.15 1281 | dev: false 1282 | 1283 | /@supabase/gotrue-js@2.62.2: 1284 | resolution: {integrity: sha512-AP6e6W9rQXFTEJ7sTTNYQrNf0LCcnt1hUW+RIgUK+Uh3jbWvcIST7wAlYyNZiMlS9+PYyymWQ+Ykz/rOYSO0+A==} 1285 | dependencies: 1286 | '@supabase/node-fetch': 2.6.15 1287 | dev: false 1288 | 1289 | /@supabase/node-fetch@2.6.15: 1290 | resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} 1291 | engines: {node: 4.x || >=6.0.0} 1292 | dependencies: 1293 | whatwg-url: 5.0.0 1294 | dev: false 1295 | 1296 | /@supabase/postgrest-js@1.9.2: 1297 | resolution: {integrity: sha512-I6yHo8CC9cxhOo6DouDMy9uOfW7hjdsnCxZiaJuIVZm1dBGTFiQPgfMa9zXCamEWzNyWRjZvupAUuX+tqcl5Sw==} 1298 | dependencies: 1299 | '@supabase/node-fetch': 2.6.15 1300 | dev: false 1301 | 1302 | /@supabase/realtime-js@2.9.3: 1303 | resolution: {integrity: sha512-lAp50s2n3FhGJFq+wTSXLNIDPw5Y0Wxrgt44eM5nLSA3jZNUUP3Oq2Ccd1CbZdVntPCWLZvJaU//pAd2NE+QnQ==} 1304 | dependencies: 1305 | '@supabase/node-fetch': 2.6.15 1306 | '@types/phoenix': 1.6.4 1307 | '@types/ws': 8.5.10 1308 | ws: 8.16.0 1309 | transitivePeerDependencies: 1310 | - bufferutil 1311 | - utf-8-validate 1312 | dev: false 1313 | 1314 | /@supabase/storage-js@2.5.5: 1315 | resolution: {integrity: sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w==} 1316 | dependencies: 1317 | '@supabase/node-fetch': 2.6.15 1318 | dev: false 1319 | 1320 | /@supabase/supabase-js@2.39.7: 1321 | resolution: {integrity: sha512-1vxsX10Uhc2b+Dv9pRjBjHfqmw2N2h1PyTg9LEfICR3x2xwE24By1MGCjDZuzDKH5OeHCsf4it6K8KRluAAEXA==} 1322 | dependencies: 1323 | '@supabase/functions-js': 2.1.5 1324 | '@supabase/gotrue-js': 2.62.2 1325 | '@supabase/node-fetch': 2.6.15 1326 | '@supabase/postgrest-js': 1.9.2 1327 | '@supabase/realtime-js': 2.9.3 1328 | '@supabase/storage-js': 2.5.5 1329 | transitivePeerDependencies: 1330 | - bufferutil 1331 | - utf-8-validate 1332 | dev: false 1333 | 1334 | /@tokenizer/token@0.3.0: 1335 | resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} 1336 | dev: false 1337 | 1338 | /@types/babel__core@7.20.5: 1339 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 1340 | dependencies: 1341 | '@babel/parser': 7.24.0 1342 | '@babel/types': 7.24.0 1343 | '@types/babel__generator': 7.6.8 1344 | '@types/babel__template': 7.4.4 1345 | '@types/babel__traverse': 7.20.5 1346 | dev: false 1347 | 1348 | /@types/babel__generator@7.6.8: 1349 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 1350 | dependencies: 1351 | '@babel/types': 7.24.0 1352 | dev: false 1353 | 1354 | /@types/babel__template@7.4.4: 1355 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 1356 | dependencies: 1357 | '@babel/parser': 7.24.0 1358 | '@babel/types': 7.24.0 1359 | dev: false 1360 | 1361 | /@types/babel__traverse@7.20.5: 1362 | resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} 1363 | dependencies: 1364 | '@babel/types': 7.24.0 1365 | dev: false 1366 | 1367 | /@types/draco3d@1.4.9: 1368 | resolution: {integrity: sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA==} 1369 | dev: false 1370 | 1371 | /@types/estree@1.0.5: 1372 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 1373 | dev: false 1374 | 1375 | /@types/node@20.11.25: 1376 | resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} 1377 | dependencies: 1378 | undici-types: 5.26.5 1379 | 1380 | /@types/offscreencanvas@2019.7.3: 1381 | resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} 1382 | dev: false 1383 | 1384 | /@types/phoenix@1.6.4: 1385 | resolution: {integrity: sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==} 1386 | dev: false 1387 | 1388 | /@types/prop-types@15.7.11: 1389 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 1390 | 1391 | /@types/react-dom@18.2.21: 1392 | resolution: {integrity: sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==} 1393 | dependencies: 1394 | '@types/react': 18.2.64 1395 | 1396 | /@types/react-reconciler@0.26.7: 1397 | resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} 1398 | dependencies: 1399 | '@types/react': 18.2.64 1400 | dev: false 1401 | 1402 | /@types/react-reconciler@0.28.8: 1403 | resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} 1404 | dependencies: 1405 | '@types/react': 18.2.64 1406 | dev: false 1407 | 1408 | /@types/react@18.2.64: 1409 | resolution: {integrity: sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==} 1410 | dependencies: 1411 | '@types/prop-types': 15.7.11 1412 | '@types/scheduler': 0.16.8 1413 | csstype: 3.1.3 1414 | 1415 | /@types/scheduler@0.16.8: 1416 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 1417 | 1418 | /@types/stats.js@0.17.3: 1419 | resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==} 1420 | dev: true 1421 | 1422 | /@types/three@0.150.0: 1423 | resolution: {integrity: sha512-AGhnz/pfV9lajfPMrzRyP/nySpZYfpoXdayGk0Tiwkzc6hsWOCkz/Q696Muxn9HV2EkQJ3u8g/dDt7jcP5Tecg==} 1424 | dependencies: 1425 | '@types/stats.js': 0.17.3 1426 | '@types/webxr': 0.5.14 1427 | fflate: 0.6.10 1428 | lil-gui: 0.17.0 1429 | dev: true 1430 | 1431 | /@types/webxr@0.5.14: 1432 | resolution: {integrity: sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==} 1433 | 1434 | /@types/ws@8.5.10: 1435 | resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} 1436 | dependencies: 1437 | '@types/node': 20.11.25 1438 | dev: false 1439 | 1440 | /@uiw/color-convert@1.4.3(@babel/runtime@7.24.0): 1441 | resolution: {integrity: sha512-i0E3P4KctYAynAKiVCUAYPQSikzJSaEXyIF/E0+RVlLKzCfQzzWi/RT2+yRdJ4HEVxr1iZNH6sgI9OrTo0/7gA==} 1442 | peerDependencies: 1443 | '@babel/runtime': '>=7.19.0' 1444 | dependencies: 1445 | '@babel/runtime': 7.24.0 1446 | dev: false 1447 | 1448 | /@uiw/react-color-alpha@1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0): 1449 | resolution: {integrity: sha512-BF6vtQev0F6x9YxDgPLH6wtN3U9JaAQYOkbLFmykpWaJBb/o0hKGrRCEFvmimAFRYp7CFmIop6aL8Jr5GM0xNw==} 1450 | peerDependencies: 1451 | '@babel/runtime': '>=7.19.0' 1452 | react: '>=16.9.0' 1453 | react-dom: '>=16.9.0' 1454 | dependencies: 1455 | '@babel/runtime': 7.24.0 1456 | '@uiw/color-convert': 1.4.3(@babel/runtime@7.24.0) 1457 | '@uiw/react-drag-event-interactive': 1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0) 1458 | react: 18.2.0 1459 | react-dom: 18.2.0(react@18.2.0) 1460 | dev: false 1461 | 1462 | /@uiw/react-color-shade-slider@1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0): 1463 | resolution: {integrity: sha512-4v9aDAZiGrB0GaDPSICeQ5msHq2LamgEH7C8O6TsVtk0DoqR6OkJgC+EpKwBp2M2gDWWUc0Hsp3jzvhpmBjt2Q==} 1464 | peerDependencies: 1465 | '@babel/runtime': '>=7.19.0' 1466 | react: '>=16.9.0' 1467 | react-dom: '>=16.9.0' 1468 | dependencies: 1469 | '@babel/runtime': 7.24.0 1470 | '@uiw/color-convert': 1.4.3(@babel/runtime@7.24.0) 1471 | '@uiw/react-color-alpha': 1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0) 1472 | react: 18.2.0 1473 | react-dom: 18.2.0(react@18.2.0) 1474 | dev: false 1475 | 1476 | /@uiw/react-color-wheel@1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0): 1477 | resolution: {integrity: sha512-g+f0EYB1Z9x+/StPfgbW1oDrdWtpiKV1lCndX7nYfTevxpX0JnhJ/bNFfa3AyiQh0NKGE3mHrFg9tQ+uR+iZJg==} 1478 | peerDependencies: 1479 | '@babel/runtime': '>=7.19.0' 1480 | react: '>=16.9.0' 1481 | react-dom: '>=16.9.0' 1482 | dependencies: 1483 | '@babel/runtime': 7.24.0 1484 | '@uiw/color-convert': 1.4.3(@babel/runtime@7.24.0) 1485 | '@uiw/react-drag-event-interactive': 1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0) 1486 | react: 18.2.0 1487 | react-dom: 18.2.0(react@18.2.0) 1488 | dev: false 1489 | 1490 | /@uiw/react-drag-event-interactive@1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0): 1491 | resolution: {integrity: sha512-PTCWPM9tx7X6bPe2PBawqpEbYKHxuuUwq+O1tfCZBcNCjEc0FI0kp3VTyIzrO5onCzG4sC2vUIWHxHE7and+2Q==} 1492 | peerDependencies: 1493 | '@babel/runtime': '>=7.19.0' 1494 | react: '>=16.9.0' 1495 | react-dom: '>=16.9.0' 1496 | dependencies: 1497 | '@babel/runtime': 7.24.0 1498 | react: 18.2.0 1499 | react-dom: 18.2.0(react@18.2.0) 1500 | dev: false 1501 | 1502 | /@use-gesture/core@10.3.0: 1503 | resolution: {integrity: sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==} 1504 | dev: false 1505 | 1506 | /@use-gesture/react@10.3.0(react@18.2.0): 1507 | resolution: {integrity: sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==} 1508 | peerDependencies: 1509 | react: '>= 16.8.0' 1510 | dependencies: 1511 | '@use-gesture/core': 10.3.0 1512 | react: 18.2.0 1513 | dev: false 1514 | 1515 | /@vitejs/plugin-react@4.2.1(vite@5.1.6): 1516 | resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} 1517 | engines: {node: ^14.18.0 || >=16.0.0} 1518 | peerDependencies: 1519 | vite: ^4.2.0 || ^5.0.0 1520 | dependencies: 1521 | '@babel/core': 7.24.0 1522 | '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.24.0) 1523 | '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.24.0) 1524 | '@types/babel__core': 7.20.5 1525 | react-refresh: 0.14.0 1526 | vite: 5.1.6(@types/node@20.11.25) 1527 | transitivePeerDependencies: 1528 | - supports-color 1529 | dev: false 1530 | 1531 | /ansi-regex@5.0.1: 1532 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1533 | engines: {node: '>=8'} 1534 | dev: true 1535 | 1536 | /ansi-regex@6.0.1: 1537 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 1538 | engines: {node: '>=12'} 1539 | dev: true 1540 | 1541 | /ansi-styles@3.2.1: 1542 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 1543 | engines: {node: '>=4'} 1544 | dependencies: 1545 | color-convert: 1.9.3 1546 | dev: false 1547 | 1548 | /ansi-styles@4.3.0: 1549 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1550 | engines: {node: '>=8'} 1551 | dependencies: 1552 | color-convert: 2.0.1 1553 | dev: true 1554 | 1555 | /ansi-styles@6.2.1: 1556 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 1557 | engines: {node: '>=12'} 1558 | dev: true 1559 | 1560 | /any-promise@1.3.0: 1561 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 1562 | dev: true 1563 | 1564 | /anymatch@3.1.3: 1565 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1566 | engines: {node: '>= 8'} 1567 | dependencies: 1568 | normalize-path: 3.0.0 1569 | picomatch: 2.3.1 1570 | dev: true 1571 | 1572 | /arg@5.0.2: 1573 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 1574 | dev: true 1575 | 1576 | /aria-hidden@1.2.3: 1577 | resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} 1578 | engines: {node: '>=10'} 1579 | dependencies: 1580 | tslib: 2.6.2 1581 | dev: false 1582 | 1583 | /autoprefixer@10.4.18(postcss@8.4.35): 1584 | resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} 1585 | engines: {node: ^10 || ^12 || >=14} 1586 | hasBin: true 1587 | peerDependencies: 1588 | postcss: ^8.1.0 1589 | dependencies: 1590 | browserslist: 4.23.0 1591 | caniuse-lite: 1.0.30001596 1592 | fraction.js: 4.3.7 1593 | normalize-range: 0.1.2 1594 | picocolors: 1.0.0 1595 | postcss: 8.4.35 1596 | postcss-value-parser: 4.2.0 1597 | dev: true 1598 | 1599 | /balanced-match@1.0.2: 1600 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1601 | dev: true 1602 | 1603 | /base64-js@1.5.1: 1604 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 1605 | dev: false 1606 | 1607 | /bidi-js@1.0.3: 1608 | resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} 1609 | dependencies: 1610 | require-from-string: 2.0.2 1611 | dev: false 1612 | 1613 | /binary-extensions@2.2.0: 1614 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1615 | engines: {node: '>=8'} 1616 | dev: true 1617 | 1618 | /brace-expansion@2.0.1: 1619 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1620 | dependencies: 1621 | balanced-match: 1.0.2 1622 | dev: true 1623 | 1624 | /braces@3.0.2: 1625 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1626 | engines: {node: '>=8'} 1627 | dependencies: 1628 | fill-range: 7.0.1 1629 | dev: true 1630 | 1631 | /browserslist@4.23.0: 1632 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 1633 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1634 | hasBin: true 1635 | dependencies: 1636 | caniuse-lite: 1.0.30001596 1637 | electron-to-chromium: 1.4.699 1638 | node-releases: 2.0.14 1639 | update-browserslist-db: 1.0.13(browserslist@4.23.0) 1640 | 1641 | /buffer@6.0.3: 1642 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 1643 | dependencies: 1644 | base64-js: 1.5.1 1645 | ieee754: 1.2.1 1646 | dev: false 1647 | 1648 | /call-bind@1.0.7: 1649 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 1650 | engines: {node: '>= 0.4'} 1651 | dependencies: 1652 | es-define-property: 1.0.0 1653 | es-errors: 1.3.0 1654 | function-bind: 1.1.2 1655 | get-intrinsic: 1.2.4 1656 | set-function-length: 1.2.2 1657 | dev: false 1658 | 1659 | /camelcase-css@2.0.1: 1660 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 1661 | engines: {node: '>= 6'} 1662 | dev: true 1663 | 1664 | /camera-controls@1.38.2(three@0.150.0): 1665 | resolution: {integrity: sha512-EfzbovxLssyWpJVG9uKcazSDDIEcd1hUsPhPF/OWWnICsKY9WbLY/2S4UPW73HHbvnVeR/Z9wsWaQKtANy/2Yg==} 1666 | peerDependencies: 1667 | three: '>=0.126.1' 1668 | dependencies: 1669 | three: 0.150.0 1670 | dev: false 1671 | 1672 | /caniuse-lite@1.0.30001596: 1673 | resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} 1674 | 1675 | /chalk@2.4.2: 1676 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1677 | engines: {node: '>=4'} 1678 | dependencies: 1679 | ansi-styles: 3.2.1 1680 | escape-string-regexp: 1.0.5 1681 | supports-color: 5.5.0 1682 | dev: false 1683 | 1684 | /chokidar@3.6.0: 1685 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 1686 | engines: {node: '>= 8.10.0'} 1687 | dependencies: 1688 | anymatch: 3.1.3 1689 | braces: 3.0.2 1690 | glob-parent: 5.1.2 1691 | is-binary-path: 2.1.0 1692 | is-glob: 4.0.3 1693 | normalize-path: 3.0.0 1694 | readdirp: 3.6.0 1695 | optionalDependencies: 1696 | fsevents: 2.3.3 1697 | dev: true 1698 | 1699 | /class-variance-authority@0.7.0: 1700 | resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} 1701 | dependencies: 1702 | clsx: 2.0.0 1703 | dev: false 1704 | 1705 | /clsx@2.0.0: 1706 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 1707 | engines: {node: '>=6'} 1708 | dev: false 1709 | 1710 | /color-convert@1.9.3: 1711 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1712 | dependencies: 1713 | color-name: 1.1.3 1714 | dev: false 1715 | 1716 | /color-convert@2.0.1: 1717 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1718 | engines: {node: '>=7.0.0'} 1719 | dependencies: 1720 | color-name: 1.1.4 1721 | dev: true 1722 | 1723 | /color-name@1.1.3: 1724 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1725 | dev: false 1726 | 1727 | /color-name@1.1.4: 1728 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1729 | dev: true 1730 | 1731 | /commander@4.1.1: 1732 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1733 | engines: {node: '>= 6'} 1734 | dev: true 1735 | 1736 | /compute-scroll-into-view@3.1.0: 1737 | resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} 1738 | dev: false 1739 | 1740 | /content-type@1.0.5: 1741 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 1742 | engines: {node: '>= 0.6'} 1743 | dev: false 1744 | 1745 | /convert-source-map@2.0.0: 1746 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1747 | dev: false 1748 | 1749 | /cross-spawn@7.0.3: 1750 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1751 | engines: {node: '>= 8'} 1752 | dependencies: 1753 | path-key: 3.1.1 1754 | shebang-command: 2.0.0 1755 | which: 2.0.2 1756 | dev: true 1757 | 1758 | /cssesc@3.0.0: 1759 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1760 | engines: {node: '>=4'} 1761 | hasBin: true 1762 | dev: true 1763 | 1764 | /csstype@3.1.3: 1765 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1766 | 1767 | /debounce@1.2.1: 1768 | resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} 1769 | dev: false 1770 | 1771 | /debug@4.3.4: 1772 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1773 | engines: {node: '>=6.0'} 1774 | peerDependencies: 1775 | supports-color: '*' 1776 | peerDependenciesMeta: 1777 | supports-color: 1778 | optional: true 1779 | dependencies: 1780 | ms: 2.1.2 1781 | dev: false 1782 | 1783 | /decode-uri-component@0.2.2: 1784 | resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} 1785 | engines: {node: '>=0.10'} 1786 | dev: false 1787 | 1788 | /define-data-property@1.1.4: 1789 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 1790 | engines: {node: '>= 0.4'} 1791 | dependencies: 1792 | es-define-property: 1.0.0 1793 | es-errors: 1.3.0 1794 | gopd: 1.0.1 1795 | dev: false 1796 | 1797 | /detect-gpu@5.0.38: 1798 | resolution: {integrity: sha512-36QeGHSXYcJ/RfrnPEScR8GDprbXFG4ZhXsfVNVHztZr38+fRxgHnJl3CjYXXjbeRUhu3ZZBJh6Lg0A9v0Qd8A==} 1799 | dependencies: 1800 | webgl-constants: 1.1.1 1801 | dev: false 1802 | 1803 | /detect-node-es@1.1.0: 1804 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} 1805 | dev: false 1806 | 1807 | /didyoumean@1.2.2: 1808 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1809 | dev: true 1810 | 1811 | /dlv@1.1.3: 1812 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1813 | dev: true 1814 | 1815 | /draco3d@1.5.7: 1816 | resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} 1817 | dev: false 1818 | 1819 | /eastasianwidth@0.2.0: 1820 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1821 | dev: true 1822 | 1823 | /electron-to-chromium@1.4.699: 1824 | resolution: {integrity: sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==} 1825 | 1826 | /emoji-regex@8.0.0: 1827 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1828 | dev: true 1829 | 1830 | /emoji-regex@9.2.2: 1831 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1832 | dev: true 1833 | 1834 | /es-define-property@1.0.0: 1835 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 1836 | engines: {node: '>= 0.4'} 1837 | dependencies: 1838 | get-intrinsic: 1.2.4 1839 | dev: false 1840 | 1841 | /es-errors@1.3.0: 1842 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 1843 | engines: {node: '>= 0.4'} 1844 | dev: false 1845 | 1846 | /esbuild@0.19.12: 1847 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 1848 | engines: {node: '>=12'} 1849 | hasBin: true 1850 | requiresBuild: true 1851 | optionalDependencies: 1852 | '@esbuild/aix-ppc64': 0.19.12 1853 | '@esbuild/android-arm': 0.19.12 1854 | '@esbuild/android-arm64': 0.19.12 1855 | '@esbuild/android-x64': 0.19.12 1856 | '@esbuild/darwin-arm64': 0.19.12 1857 | '@esbuild/darwin-x64': 0.19.12 1858 | '@esbuild/freebsd-arm64': 0.19.12 1859 | '@esbuild/freebsd-x64': 0.19.12 1860 | '@esbuild/linux-arm': 0.19.12 1861 | '@esbuild/linux-arm64': 0.19.12 1862 | '@esbuild/linux-ia32': 0.19.12 1863 | '@esbuild/linux-loong64': 0.19.12 1864 | '@esbuild/linux-mips64el': 0.19.12 1865 | '@esbuild/linux-ppc64': 0.19.12 1866 | '@esbuild/linux-riscv64': 0.19.12 1867 | '@esbuild/linux-s390x': 0.19.12 1868 | '@esbuild/linux-x64': 0.19.12 1869 | '@esbuild/netbsd-x64': 0.19.12 1870 | '@esbuild/openbsd-x64': 0.19.12 1871 | '@esbuild/sunos-x64': 0.19.12 1872 | '@esbuild/win32-arm64': 0.19.12 1873 | '@esbuild/win32-ia32': 0.19.12 1874 | '@esbuild/win32-x64': 0.19.12 1875 | dev: false 1876 | 1877 | /escalade@3.1.2: 1878 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 1879 | engines: {node: '>=6'} 1880 | 1881 | /escape-string-regexp@1.0.5: 1882 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1883 | engines: {node: '>=0.8.0'} 1884 | dev: false 1885 | 1886 | /fast-glob@3.3.2: 1887 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1888 | engines: {node: '>=8.6.0'} 1889 | dependencies: 1890 | '@nodelib/fs.stat': 2.0.5 1891 | '@nodelib/fs.walk': 1.2.8 1892 | glob-parent: 5.1.2 1893 | merge2: 1.4.1 1894 | micromatch: 4.0.5 1895 | dev: true 1896 | 1897 | /fastq@1.17.1: 1898 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1899 | dependencies: 1900 | reusify: 1.0.4 1901 | dev: true 1902 | 1903 | /fflate@0.6.10: 1904 | resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} 1905 | 1906 | /file-type@16.5.4: 1907 | resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} 1908 | engines: {node: '>=10'} 1909 | dependencies: 1910 | readable-web-to-node-stream: 3.0.2 1911 | strtok3: 6.3.0 1912 | token-types: 4.2.1 1913 | dev: false 1914 | 1915 | /fill-range@7.0.1: 1916 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1917 | engines: {node: '>=8'} 1918 | dependencies: 1919 | to-regex-range: 5.0.1 1920 | dev: true 1921 | 1922 | /filter-obj@1.1.0: 1923 | resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} 1924 | engines: {node: '>=0.10.0'} 1925 | dev: false 1926 | 1927 | /foreground-child@3.1.1: 1928 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1929 | engines: {node: '>=14'} 1930 | dependencies: 1931 | cross-spawn: 7.0.3 1932 | signal-exit: 4.1.0 1933 | dev: true 1934 | 1935 | /fraction.js@4.3.7: 1936 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1937 | dev: true 1938 | 1939 | /framer-motion@10.9.2(react-dom@18.2.0)(react@18.2.0): 1940 | resolution: {integrity: sha512-qNhnSAO0rd4A2GI93Y5SlljdBQEP6u/y98tX6esz48WxGPhHfePRfEmp9acUHOvxE+e9p3M/RbSDsoGkXTeqRA==} 1941 | peerDependencies: 1942 | react: ^18.0.0 1943 | react-dom: ^18.0.0 1944 | peerDependenciesMeta: 1945 | react: 1946 | optional: true 1947 | react-dom: 1948 | optional: true 1949 | dependencies: 1950 | react: 18.2.0 1951 | react-dom: 18.2.0(react@18.2.0) 1952 | tslib: 2.6.2 1953 | optionalDependencies: 1954 | '@emotion/is-prop-valid': 0.8.8 1955 | dev: false 1956 | 1957 | /fsevents@2.3.3: 1958 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1959 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1960 | os: [darwin] 1961 | requiresBuild: true 1962 | optional: true 1963 | 1964 | /function-bind@1.1.2: 1965 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1966 | 1967 | /gensync@1.0.0-beta.2: 1968 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1969 | engines: {node: '>=6.9.0'} 1970 | dev: false 1971 | 1972 | /get-intrinsic@1.2.4: 1973 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 1974 | engines: {node: '>= 0.4'} 1975 | dependencies: 1976 | es-errors: 1.3.0 1977 | function-bind: 1.1.2 1978 | has-proto: 1.0.3 1979 | has-symbols: 1.0.3 1980 | hasown: 2.0.2 1981 | dev: false 1982 | 1983 | /get-nonce@1.0.1: 1984 | resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} 1985 | engines: {node: '>=6'} 1986 | dev: false 1987 | 1988 | /glob-parent@5.1.2: 1989 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1990 | engines: {node: '>= 6'} 1991 | dependencies: 1992 | is-glob: 4.0.3 1993 | dev: true 1994 | 1995 | /glob-parent@6.0.2: 1996 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1997 | engines: {node: '>=10.13.0'} 1998 | dependencies: 1999 | is-glob: 4.0.3 2000 | dev: true 2001 | 2002 | /glob@10.3.10: 2003 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 2004 | engines: {node: '>=16 || 14 >=14.17'} 2005 | hasBin: true 2006 | dependencies: 2007 | foreground-child: 3.1.1 2008 | jackspeak: 2.3.6 2009 | minimatch: 9.0.3 2010 | minipass: 7.0.4 2011 | path-scurry: 1.10.1 2012 | dev: true 2013 | 2014 | /globals@11.12.0: 2015 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 2016 | engines: {node: '>=4'} 2017 | dev: false 2018 | 2019 | /glsl-noise@0.0.0: 2020 | resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} 2021 | dev: false 2022 | 2023 | /gopd@1.0.1: 2024 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 2025 | dependencies: 2026 | get-intrinsic: 1.2.4 2027 | dev: false 2028 | 2029 | /has-flag@3.0.0: 2030 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 2031 | engines: {node: '>=4'} 2032 | dev: false 2033 | 2034 | /has-property-descriptors@1.0.2: 2035 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 2036 | dependencies: 2037 | es-define-property: 1.0.0 2038 | dev: false 2039 | 2040 | /has-proto@1.0.3: 2041 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 2042 | engines: {node: '>= 0.4'} 2043 | dev: false 2044 | 2045 | /has-symbols@1.0.3: 2046 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 2047 | engines: {node: '>= 0.4'} 2048 | dev: false 2049 | 2050 | /hasown@2.0.2: 2051 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 2052 | engines: {node: '>= 0.4'} 2053 | dependencies: 2054 | function-bind: 1.1.2 2055 | 2056 | /ieee754@1.2.1: 2057 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 2058 | dev: false 2059 | 2060 | /inherits@2.0.4: 2061 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 2062 | dev: false 2063 | 2064 | /invariant@2.2.4: 2065 | resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} 2066 | dependencies: 2067 | loose-envify: 1.4.0 2068 | dev: false 2069 | 2070 | /is-binary-path@2.1.0: 2071 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 2072 | engines: {node: '>=8'} 2073 | dependencies: 2074 | binary-extensions: 2.2.0 2075 | dev: true 2076 | 2077 | /is-core-module@2.13.1: 2078 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 2079 | dependencies: 2080 | hasown: 2.0.2 2081 | dev: true 2082 | 2083 | /is-extglob@2.1.1: 2084 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 2085 | engines: {node: '>=0.10.0'} 2086 | dev: true 2087 | 2088 | /is-fullwidth-code-point@3.0.0: 2089 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 2090 | engines: {node: '>=8'} 2091 | dev: true 2092 | 2093 | /is-glob@4.0.3: 2094 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 2095 | engines: {node: '>=0.10.0'} 2096 | dependencies: 2097 | is-extglob: 2.1.1 2098 | dev: true 2099 | 2100 | /is-number@7.0.0: 2101 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2102 | engines: {node: '>=0.12.0'} 2103 | dev: true 2104 | 2105 | /isexe@2.0.0: 2106 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2107 | dev: true 2108 | 2109 | /its-fine@1.1.1(react@18.2.0): 2110 | resolution: {integrity: sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==} 2111 | peerDependencies: 2112 | react: '>=18.0' 2113 | dependencies: 2114 | '@types/react-reconciler': 0.28.8 2115 | react: 18.2.0 2116 | dev: false 2117 | 2118 | /jackspeak@2.3.6: 2119 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 2120 | engines: {node: '>=14'} 2121 | dependencies: 2122 | '@isaacs/cliui': 8.0.2 2123 | optionalDependencies: 2124 | '@pkgjs/parseargs': 0.11.0 2125 | dev: true 2126 | 2127 | /jiti@1.21.0: 2128 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 2129 | hasBin: true 2130 | dev: true 2131 | 2132 | /js-tokens@4.0.0: 2133 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2134 | dev: false 2135 | 2136 | /jsesc@2.5.2: 2137 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2138 | engines: {node: '>=4'} 2139 | hasBin: true 2140 | dev: false 2141 | 2142 | /json5@2.2.3: 2143 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 2144 | engines: {node: '>=6'} 2145 | hasBin: true 2146 | dev: false 2147 | 2148 | /lil-gui@0.17.0: 2149 | resolution: {integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==} 2150 | dev: true 2151 | 2152 | /lilconfig@2.1.0: 2153 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 2154 | engines: {node: '>=10'} 2155 | dev: true 2156 | 2157 | /lilconfig@3.1.1: 2158 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 2159 | engines: {node: '>=14'} 2160 | dev: true 2161 | 2162 | /lines-and-columns@1.2.4: 2163 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2164 | dev: true 2165 | 2166 | /lodash.clamp@4.0.3: 2167 | resolution: {integrity: sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg==} 2168 | dev: false 2169 | 2170 | /lodash.omit@4.5.0: 2171 | resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} 2172 | dev: false 2173 | 2174 | /lodash.pick@4.4.0: 2175 | resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} 2176 | dev: false 2177 | 2178 | /loose-envify@1.4.0: 2179 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 2180 | hasBin: true 2181 | dependencies: 2182 | js-tokens: 4.0.0 2183 | dev: false 2184 | 2185 | /lru-cache@10.2.0: 2186 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 2187 | engines: {node: 14 || >=16.14} 2188 | dev: true 2189 | 2190 | /lru-cache@5.1.1: 2191 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2192 | dependencies: 2193 | yallist: 3.1.1 2194 | dev: false 2195 | 2196 | /media-typer@1.1.0: 2197 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 2198 | engines: {node: '>= 0.8'} 2199 | dev: false 2200 | 2201 | /merge2@1.4.1: 2202 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2203 | engines: {node: '>= 8'} 2204 | dev: true 2205 | 2206 | /meshline@3.2.0(three@0.150.0): 2207 | resolution: {integrity: sha512-ZaJkC967GTuef7UBdO0rGPX544oIWaNo7tYedVHSoR2lje6RR16fX8IsgMxgxoYYERtjqsRWIYBSPBxG4QR84Q==} 2208 | peerDependencies: 2209 | three: '>=0.137' 2210 | dependencies: 2211 | three: 0.150.0 2212 | dev: false 2213 | 2214 | /micromatch@4.0.5: 2215 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2216 | engines: {node: '>=8.6'} 2217 | dependencies: 2218 | braces: 3.0.2 2219 | picomatch: 2.3.1 2220 | dev: true 2221 | 2222 | /minimatch@9.0.3: 2223 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 2224 | engines: {node: '>=16 || 14 >=14.17'} 2225 | dependencies: 2226 | brace-expansion: 2.0.1 2227 | dev: true 2228 | 2229 | /minipass@7.0.4: 2230 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 2231 | engines: {node: '>=16 || 14 >=14.17'} 2232 | dev: true 2233 | 2234 | /ms@2.1.2: 2235 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2236 | dev: false 2237 | 2238 | /music-metadata@7.14.0: 2239 | resolution: {integrity: sha512-xrm3w7SV0Wk+OythZcSbaI8mcr/KHd0knJieu8bVpaPfMv/Agz5EooCAPz3OR5hbYMiUG6dgAPKZKnMzV+3amA==} 2240 | engines: {node: '>=10'} 2241 | dependencies: 2242 | '@tokenizer/token': 0.3.0 2243 | content-type: 1.0.5 2244 | debug: 4.3.4 2245 | file-type: 16.5.4 2246 | media-typer: 1.1.0 2247 | strtok3: 6.3.0 2248 | token-types: 4.2.1 2249 | transitivePeerDependencies: 2250 | - supports-color 2251 | dev: false 2252 | 2253 | /mz@2.7.0: 2254 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 2255 | dependencies: 2256 | any-promise: 1.3.0 2257 | object-assign: 4.1.1 2258 | thenify-all: 1.6.0 2259 | dev: true 2260 | 2261 | /nanoid@3.3.7: 2262 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 2263 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2264 | hasBin: true 2265 | 2266 | /node-releases@2.0.14: 2267 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 2268 | 2269 | /normalize-path@3.0.0: 2270 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2271 | engines: {node: '>=0.10.0'} 2272 | dev: true 2273 | 2274 | /normalize-range@0.1.2: 2275 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 2276 | engines: {node: '>=0.10.0'} 2277 | dev: true 2278 | 2279 | /object-assign@4.1.1: 2280 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 2281 | engines: {node: '>=0.10.0'} 2282 | 2283 | /object-hash@3.0.0: 2284 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 2285 | engines: {node: '>= 6'} 2286 | dev: true 2287 | 2288 | /object-inspect@1.13.1: 2289 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 2290 | dev: false 2291 | 2292 | /path-key@3.1.1: 2293 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2294 | engines: {node: '>=8'} 2295 | dev: true 2296 | 2297 | /path-parse@1.0.7: 2298 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2299 | dev: true 2300 | 2301 | /path-scurry@1.10.1: 2302 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 2303 | engines: {node: '>=16 || 14 >=14.17'} 2304 | dependencies: 2305 | lru-cache: 10.2.0 2306 | minipass: 7.0.4 2307 | dev: true 2308 | 2309 | /peek-readable@4.1.0: 2310 | resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} 2311 | engines: {node: '>=8'} 2312 | dev: false 2313 | 2314 | /picocolors@1.0.0: 2315 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2316 | 2317 | /picomatch@2.3.1: 2318 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2319 | engines: {node: '>=8.6'} 2320 | dev: true 2321 | 2322 | /pify@2.3.0: 2323 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2324 | engines: {node: '>=0.10.0'} 2325 | dev: true 2326 | 2327 | /pirates@4.0.6: 2328 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2329 | engines: {node: '>= 6'} 2330 | dev: true 2331 | 2332 | /postcss-import@15.1.0(postcss@8.4.35): 2333 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 2334 | engines: {node: '>=14.0.0'} 2335 | peerDependencies: 2336 | postcss: ^8.0.0 2337 | dependencies: 2338 | postcss: 8.4.35 2339 | postcss-value-parser: 4.2.0 2340 | read-cache: 1.0.0 2341 | resolve: 1.22.8 2342 | dev: true 2343 | 2344 | /postcss-js@4.0.1(postcss@8.4.35): 2345 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 2346 | engines: {node: ^12 || ^14 || >= 16} 2347 | peerDependencies: 2348 | postcss: ^8.4.21 2349 | dependencies: 2350 | camelcase-css: 2.0.1 2351 | postcss: 8.4.35 2352 | dev: true 2353 | 2354 | /postcss-load-config@4.0.2(postcss@8.4.35): 2355 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 2356 | engines: {node: '>= 14'} 2357 | peerDependencies: 2358 | postcss: '>=8.0.9' 2359 | ts-node: '>=9.0.0' 2360 | peerDependenciesMeta: 2361 | postcss: 2362 | optional: true 2363 | ts-node: 2364 | optional: true 2365 | dependencies: 2366 | lilconfig: 3.1.1 2367 | postcss: 8.4.35 2368 | yaml: 2.4.1 2369 | dev: true 2370 | 2371 | /postcss-nested@6.0.1(postcss@8.4.35): 2372 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 2373 | engines: {node: '>=12.0'} 2374 | peerDependencies: 2375 | postcss: ^8.2.14 2376 | dependencies: 2377 | postcss: 8.4.35 2378 | postcss-selector-parser: 6.0.15 2379 | dev: true 2380 | 2381 | /postcss-selector-parser@6.0.15: 2382 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 2383 | engines: {node: '>=4'} 2384 | dependencies: 2385 | cssesc: 3.0.0 2386 | util-deprecate: 1.0.2 2387 | dev: true 2388 | 2389 | /postcss-value-parser@4.2.0: 2390 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2391 | dev: true 2392 | 2393 | /postcss@8.4.35: 2394 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} 2395 | engines: {node: ^10 || ^12 || >=14} 2396 | dependencies: 2397 | nanoid: 3.3.7 2398 | picocolors: 1.0.0 2399 | source-map-js: 1.0.2 2400 | 2401 | /potpack@1.0.2: 2402 | resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} 2403 | dev: false 2404 | 2405 | /prop-types@15.8.1: 2406 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 2407 | dependencies: 2408 | loose-envify: 1.4.0 2409 | object-assign: 4.1.1 2410 | react-is: 16.13.1 2411 | dev: false 2412 | 2413 | /qs@6.12.0: 2414 | resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} 2415 | engines: {node: '>=0.6'} 2416 | dependencies: 2417 | side-channel: 1.0.6 2418 | dev: false 2419 | 2420 | /query-string@7.1.3: 2421 | resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} 2422 | engines: {node: '>=6'} 2423 | dependencies: 2424 | decode-uri-component: 0.2.2 2425 | filter-obj: 1.1.0 2426 | split-on-first: 1.1.0 2427 | strict-uri-encode: 2.0.0 2428 | dev: false 2429 | 2430 | /queue-microtask@1.2.3: 2431 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2432 | dev: true 2433 | 2434 | /react-composer@5.0.3(react@18.2.0): 2435 | resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==} 2436 | peerDependencies: 2437 | react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 2438 | dependencies: 2439 | prop-types: 15.8.1 2440 | react: 18.2.0 2441 | dev: false 2442 | 2443 | /react-dom@18.2.0(react@18.2.0): 2444 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 2445 | peerDependencies: 2446 | react: ^18.2.0 2447 | dependencies: 2448 | loose-envify: 1.4.0 2449 | react: 18.2.0 2450 | scheduler: 0.23.0 2451 | dev: false 2452 | 2453 | /react-feather@2.0.10(react@18.2.0): 2454 | resolution: {integrity: sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ==} 2455 | peerDependencies: 2456 | react: '>=16.8.6' 2457 | dependencies: 2458 | prop-types: 15.8.1 2459 | react: 18.2.0 2460 | dev: false 2461 | 2462 | /react-intersection-observer@9.8.1(react-dom@18.2.0)(react@18.2.0): 2463 | resolution: {integrity: sha512-QzOFdROX8D8MH3wE3OVKH0f3mLjKTtEN1VX/rkNuECCff+aKky0pIjulDhr3Ewqj5el/L+MhBkM3ef0Tbt+qUQ==} 2464 | peerDependencies: 2465 | react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 2466 | react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 2467 | peerDependenciesMeta: 2468 | react-dom: 2469 | optional: true 2470 | dependencies: 2471 | react: 18.2.0 2472 | react-dom: 18.2.0(react@18.2.0) 2473 | dev: false 2474 | 2475 | /react-is@16.13.1: 2476 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 2477 | dev: false 2478 | 2479 | /react-merge-refs@1.1.0: 2480 | resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} 2481 | dev: false 2482 | 2483 | /react-reconciler@0.27.0(react@18.2.0): 2484 | resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} 2485 | engines: {node: '>=0.10.0'} 2486 | peerDependencies: 2487 | react: ^18.0.0 2488 | dependencies: 2489 | loose-envify: 1.4.0 2490 | react: 18.2.0 2491 | scheduler: 0.21.0 2492 | dev: false 2493 | 2494 | /react-refresh@0.14.0: 2495 | resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} 2496 | engines: {node: '>=0.10.0'} 2497 | dev: false 2498 | 2499 | /react-remove-scroll-bar@2.3.5(@types/react@18.2.64)(react@18.2.0): 2500 | resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==} 2501 | engines: {node: '>=10'} 2502 | peerDependencies: 2503 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2504 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2505 | peerDependenciesMeta: 2506 | '@types/react': 2507 | optional: true 2508 | dependencies: 2509 | '@types/react': 18.2.64 2510 | react: 18.2.0 2511 | react-style-singleton: 2.2.1(@types/react@18.2.64)(react@18.2.0) 2512 | tslib: 2.6.2 2513 | dev: false 2514 | 2515 | /react-remove-scroll@2.5.5(@types/react@18.2.64)(react@18.2.0): 2516 | resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} 2517 | engines: {node: '>=10'} 2518 | peerDependencies: 2519 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2520 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2521 | peerDependenciesMeta: 2522 | '@types/react': 2523 | optional: true 2524 | dependencies: 2525 | '@types/react': 18.2.64 2526 | react: 18.2.0 2527 | react-remove-scroll-bar: 2.3.5(@types/react@18.2.64)(react@18.2.0) 2528 | react-style-singleton: 2.2.1(@types/react@18.2.64)(react@18.2.0) 2529 | tslib: 2.6.2 2530 | use-callback-ref: 1.3.1(@types/react@18.2.64)(react@18.2.0) 2531 | use-sidecar: 1.1.2(@types/react@18.2.64)(react@18.2.0) 2532 | dev: false 2533 | 2534 | /react-slider@2.0.6(react@18.2.0): 2535 | resolution: {integrity: sha512-gJxG1HwmuMTJ+oWIRCmVWvgwotNCbByTwRkFZC6U4MBsHqJBmxwbYRJUmxy4Tke1ef8r9jfXjgkmY/uHOCEvbA==} 2536 | peerDependencies: 2537 | react: ^16 || ^17 || ^18 2538 | dependencies: 2539 | prop-types: 15.8.1 2540 | react: 18.2.0 2541 | dev: false 2542 | 2543 | /react-style-singleton@2.2.1(@types/react@18.2.64)(react@18.2.0): 2544 | resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} 2545 | engines: {node: '>=10'} 2546 | peerDependencies: 2547 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2548 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2549 | peerDependenciesMeta: 2550 | '@types/react': 2551 | optional: true 2552 | dependencies: 2553 | '@types/react': 18.2.64 2554 | get-nonce: 1.0.1 2555 | invariant: 2.2.4 2556 | react: 18.2.0 2557 | tslib: 2.6.2 2558 | dev: false 2559 | 2560 | /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0): 2561 | resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} 2562 | peerDependencies: 2563 | react: '>=16.13' 2564 | react-dom: '>=16.13' 2565 | dependencies: 2566 | debounce: 1.2.1 2567 | react: 18.2.0 2568 | react-dom: 18.2.0(react@18.2.0) 2569 | dev: false 2570 | 2571 | /react@18.2.0: 2572 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 2573 | engines: {node: '>=0.10.0'} 2574 | dependencies: 2575 | loose-envify: 1.4.0 2576 | dev: false 2577 | 2578 | /read-cache@1.0.0: 2579 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2580 | dependencies: 2581 | pify: 2.3.0 2582 | dev: true 2583 | 2584 | /readable-stream@3.6.2: 2585 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 2586 | engines: {node: '>= 6'} 2587 | dependencies: 2588 | inherits: 2.0.4 2589 | string_decoder: 1.3.0 2590 | util-deprecate: 1.0.2 2591 | dev: false 2592 | 2593 | /readable-web-to-node-stream@3.0.2: 2594 | resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} 2595 | engines: {node: '>=8'} 2596 | dependencies: 2597 | readable-stream: 3.6.2 2598 | dev: false 2599 | 2600 | /readdirp@3.6.0: 2601 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2602 | engines: {node: '>=8.10.0'} 2603 | dependencies: 2604 | picomatch: 2.3.1 2605 | dev: true 2606 | 2607 | /regenerator-runtime@0.14.1: 2608 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 2609 | dev: false 2610 | 2611 | /require-from-string@2.0.2: 2612 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 2613 | engines: {node: '>=0.10.0'} 2614 | dev: false 2615 | 2616 | /resolve@1.22.8: 2617 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2618 | hasBin: true 2619 | dependencies: 2620 | is-core-module: 2.13.1 2621 | path-parse: 1.0.7 2622 | supports-preserve-symlinks-flag: 1.0.0 2623 | dev: true 2624 | 2625 | /reusify@1.0.4: 2626 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2627 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2628 | dev: true 2629 | 2630 | /rollup@4.13.0: 2631 | resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} 2632 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2633 | hasBin: true 2634 | dependencies: 2635 | '@types/estree': 1.0.5 2636 | optionalDependencies: 2637 | '@rollup/rollup-android-arm-eabi': 4.13.0 2638 | '@rollup/rollup-android-arm64': 4.13.0 2639 | '@rollup/rollup-darwin-arm64': 4.13.0 2640 | '@rollup/rollup-darwin-x64': 4.13.0 2641 | '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 2642 | '@rollup/rollup-linux-arm64-gnu': 4.13.0 2643 | '@rollup/rollup-linux-arm64-musl': 4.13.0 2644 | '@rollup/rollup-linux-riscv64-gnu': 4.13.0 2645 | '@rollup/rollup-linux-x64-gnu': 4.13.0 2646 | '@rollup/rollup-linux-x64-musl': 4.13.0 2647 | '@rollup/rollup-win32-arm64-msvc': 4.13.0 2648 | '@rollup/rollup-win32-ia32-msvc': 4.13.0 2649 | '@rollup/rollup-win32-x64-msvc': 4.13.0 2650 | fsevents: 2.3.3 2651 | dev: false 2652 | 2653 | /run-parallel@1.2.0: 2654 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2655 | dependencies: 2656 | queue-microtask: 1.2.3 2657 | dev: true 2658 | 2659 | /safe-buffer@5.2.1: 2660 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2661 | dev: false 2662 | 2663 | /scheduler@0.21.0: 2664 | resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} 2665 | dependencies: 2666 | loose-envify: 1.4.0 2667 | dev: false 2668 | 2669 | /scheduler@0.23.0: 2670 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 2671 | dependencies: 2672 | loose-envify: 1.4.0 2673 | dev: false 2674 | 2675 | /scroll-into-view-if-needed@3.1.0: 2676 | resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} 2677 | dependencies: 2678 | compute-scroll-into-view: 3.1.0 2679 | dev: false 2680 | 2681 | /semver@6.3.1: 2682 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2683 | hasBin: true 2684 | dev: false 2685 | 2686 | /set-function-length@1.2.2: 2687 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 2688 | engines: {node: '>= 0.4'} 2689 | dependencies: 2690 | define-data-property: 1.1.4 2691 | es-errors: 1.3.0 2692 | function-bind: 1.1.2 2693 | get-intrinsic: 1.2.4 2694 | gopd: 1.0.1 2695 | has-property-descriptors: 1.0.2 2696 | dev: false 2697 | 2698 | /shadergradient@1.2.5(@babel/runtime@7.24.0)(@react-spring/three@9.7.3)(@react-three/drei@9.47.1)(@react-three/fiber@8.15.19)(@types/react@18.2.64)(framer-motion@10.9.2)(react-dom@18.2.0)(react@18.2.0)(three-stdlib@2.29.5)(three@0.150.0): 2699 | resolution: {integrity: sha512-sqdlIsix3J8ig4w7HguUibtblziL8lwq3SkXd6pS5wSS5fQdwHXnjhMiJ2PbJj5cJWEY+hHP3GahKy7bU8affg==} 2700 | peerDependencies: 2701 | '@react-spring/three': '*' 2702 | '@react-three/drei': '*' 2703 | '@react-three/fiber': '*' 2704 | framer-motion: '*' 2705 | react: '*' 2706 | three: 0.150.0 2707 | three-stdlib: '*' 2708 | dependencies: 2709 | '@react-spring/three': 9.7.3(@react-three/fiber@8.15.19)(react@18.2.0)(three@0.150.0) 2710 | '@react-three/drei': 9.47.1(@react-three/fiber@8.15.19)(react-dom@18.2.0)(react@18.2.0)(three@0.150.0) 2711 | '@react-three/fiber': 8.15.19(react-dom@18.2.0)(react@18.2.0)(three@0.150.0) 2712 | '@supabase/supabase-js': 2.39.7 2713 | '@uiw/color-convert': 1.4.3(@babel/runtime@7.24.0) 2714 | '@uiw/react-color-shade-slider': 1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0) 2715 | '@uiw/react-color-wheel': 1.4.3(@babel/runtime@7.24.0)(react-dom@18.2.0)(react@18.2.0) 2716 | camera-controls: 1.38.2(three@0.150.0) 2717 | framer-motion: 10.9.2(react-dom@18.2.0)(react@18.2.0) 2718 | query-string: 7.1.3 2719 | react: 18.2.0 2720 | react-feather: 2.0.10(react@18.2.0) 2721 | react-intersection-observer: 9.8.1(react-dom@18.2.0)(react@18.2.0) 2722 | react-merge-refs: 1.1.0 2723 | react-slider: 2.0.6(react@18.2.0) 2724 | scroll-into-view-if-needed: 3.1.0 2725 | stripe: 11.18.0 2726 | three: 0.150.0 2727 | three-stdlib: 2.29.5(three@0.150.0) 2728 | zustand: 4.5.2(@types/react@18.2.64)(react@18.2.0) 2729 | transitivePeerDependencies: 2730 | - '@babel/runtime' 2731 | - '@types/react' 2732 | - bufferutil 2733 | - immer 2734 | - react-dom 2735 | - utf-8-validate 2736 | dev: false 2737 | 2738 | /shebang-command@2.0.0: 2739 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2740 | engines: {node: '>=8'} 2741 | dependencies: 2742 | shebang-regex: 3.0.0 2743 | dev: true 2744 | 2745 | /shebang-regex@3.0.0: 2746 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2747 | engines: {node: '>=8'} 2748 | dev: true 2749 | 2750 | /side-channel@1.0.6: 2751 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 2752 | engines: {node: '>= 0.4'} 2753 | dependencies: 2754 | call-bind: 1.0.7 2755 | es-errors: 1.3.0 2756 | get-intrinsic: 1.2.4 2757 | object-inspect: 1.13.1 2758 | dev: false 2759 | 2760 | /signal-exit@4.1.0: 2761 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2762 | engines: {node: '>=14'} 2763 | dev: true 2764 | 2765 | /source-map-js@1.0.2: 2766 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2767 | engines: {node: '>=0.10.0'} 2768 | 2769 | /split-on-first@1.1.0: 2770 | resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} 2771 | engines: {node: '>=6'} 2772 | dev: false 2773 | 2774 | /stats.js@0.17.0: 2775 | resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} 2776 | dev: false 2777 | 2778 | /strict-uri-encode@2.0.0: 2779 | resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} 2780 | engines: {node: '>=4'} 2781 | dev: false 2782 | 2783 | /string-width@4.2.3: 2784 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2785 | engines: {node: '>=8'} 2786 | dependencies: 2787 | emoji-regex: 8.0.0 2788 | is-fullwidth-code-point: 3.0.0 2789 | strip-ansi: 6.0.1 2790 | dev: true 2791 | 2792 | /string-width@5.1.2: 2793 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2794 | engines: {node: '>=12'} 2795 | dependencies: 2796 | eastasianwidth: 0.2.0 2797 | emoji-regex: 9.2.2 2798 | strip-ansi: 7.1.0 2799 | dev: true 2800 | 2801 | /string_decoder@1.3.0: 2802 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2803 | dependencies: 2804 | safe-buffer: 5.2.1 2805 | dev: false 2806 | 2807 | /strip-ansi@6.0.1: 2808 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2809 | engines: {node: '>=8'} 2810 | dependencies: 2811 | ansi-regex: 5.0.1 2812 | dev: true 2813 | 2814 | /strip-ansi@7.1.0: 2815 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2816 | engines: {node: '>=12'} 2817 | dependencies: 2818 | ansi-regex: 6.0.1 2819 | dev: true 2820 | 2821 | /stripe@11.18.0: 2822 | resolution: {integrity: sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw==} 2823 | engines: {node: '>=12.*'} 2824 | dependencies: 2825 | '@types/node': 20.11.25 2826 | qs: 6.12.0 2827 | dev: false 2828 | 2829 | /strtok3@6.3.0: 2830 | resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} 2831 | engines: {node: '>=10'} 2832 | dependencies: 2833 | '@tokenizer/token': 0.3.0 2834 | peek-readable: 4.1.0 2835 | dev: false 2836 | 2837 | /sucrase@3.35.0: 2838 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 2839 | engines: {node: '>=16 || 14 >=14.17'} 2840 | hasBin: true 2841 | dependencies: 2842 | '@jridgewell/gen-mapping': 0.3.5 2843 | commander: 4.1.1 2844 | glob: 10.3.10 2845 | lines-and-columns: 1.2.4 2846 | mz: 2.7.0 2847 | pirates: 4.0.6 2848 | ts-interface-checker: 0.1.13 2849 | dev: true 2850 | 2851 | /supports-color@5.5.0: 2852 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2853 | engines: {node: '>=4'} 2854 | dependencies: 2855 | has-flag: 3.0.0 2856 | dev: false 2857 | 2858 | /supports-preserve-symlinks-flag@1.0.0: 2859 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2860 | engines: {node: '>= 0.4'} 2861 | dev: true 2862 | 2863 | /suspend-react@0.0.8(react@18.2.0): 2864 | resolution: {integrity: sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==} 2865 | peerDependencies: 2866 | react: '>=17.0' 2867 | dependencies: 2868 | react: 18.2.0 2869 | dev: false 2870 | 2871 | /suspend-react@0.1.3(react@18.2.0): 2872 | resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} 2873 | peerDependencies: 2874 | react: '>=17.0' 2875 | dependencies: 2876 | react: 18.2.0 2877 | dev: false 2878 | 2879 | /tailwind-merge@2.2.1: 2880 | resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} 2881 | dependencies: 2882 | '@babel/runtime': 7.24.0 2883 | dev: false 2884 | 2885 | /tailwindcss@3.4.1: 2886 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 2887 | engines: {node: '>=14.0.0'} 2888 | hasBin: true 2889 | dependencies: 2890 | '@alloc/quick-lru': 5.2.0 2891 | arg: 5.0.2 2892 | chokidar: 3.6.0 2893 | didyoumean: 1.2.2 2894 | dlv: 1.1.3 2895 | fast-glob: 3.3.2 2896 | glob-parent: 6.0.2 2897 | is-glob: 4.0.3 2898 | jiti: 1.21.0 2899 | lilconfig: 2.1.0 2900 | micromatch: 4.0.5 2901 | normalize-path: 3.0.0 2902 | object-hash: 3.0.0 2903 | picocolors: 1.0.0 2904 | postcss: 8.4.35 2905 | postcss-import: 15.1.0(postcss@8.4.35) 2906 | postcss-js: 4.0.1(postcss@8.4.35) 2907 | postcss-load-config: 4.0.2(postcss@8.4.35) 2908 | postcss-nested: 6.0.1(postcss@8.4.35) 2909 | postcss-selector-parser: 6.0.15 2910 | resolve: 1.22.8 2911 | sucrase: 3.35.0 2912 | transitivePeerDependencies: 2913 | - ts-node 2914 | dev: true 2915 | 2916 | /thenify-all@1.6.0: 2917 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2918 | engines: {node: '>=0.8'} 2919 | dependencies: 2920 | thenify: 3.3.1 2921 | dev: true 2922 | 2923 | /thenify@3.3.1: 2924 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2925 | dependencies: 2926 | any-promise: 1.3.0 2927 | dev: true 2928 | 2929 | /three-mesh-bvh@0.5.24(three@0.150.0): 2930 | resolution: {integrity: sha512-VTIgfjz8aFoPKTQoMIQQv9jJD4ybFRZuKKE1/kqy78FQcuHQ0+iIWv7C5cSb2inlvs7bNMVY3yRx3RXGZfrvzQ==} 2931 | peerDependencies: 2932 | three: '>= 0.123.0' 2933 | dependencies: 2934 | three: 0.150.0 2935 | dev: false 2936 | 2937 | /three-stdlib@2.29.5(three@0.150.0): 2938 | resolution: {integrity: sha512-p9IQsH7gT9wVqAuMsimX2JTtEoCGHlwgm3HsAeXwWqP/PWV9DjYldbggLCr0B1TMzofi/58GG1X5KTQnG6ijpw==} 2939 | peerDependencies: 2940 | three: '>=0.128.0' 2941 | dependencies: 2942 | '@types/draco3d': 1.4.9 2943 | '@types/offscreencanvas': 2019.7.3 2944 | '@types/webxr': 0.5.14 2945 | draco3d: 1.5.7 2946 | fflate: 0.6.10 2947 | potpack: 1.0.2 2948 | three: 0.150.0 2949 | dev: false 2950 | 2951 | /three@0.150.0: 2952 | resolution: {integrity: sha512-12oqqBZom9fb5HtX3rD8qPVnamojuiN5Os7r0x8s3HQ+WHRwnEyzl2XU3aEKocsDkG++rkE9+HWzx77O59NXtw==} 2953 | dev: false 2954 | 2955 | /to-fast-properties@2.0.0: 2956 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2957 | engines: {node: '>=4'} 2958 | dev: false 2959 | 2960 | /to-regex-range@5.0.1: 2961 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2962 | engines: {node: '>=8.0'} 2963 | dependencies: 2964 | is-number: 7.0.0 2965 | dev: true 2966 | 2967 | /token-types@4.2.1: 2968 | resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} 2969 | engines: {node: '>=10'} 2970 | dependencies: 2971 | '@tokenizer/token': 0.3.0 2972 | ieee754: 1.2.1 2973 | dev: false 2974 | 2975 | /tr46@0.0.3: 2976 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 2977 | dev: false 2978 | 2979 | /troika-three-text@0.47.2(three@0.150.0): 2980 | resolution: {integrity: sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==} 2981 | peerDependencies: 2982 | three: '>=0.125.0' 2983 | dependencies: 2984 | bidi-js: 1.0.3 2985 | three: 0.150.0 2986 | troika-three-utils: 0.47.2(three@0.150.0) 2987 | troika-worker-utils: 0.47.2 2988 | webgl-sdf-generator: 1.1.1 2989 | dev: false 2990 | 2991 | /troika-three-utils@0.47.2(three@0.150.0): 2992 | resolution: {integrity: sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==} 2993 | peerDependencies: 2994 | three: '>=0.125.0' 2995 | dependencies: 2996 | three: 0.150.0 2997 | dev: false 2998 | 2999 | /troika-worker-utils@0.47.2: 3000 | resolution: {integrity: sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==} 3001 | dev: false 3002 | 3003 | /ts-interface-checker@0.1.13: 3004 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 3005 | dev: true 3006 | 3007 | /tslib@2.6.2: 3008 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 3009 | dev: false 3010 | 3011 | /typescript@5.4.2: 3012 | resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} 3013 | engines: {node: '>=14.17'} 3014 | hasBin: true 3015 | dev: true 3016 | 3017 | /undici-types@5.26.5: 3018 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 3019 | 3020 | /update-browserslist-db@1.0.13(browserslist@4.23.0): 3021 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 3022 | hasBin: true 3023 | peerDependencies: 3024 | browserslist: '>= 4.21.0' 3025 | dependencies: 3026 | browserslist: 4.23.0 3027 | escalade: 3.1.2 3028 | picocolors: 1.0.0 3029 | 3030 | /use-callback-ref@1.3.1(@types/react@18.2.64)(react@18.2.0): 3031 | resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} 3032 | engines: {node: '>=10'} 3033 | peerDependencies: 3034 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 3035 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 3036 | peerDependenciesMeta: 3037 | '@types/react': 3038 | optional: true 3039 | dependencies: 3040 | '@types/react': 18.2.64 3041 | react: 18.2.0 3042 | tslib: 2.6.2 3043 | dev: false 3044 | 3045 | /use-sidecar@1.1.2(@types/react@18.2.64)(react@18.2.0): 3046 | resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} 3047 | engines: {node: '>=10'} 3048 | peerDependencies: 3049 | '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 3050 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 3051 | peerDependenciesMeta: 3052 | '@types/react': 3053 | optional: true 3054 | dependencies: 3055 | '@types/react': 18.2.64 3056 | detect-node-es: 1.1.0 3057 | react: 18.2.0 3058 | tslib: 2.6.2 3059 | dev: false 3060 | 3061 | /use-sync-external-store@1.2.0(react@18.2.0): 3062 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 3063 | peerDependencies: 3064 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 3065 | dependencies: 3066 | react: 18.2.0 3067 | dev: false 3068 | 3069 | /util-deprecate@1.0.2: 3070 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 3071 | 3072 | /utility-types@3.11.0: 3073 | resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} 3074 | engines: {node: '>= 4'} 3075 | dev: false 3076 | 3077 | /vite@5.1.6(@types/node@20.11.25): 3078 | resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} 3079 | engines: {node: ^18.0.0 || >=20.0.0} 3080 | hasBin: true 3081 | peerDependencies: 3082 | '@types/node': ^18.0.0 || >=20.0.0 3083 | less: '*' 3084 | lightningcss: ^1.21.0 3085 | sass: '*' 3086 | stylus: '*' 3087 | sugarss: '*' 3088 | terser: ^5.4.0 3089 | peerDependenciesMeta: 3090 | '@types/node': 3091 | optional: true 3092 | less: 3093 | optional: true 3094 | lightningcss: 3095 | optional: true 3096 | sass: 3097 | optional: true 3098 | stylus: 3099 | optional: true 3100 | sugarss: 3101 | optional: true 3102 | terser: 3103 | optional: true 3104 | dependencies: 3105 | '@types/node': 20.11.25 3106 | esbuild: 0.19.12 3107 | postcss: 8.4.35 3108 | rollup: 4.13.0 3109 | optionalDependencies: 3110 | fsevents: 2.3.3 3111 | dev: false 3112 | 3113 | /webgl-constants@1.1.1: 3114 | resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} 3115 | dev: false 3116 | 3117 | /webgl-sdf-generator@1.1.1: 3118 | resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} 3119 | dev: false 3120 | 3121 | /webidl-conversions@3.0.1: 3122 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 3123 | dev: false 3124 | 3125 | /whatwg-url@5.0.0: 3126 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 3127 | dependencies: 3128 | tr46: 0.0.3 3129 | webidl-conversions: 3.0.1 3130 | dev: false 3131 | 3132 | /which@2.0.2: 3133 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3134 | engines: {node: '>= 8'} 3135 | hasBin: true 3136 | dependencies: 3137 | isexe: 2.0.0 3138 | dev: true 3139 | 3140 | /wrap-ansi@7.0.0: 3141 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 3142 | engines: {node: '>=10'} 3143 | dependencies: 3144 | ansi-styles: 4.3.0 3145 | string-width: 4.2.3 3146 | strip-ansi: 6.0.1 3147 | dev: true 3148 | 3149 | /wrap-ansi@8.1.0: 3150 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 3151 | engines: {node: '>=12'} 3152 | dependencies: 3153 | ansi-styles: 6.2.1 3154 | string-width: 5.1.2 3155 | strip-ansi: 7.1.0 3156 | dev: true 3157 | 3158 | /ws@8.16.0: 3159 | resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} 3160 | engines: {node: '>=10.0.0'} 3161 | peerDependencies: 3162 | bufferutil: ^4.0.1 3163 | utf-8-validate: '>=5.0.2' 3164 | peerDependenciesMeta: 3165 | bufferutil: 3166 | optional: true 3167 | utf-8-validate: 3168 | optional: true 3169 | dev: false 3170 | 3171 | /yallist@3.1.1: 3172 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 3173 | dev: false 3174 | 3175 | /yaml@2.4.1: 3176 | resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} 3177 | engines: {node: '>= 14'} 3178 | hasBin: true 3179 | dev: true 3180 | 3181 | /zustand@3.7.2(react@18.2.0): 3182 | resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} 3183 | engines: {node: '>=12.7.0'} 3184 | peerDependencies: 3185 | react: '>=16.8' 3186 | peerDependenciesMeta: 3187 | react: 3188 | optional: true 3189 | dependencies: 3190 | react: 18.2.0 3191 | dev: false 3192 | 3193 | /zustand@4.5.2(@types/react@18.2.64)(react@18.2.0): 3194 | resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} 3195 | engines: {node: '>=12.7.0'} 3196 | peerDependencies: 3197 | '@types/react': '>=16.8' 3198 | immer: '>=9.0.6' 3199 | react: '>=16.8' 3200 | peerDependenciesMeta: 3201 | '@types/react': 3202 | optional: true 3203 | immer: 3204 | optional: true 3205 | react: 3206 | optional: true 3207 | dependencies: 3208 | '@types/react': 18.2.64 3209 | react: 18.2.0 3210 | use-sync-external-store: 1.2.0(react@18.2.0) 3211 | dev: false 3212 | 3213 | settings: 3214 | autoInstallPeers: true 3215 | excludeLinksFromLockfile: false 3216 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/cold-brew-ra-main-version-29719-02-38.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/cold-brew-ra-main-version-29719-02-38.mp3 -------------------------------------------------------------------------------- /public/cold-brew-ra-main-version-29719-02-38.mp3-info.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/cold-brew-ra-main-version-29719-02-38.mp3-info.jpeg -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/favicon.ico -------------------------------------------------------------------------------- /public/moonshine-prigida-main-version-01-36-17027.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/moonshine-prigida-main-version-01-36-17027.mp3 -------------------------------------------------------------------------------- /public/moonshine-prigida-main-version-01-36-17027.mp3-info.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/moonshine-prigida-main-version-01-36-17027.mp3-info.jpeg -------------------------------------------------------------------------------- /public/night-in-kyoto-avbe-main-version-21302-01-57.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/night-in-kyoto-avbe-main-version-21302-01-57.mp3 -------------------------------------------------------------------------------- /public/night-in-kyoto-avbe-main-version-21302-01-57.mp3-info.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/night-in-kyoto-avbe-main-version-21302-01-57.mp3-info.jpeg -------------------------------------------------------------------------------- /public/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuma-nama/fuma-lofi/1e874fa9fd2d20456ec3a5f72309da8403e01c24/public/preview.png -------------------------------------------------------------------------------- /src/app.tsx: -------------------------------------------------------------------------------- 1 | import MusicPlayer from "@/components/player"; 2 | 3 | export default function App() { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /src/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | body { 6 | font-family: 'Inter Variable', sans-serif; 7 | } -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./app"; 4 | import "./globals.css"; 5 | import "@fontsource-variable/inter"; 6 | 7 | ReactDOM.createRoot(document.getElementById("root")!).render( 8 | 9 | 10 | , 11 | ); 12 | -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | content: [ 5 | "./index.html", 6 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./src/**/*.{js,ts,jsx,tsx,mdx}", 8 | ], 9 | theme: { 10 | extend: { 11 | keyframes: { 12 | "fade-in": { 13 | from: { 14 | opacity: "0", 15 | }, 16 | to: { 17 | opacity: "1", 18 | }, 19 | }, 20 | "fade-out": { 21 | from: { 22 | opacity: "1", 23 | }, 24 | to: { 25 | opacity: "0", 26 | }, 27 | }, 28 | "popover-in": { 29 | from: { 30 | transform: "translateY(20px)", 31 | opacity: "0", 32 | }, 33 | to: { 34 | transform: "translateY(0px)", 35 | opacity: "1", 36 | }, 37 | }, 38 | "popover-out": { 39 | from: { 40 | transform: "translateY(0px)", 41 | opacity: "1", 42 | }, 43 | to: { 44 | transform: "translateY(20px)", 45 | opacity: "0", 46 | }, 47 | }, 48 | "dialog-in": { 49 | from: { 50 | transform: "translate(-50%, -40%)", 51 | opacity: "0", 52 | }, 53 | to: { 54 | transform: "translate(-50%, -50%)", 55 | opacity: "1", 56 | }, 57 | }, 58 | "dialog-out": { 59 | from: { 60 | transform: "translate(-50%, -50%)", 61 | opacity: "1", 62 | }, 63 | to: { 64 | transform: "translate(-50%, -40%)", 65 | opacity: "0", 66 | }, 67 | }, 68 | }, 69 | animation: { 70 | "popover-in": "popover-in ease-in-out 0.2s", 71 | "popover-out": "popover-out ease-out 0.2s", 72 | "dialog-in": "dialog-in ease-in-out 0.2s", 73 | "dialog-out": "dialog-out ease-out 0.2s", 74 | "fade-in": "fade-in ease-in-out 0.2s", 75 | "fade-out": "fade-out ease-out 0.2s", 76 | }, 77 | }, 78 | }, 79 | plugins: [], 80 | }; 81 | export default config; 82 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "paths": { 16 | "@/*": ["./*"] 17 | } 18 | }, 19 | "include": ["**/*.ts", "**/*.tsx"], 20 | "exclude": ["node_modules"] 21 | } 22 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | import path from "node:path"; 4 | import { fileURLToPath } from "node:url"; 5 | 6 | export default defineConfig({ 7 | plugins: [react()], 8 | server: { 9 | port: 3000, 10 | }, 11 | resolve: { 12 | alias: { 13 | "@": path.dirname(fileURLToPath(import.meta.url)), 14 | }, 15 | }, 16 | }); 17 | --------------------------------------------------------------------------------