├── .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 |
5 |
6 |
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 | 
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 |
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 |
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 |
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 |
43 |
44 |
45 |
46 |
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 |
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 |
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 |
--------------------------------------------------------------------------------