diff --git a/.DS_Store b/.DS_Store index c484579b..75d72e90 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/components/Header.tsx b/components/Header.tsx index 450064ed..7ba874cc 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -17,6 +17,9 @@ export default function Header () { Github + + Explore worlds {/* Make submenu items */} + Create diff --git a/generator/components/Controls.tsx b/generator/components/Controls.tsx new file mode 100644 index 00000000..0502d912 --- /dev/null +++ b/generator/components/Controls.tsx @@ -0,0 +1,48 @@ +import { useState, useEffect } from 'react'; + +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; +import Form from 'react-bootstrap/Form'; +import Tabs from 'react-bootstrap/Tabs'; +import Tab from 'react-bootstrap/Tabs'; + +import LayerPanel from './panels/LayerPanel'; +import InfoPanel from './panels/InfoPanel'; + +import { useStatePersisted } from '../hooks/use-state-persisted'; +import { PlanetEditorState } from '../hooks/use-planet-editor-state'; +import GraphicsPanel from './panels/GraphicsPanel'; + +const tabClasses = 'border-left border-right border-bottom'; +const tabStyles = { + paddingTop: '10px', + paddingLeft: '6px', + paddingRight: '6px' +}; + +export default function Controls ({ planetState }: { planetState: PlanetEditorState }) { + const [tab, setTab] = useStatePersisted('world-gen:active-tab', 'planet-info-tab'); + console.log(tab); + + return ( + <> + + +
+ + + + + + + + + + + +
+ +
+ + ); +} \ No newline at end of file diff --git a/generator/components/FieldEditors.tsx b/generator/components/FieldEditors.tsx new file mode 100644 index 00000000..58a2d1ee --- /dev/null +++ b/generator/components/FieldEditors.tsx @@ -0,0 +1,175 @@ +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; +import Form from 'react-bootstrap/Form'; +import Button from 'react-bootstrap/Button'; +import Octicon, { Sync } from '@primer/octicons-react'; +import InputGroup from 'react-bootstrap/InputGroup'; +import Tooltip from 'rc-tooltip'; +import Slider from 'rc-slider'; +import { Vector2, Vector3 } from 'three'; + + +import { randomSeed } from '../services/helpers'; +import { SliderPicker as ColorSlider } from 'react-color'; + +const sliderStyle = { + height: '24px' +}; + +export function TextBox(props: { label: string, value: string, onChange: (value: string) => void }) { + return ( + + {props.label}: {props.value + ''} + + + ); + + function handleChange(e: any) { + props.onChange && props.onChange(e.target.value); + } +} + +export function SeedInput(props: { label?: string, value: string, onChange: (value: string) => void }) { + return ( + + {props.label || 'Seed'}: + + + + + + + + ); + + function handleRandomization() { + props.onChange && props.onChange(randomSeed()); + } + + function handleChange(e: any) { + props.onChange && props.onChange(e.target.value); + } +} + +export function ColorPicker(props: { label: string, value: string, onChange: (value: string) => void }) { + + return ( + + {props.label}: {props.value} + + + ); + + function handleChange(e: any) { + props.onChange && props.onChange(e.hex.toUpperCase()); + } +} + +export function NumberSlider(props: { label: string, min: number, max: number, step: number, value: number, onChange: (value: number) => void }) { + return ( + + {props.label}: {props.value} + + + ); +} + +const VECTOR_LABEL_WIDTH = 3; +export function Vector2Slider({ label, min, max, step, value, onChange }: { label: string, min: Vector2 | number, max: Vector2 | number, step?: Vector2 | number, value: Vector2, onChange: (value: Vector2) => void }) { + step = typeof step === 'undefined' ? 1 : step; + + let vectorMin = typeof min === 'number' ? new Vector2(min, min) : min; + let vectorMax = typeof max === 'number' ? new Vector2(max, max) : max; + let vectorStep = typeof step === 'number' ? new Vector2(step, step) : step; + + return ( + {label}: + + X: {value.x} + + + + + + Y: {value.y} + + + + + ); + + function handleChange(part: 'x' | 'y') { + return (newValue: number) => { + if (onChange) { + if (part === 'x') { + onChange(new Vector2(newValue, value.y)); + } else { + onChange(new Vector2(value.x, newValue)); + } + } + } + } +} + +export function Vector3Slider({ label, min, max, step, value, onChange }: { label: string, min: Vector3 | number, max: Vector3 | number, step?: Vector3 | number, value: Vector3, onChange: (value: Vector3) => void }) { + step = typeof step === 'undefined' ? 1 : step; + + let vectorMin = typeof min === 'number' ? new Vector3(min, min, min) : min; + let vectorMax = typeof max === 'number' ? new Vector3(max, max, max) : max; + let vectorStep = typeof step === 'number' ? new Vector3(step, step, step) : step; + + return ( + {label}: + + X: {value.x} + + + + + + Y: {value.y} + + + + + + Z: {value.z} + + + + + ); + + function handleChange(part: 'x' | 'y' | 'z') { + return (newValue: number) => { + if (onChange) { + switch (part) { + case 'x': + onChange(new Vector3(newValue, value.y, value.z)); + break; + case 'y': + onChange(new Vector3(value.x, newValue, value.z)); + break; + case 'z': + onChange(new Vector3(value.x, value.y, newValue)); + break; + } + } + } + } +} + +export function CheckboxInput(props: { label: string, value: boolean, onChange: (value: boolean) => void }) { + + return ( + + + + ); + + function handleChange(e: any) { + props.onChange && props.onChange(e.target.checked); + } +} \ No newline at end of file diff --git a/generator/components/GithubCorner.tsx b/generator/components/GithubCorner.tsx new file mode 100644 index 00000000..20e26b12 --- /dev/null +++ b/generator/components/GithubCorner.tsx @@ -0,0 +1,52 @@ + +export default function GitHubCorner() { + return ( + <> + + + + + + ) +} \ No newline at end of file diff --git a/generator/components/Layout.tsx b/generator/components/Layout.tsx new file mode 100644 index 00000000..5b4f5f4e --- /dev/null +++ b/generator/components/Layout.tsx @@ -0,0 +1,13 @@ +import Head from "next/head"; +import Container from 'react-bootstrap/Container'; +import GithubCorner from './GithubCorner'; + +export default function Layout(props: {children: any[]}) { + return <> + World Generation + + + {props.children} + + ; +} \ No newline at end of file diff --git a/generator/components/SceneDisplay.tsx b/generator/components/SceneDisplay.tsx new file mode 100644 index 00000000..970050ac --- /dev/null +++ b/generator/components/SceneDisplay.tsx @@ -0,0 +1,22 @@ + +import { useLayoutEffect, useRef } from 'react'; +import SceneManager from '../services/base-scene-manager'; + +export default function SceneDisplay ({sceneManager}: {sceneManager: SceneManager}) { + const canvasRef = useRef(null); + + if (process.browser) { + useLayoutEffect(() => { + console.log('Starting scene...'); + sceneManager.init(canvasRef.current); + sceneManager.start(); + + return () => { + console.log('Stopping scene...'); + sceneManager.stop(); + }; + }, []); + } + + return +} \ No newline at end of file diff --git a/generator/components/SubPage.tsx b/generator/components/SubPage.tsx new file mode 100644 index 00000000..12789798 --- /dev/null +++ b/generator/components/SubPage.tsx @@ -0,0 +1,15 @@ +import Link from "next/link"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Layout from "./Layout"; + +export default function SubPage ({ header, children }: {header: string, children: any }) { + return ( + + +

Hello {header}

+
+ {children} +
+ ) +} \ No newline at end of file diff --git a/generator/components/panels/GraphicsPanel.tsx b/generator/components/panels/GraphicsPanel.tsx new file mode 100644 index 00000000..56a6adb6 --- /dev/null +++ b/generator/components/panels/GraphicsPanel.tsx @@ -0,0 +1,12 @@ +import { CheckboxInput, NumberSlider } from "../FieldEditors"; +import { PlanetEditorState } from "../../hooks/use-planet-editor-state"; + +export default function GraphicsPanel({ planetState }: { planetState: PlanetEditorState }) { + return ( + <> + + + + + ); +} \ No newline at end of file diff --git a/generator/components/panels/InfoPanel.tsx b/generator/components/panels/InfoPanel.tsx new file mode 100644 index 00000000..fe42d44e --- /dev/null +++ b/generator/components/panels/InfoPanel.tsx @@ -0,0 +1,33 @@ +import { PlanetEditorState } from "../../hooks/use-planet-editor-state"; +import { NumberSlider, TextBox, SeedInput, ColorPicker } from "../FieldEditors"; +import Form from "react-bootstrap/Form"; +import Col from 'react-bootstrap/Col'; + +export default function InfoPanel({ planetState }: { planetState: PlanetEditorState }) { + return ( + <> + + + + + + + + + + + + + + + + + + + + + + {/* */} + + ); +} \ No newline at end of file diff --git a/generator/components/panels/LayerPanel.tsx b/generator/components/panels/LayerPanel.tsx new file mode 100644 index 00000000..ce7b4ce9 --- /dev/null +++ b/generator/components/panels/LayerPanel.tsx @@ -0,0 +1,137 @@ +import Col from 'react-bootstrap/Col'; +import Form from 'react-bootstrap/Form'; +import Button from 'react-bootstrap/Button'; +import DropdownButton from 'react-bootstrap/DropdownButton'; +import Dropdown from 'react-bootstrap/Dropdown'; +import ListGroup from 'react-bootstrap/ListGroup'; +import Octicon, { Trashcan } from '@primer/octicons-react'; +import { NumberSlider, Vector2Slider, Vector3Slider } from '../FieldEditors'; +import { PlanetLayer, MaskTypes, createContintentNoise, createMountainNoise, NoiseSettings } from '../../models/planet-settings'; +import { PlanetEditorState } from '../../hooks/use-planet-editor-state'; +import { guid } from '../../services/helpers'; + +export default function LayerPanel({ planetState }: { planetState: PlanetEditorState }) { + return ( + + {planetState.layers.current.map((layer, i) => ( + + + +
+ Label: +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {i > 0 ? + Mask: + + : null } +
+ ))} + + + Terrain Presets + Continents + Mountains + Plataues + Hills + Atmosphere Presets + Light Clouds + Dense Clouds + Hurricans + Orbital Presets + Small Rings + Large Rings + + +
+ ); + + function addLayer(type: string) { + return function () { + planetState.layers.push({ + id: guid(), + name: '', + enabled: true, + maskType: planetState.layers.current.length === 0 ? MaskTypes.None : MaskTypes.FirstLayer, + noiseSettings: type === 'Continents' ? createContintentNoise() : createMountainNoise() + }); + } + } + + function removeLayer(index: number) { + return function () { + planetState.layers.removeAt(index); + } + } + + function handleNoiseChange(field: keyof NoiseSettings, layer: PlanetLayer, index: number) { + let fields = { ...layer }; + + return function (value: any) { + fields.noiseSettings[field] = value; + planetState.layers.update(index, fields); + }; + } + + function handleLayerChange(layer: PlanetLayer, index: number) { + + let fields = { ...layer }; + + return function (e: any) { + //console.log(`${e.target.name} -> ${e.target.value}`); + switch (e.target.name) { + case 'enabled': + fields.enabled = e.target.checked; + break; + case 'maskType': + fields.maskType = e.target.value; + } + + planetState.layers.update(index, fields); + }; + } +} \ No newline at end of file diff --git a/generator/hooks/use-planet-editor-state.ts b/generator/hooks/use-planet-editor-state.ts new file mode 100644 index 00000000..8cecef44 --- /dev/null +++ b/generator/hooks/use-planet-editor-state.ts @@ -0,0 +1,146 @@ +import { useEffect } from 'react'; + +import { Planet } from '../models/planet'; +import { randomSeed, guid } from '../services/helpers'; +import { MaskTypes, createContintentNoise, PlanetLayer } from '../models/planet-settings'; +import { useStatePersisted } from './use-state-persisted'; +import { useStateArray, StateArray } from './use-state-array'; + +export type StateInstance = { current: T, set(value: T): void }; + +function usePlanetEditorFieldState(key: string, initialValue: T, map?: (value: T) => T) { + const [current, set] = useStatePersisted(`world-gen:planet-editor:${key}`, initialValue); + + function mappedSet(value: T) { + if (map) value = map(value); + set(value); + } + + return { current, set: mappedSet }; +} + +export function usePlanetEditorState(planet: Planet): PlanetEditorState { + + const name = usePlanetEditorFieldState('name', '', value => { + planet.name = value; + return planet.name; + }); + + const seed = usePlanetEditorFieldState('seed', randomSeed(), value => { + planet.seed = value; + planet.regenerateTerrain(); + planet.regenerateShading(); + return planet.seed; + }); + + const radius = usePlanetEditorFieldState('radius', 2, value => { + planet.surface.radius = value; + planet.regenerateTerrain(); + planet.regenerateShading(); + return planet.surface.radius; + }); + + const seaLevel = usePlanetEditorFieldState('seaLevel', 1, value => { + planet.sea.radius = value; + planet.sea.regenerateTerrain(); + planet.sea.regenerateShading(); + return planet.sea.radius; + }); + + const seaColor = usePlanetEditorFieldState('seaColor', '#0D1086', value => { + planet.sea.color = value; + planet.sea.regenerateShading(); + return planet.sea.color; + }); + + const colors = usePlanetEditorFieldState('colors', '#2D6086', value => { + planet.surface.regenerateShading(); + return value; + }); + + const layers = useStateArray([{ + id: guid(), + name: '', + enabled: true, + maskType: MaskTypes.None, + noiseSettings: createContintentNoise() + }], value => { + planet.surface.terrainLayers = value; + //planet.regenerateMesh(); + planet.surface.regenerateTerrain(); + planet.surface.regenerateShading(); + return planet.surface.terrainLayers; + }); + + const wireframes = usePlanetEditorFieldState('wireframes', true, value => { + planet.surface.wireframes = value; + return planet.surface.wireframes; + }); + + const resolution = usePlanetEditorFieldState('resolution', 64, value => { + planet.surface.resolution = Math.max(2, value); + planet.sea.resolution = planet.surface.resolution * 2; + planet.regenerateMesh(); + planet.regenerateTerrain(); + planet.regenerateShading(); + return planet.surface.resolution; + }); + + const rotate = usePlanetEditorFieldState('rotate', 0.21, value => { + planet.rotate = value; + return planet.rotate; + }); + + useEffect(() => { + console.log(`Setting initial planet settings...`); + planet.name = name.current; + planet.seed = seed.current; + planet.surface.radius = radius.current; + + planet.sea.radius = seaLevel.current; + planet.sea.color = seaColor.current; + + planet.surface.terrainLayers = layers.current; + + planet.rotate = rotate.current; + planet.surface.resolution = resolution.current; + planet.surface.wireframes = wireframes.current; + + planet.regenerateMesh(); + planet.regenerateTerrain(); + planet.regenerateShading(); + }, []); + + return { + name, + colors, + radius, + seaLevel, + seaColor, + + seed, + + layers, + + wireframes, + resolution, + rotate + }; +} + +export interface PlanetEditorState { + name: StateInstance; + seed: StateInstance; + + colors: StateInstance; + radius: StateInstance; + + seaLevel: StateInstance; + seaColor: StateInstance; + + layers: StateArray, + + wireframes: StateInstance; + resolution: StateInstance; + rotate: StateInstance; +} \ No newline at end of file diff --git a/generator/hooks/use-state-array.ts b/generator/hooks/use-state-array.ts new file mode 100644 index 00000000..8ecbd1af --- /dev/null +++ b/generator/hooks/use-state-array.ts @@ -0,0 +1,77 @@ +import { useState, Dispatch, SetStateAction } from 'react'; + +import { useStatePersisted } from './use-state-persisted'; + +export interface StateArray { + current: T[]; + set(value: T[]): void; + /** + * Adds an item to the end of the array. + * @param item The item to add. + */ + push(item: T): void; + /** + * Adds an item to the start of the array. + * @param item The item to add. + */ + unshift(item: T): void; + removeAt(index: number): void; + removeWhere(predicate: (value: T, index: number, array: T[]) => value is T): void; + clear(): void; + update(index: number, fields: Partial): void +} + +/** + * Creates a state and setter function that persists the array to localStorage. + * @param key The key to use for localStorage. + * @param initialValue The initial array value to use. + * @param map An optional custom map function to modify. + */ +export function useStateArrayPersisted(key: string, initialValue: T[] = [], map?: (newState: T[]) => T[]): StateArray { + const [current, set] = useStatePersisted(key, initialValue); + + return _useStateArrayLogic(current, set, map); +} + +/** + * Creates a state and setter function for the array. + * @param initialValue The initial value to use. + * @param map An optional custom map function to modify. + */ +export function useStateArray(initialValue: T[] = [], map?: (newState: T[]) => T[]): StateArray { + const [current, set] = useState(initialValue); + + return _useStateArrayLogic(current, set, map); +} + +function _useStateArrayLogic(current: T[], setArr: Dispatch>, map?: any): StateArray { + return { + current, + set(value: T[]) { + mappedSet(value); + }, + push(item: T) { + mappedSet([...current, item]); + }, + unshift(item: T) { + mappedSet([item, ...current]); + }, + removeAt(index: number) { + mappedSet([...current.slice(0, index), ...current.slice(index + 1)]); + }, + removeWhere(predicate: (value: T, index: number, array: T[]) => value is T) { + mappedSet(current.filter(predicate)); + }, + clear() { + mappedSet([]) + }, + update(index: number, fields: Partial) { + mappedSet([...current.slice(0, index), { ...current[index], ...fields }, ...current.slice(index + 1)]); + } + }; + + function mappedSet(arr: T[]) { + if (map) arr = map(arr); + setArr(arr); + } +} \ No newline at end of file diff --git a/generator/hooks/use-state-persisted.ts b/generator/hooks/use-state-persisted.ts new file mode 100644 index 00000000..020af085 --- /dev/null +++ b/generator/hooks/use-state-persisted.ts @@ -0,0 +1,38 @@ +import { useState } from 'react'; + +import { storage } from '../services/helpers'; + +/** + * Creates a state and setter function that persists to localStorage. + * @param key The key to use for localStorage. + * @param initialValue The initial value to use. + */ +export function useStatePersisted(key: string, initialValue: T): [T, (value: T) => void] { + if (!process.browser) { + return [initialValue as T, () => { }]; + } + + const [state, setState] = useState(getCached(key, initialValue)); + + return [state, setLocalStorageState]; + + function setLocalStorageState(value: T | ((value: T) => T)) { + if (value instanceof Function) { + setState(prev => { + const newState = value(prev); + return storage.local.set(key, newState); + }); + } else { + storage.local.set(key, value); + setState(value); + } + } +} + +function getCached(key: string, initialValue: T) { + const cached = storage.local.get(key); + if(cached === null && initialValue !== null) { + storage.local.set(key, initialValue); + } + return cached !== null ? cached : initialValue; + } \ No newline at end of file diff --git a/generator/models/direction.ts b/generator/models/direction.ts new file mode 100644 index 00000000..fae088e3 --- /dev/null +++ b/generator/models/direction.ts @@ -0,0 +1,23 @@ +import { Vector3 } from "three"; + +export class Direction { + constructor (public name: string, public vector: Vector3) { } +} + +export const directions = { + UP: new Direction('Up', new Vector3(0, 1, 0)), + DOWN: new Direction('Down', new Vector3(0, -1, 0)), + LEFT: new Direction('Left', new Vector3(-1, 0, 0)), + RIGHT: new Direction('Right', new Vector3(1, 0, 0)), + FORWARD: new Direction('Forward', new Vector3(0, 0, 1)), + BACK: new Direction('Back', new Vector3(0, 0, -1)) +} + +export const directionsList = [ + directions.UP, + directions.DOWN, + directions.LEFT, + directions.RIGHT, + directions.FORWARD, + directions.BACK, +] \ No newline at end of file diff --git a/generator/models/planet-mesh.ts b/generator/models/planet-mesh.ts new file mode 100644 index 00000000..51cb3009 --- /dev/null +++ b/generator/models/planet-mesh.ts @@ -0,0 +1,52 @@ +import { MeshPhongMaterial, Geometry, Color, Vector3, VertexColors, MeshLambertMaterial} from 'three'; +import { ShapeGenerator } from './shape-generator'; +import { QuadSphereMesh } from './quad-sphere-mesh'; +import { PlanetLayer } from './planet-settings'; + +export class PlanetMesh extends QuadSphereMesh { + private _radius: number; + public get radius() { return this._radius; } + public set radius (value: number) { this._radius = Math.max(0, value); } + public planetColor: string; + private _seed: string; + public set seed (value: string) { this._seed = value; } + public terrainLayers: PlanetLayer[] = []; // Of interface PlanetLayer, type array + public constructor() { + super (32, new MeshLambertMaterial({ + color: '#f0f0f0' + })); + } + + public regenerateTerrain() { + const shapeGenerator = new ShapeGenerator(this.terrainLayers, this.radius, this._seed); // Look at basic arguments for ShapeGenerator class + const geometry = this.geometry as Geometry; + geometry.vertices = geometry.vertices.map(vertex => shapeGenerator.CalculatePointOnPlanet(vertex)); + geometry.computeFaceNormals(); + geometry.computeVertexNormals(); + geometry.verticesNeedUpdate = true; + geometry.normalsNeedUpdate = true; + geometry.elementsNeedUpdate = true; + this.regenerateWireFrames(); + } + + public regenerateShading() { + const faceMaterial = this.material as MeshPhongMaterial; + faceMaterial.vertexColors = VertexColors; + faceMaterial.color = new Color('#ffffff'); // new Color (this.settings.color); + const center = new Vector3(0, 0, 0); + const geometry = this.geometry as Geometry; + geometry.faces.forEach(face => { + face.vertexColors = [face.a, face.b, face.c].map(i => { + const dist = geometry.vertices[i].distanceTo(center) - (this.radius+this.terrainLayers[0].noiseSettings.minValue); + if(dist > 0) { + // Land + return new Color('#008000'); + } else { + + // Water + return new Color('#000080'); + } + }); + }); + } +} \ No newline at end of file diff --git a/generator/models/planet-settings.ts b/generator/models/planet-settings.ts new file mode 100644 index 00000000..2c6ec67c --- /dev/null +++ b/generator/models/planet-settings.ts @@ -0,0 +1,63 @@ +import { Vector2, Vector3 } from 'three'; + +export interface PlanetSettings { + name: string; + seed: string; + radius: number; // Size of the planet generated is based on an int/number value defined by the user + color: string; + terrainLayers: PlanetLayer[]; // Will be made up of PlanetLayer classes +} + +export interface PlanetLayer { // Each layer has these parcreateMountainNoiseameters + id?: string; // Can be set by tic ID -> multiple layers from different sectors? + name: string; + enabled: boolean; + maskType: MaskTypes; // Then wrap the image mask around it + noiseSettings?: NoiseSettings; +} + +export interface NoiseSettings { + baseRoughness: number; + roughness: number; + persistence: number; + octaves: number; // 1+ + offset: Vector3; + minValue: number; + strength: number; + stretch: Vector2; // 1+ + skew: Vector3; // 0-1 +} + +export enum MaskTypes { + None = 'None', + FirstLayer = 'First Layer', + PrevLayer = 'Previous Layer', +} + +export function createContintentNoise() { + return { + baseRoughness: 1.5, + roughness: 2.5, + persistence: 0.3, + octaves: 3, + offset: new Vector3(0, 0, 0), + minValue: -0.05, + strength: 0.3, + stretch: new Vector2(0.7, 0.7), + skew: new Vector3(0, 0, 0) + } as NoiseSettings; +}; + +export function createMountainNoise() { + return { + baseRoughness: 1.5, + roughness: 2.7, + persistence: 0.35, + octaves: 6, + offset: new Vector3(0, 0, 0), + minValue: -0.05, + strength: 0.5, + stretch: new Vector2(1, 1), + skew: new Vector3(0, 0, 0), + } as NoiseSettings; +}; \ No newline at end of file diff --git a/generator/models/planet.ts b/generator/models/planet.ts new file mode 100644 index 00000000..436096db --- /dev/null +++ b/generator/models/planet.ts @@ -0,0 +1,42 @@ +import { Group } from "three"; +import { PlanetMesh } from "./planet-mesh"; +import { SeaMesh } from "./sea-mesh"; + +export class Planet extends Group { + public surface: PlanetMesh; + public sea: SeaMesh; + private _seed: string; + public get seed () { return this._seed; } + public set seed ( value: string ) { + this._seed = value; + this.surface.seed = this.sea.seed = this._seed; + } + + public rotate: number; + constructor () { + super(); + this.add(this.surface = new PlanetMesh()); + this.add(this.sea = new SeaMesh(this.surface)); + } + + public regenerateTerrain() { + this.surface.regenerateTerrain(); + this.sea.regenerateTerrain(); + } + + public regenerateShading() { + this.surface.regenerateShading(); + this.sea.regenerateShading(); + } + + public regenerateMesh() { + this.surface.regenerateMesh(); + this.sea.regenerateMesh(); + } + + public update(dT: number) { + if (!!this.rotate) { + this.rotateY(dT * this.rotate); + } + } +} \ No newline at end of file diff --git a/generator/models/quad-sphere-mesh.ts b/generator/models/quad-sphere-mesh.ts new file mode 100644 index 00000000..ec7fee47 --- /dev/null +++ b/generator/models/quad-sphere-mesh.ts @@ -0,0 +1,71 @@ +import { Mesh, LineSegments, Material, Geometry, WireframeGeometry, LineBasicMaterial, Color, Vector3, Face3, Vector2 } from 'three'; +import { directionsList, Direction } from './direction'; + +export class QuadSphereMesh extends Mesh { + private _resolution: number; + public get resolution(): number { return this._resolution; } + public set resolution( value: number ) { this._resolution = Math.max(Math.min(value, 256), 2); } + private _wireframes: LineSegments; + public get wireframes() { return this._wireframes.visible; } + public set wireframes( value: boolean ) { this._wireframes.visible = value; } + public constructor (resolution: number = 32, material?: Material ) { + super(new Geometry(), material); + this.resolution = resolution; + this._wireframes = new LineSegments(); + this._wireframes.visible = false; + this.add(this._wireframes); + }; + + public regenerateMesh () { + let geometry = new Geometry(); + directionsList.forEach(direction => { geometry.merge(this._generateFaceGeometry(direction)); }); + + // Merge vertices into a single geometry + geometry.mergeVertices(); + geometry.computeFaceNormals(); + geometry.computeVertexNormals(); + + this.geometry.dispose(); + this.geometry = geometry; + } + + protected regenerateWireFrames () { + this._wireframes.geometry.dispose(); // Build the wireframes + this._wireframes.geometry = new WireframeGeometry(this.geometry); + const wireframeMat = (this._wireframes.material as LineBasicMaterial); + wireframeMat.color = new Color(0x000000); + wireframeMat.linewidth = 2; + wireframeMat.opacity = 0.25; + wireframeMat.transparent = true; + } + + private _generateFaceGeometry(localUp: Direction) { + const axisA = new Vector3(localUp.vector.y, localUp.vector.z, localUp.vector.x); + const axisB = localUp.vector.clone().cross(axisA); + const geometry = new Geometry(); + const vertices: Vector3[] = []; + const triangles: Face3[] = []; + + for (let y = 0; y < this.resolution; y++) { + for (let x = 0; x < this.resolution; x++) { + const i = x + y * this.resolution; + const percent = new Vector2(x, y).divideScalar(this.resolution - 1); + const pointOnUnitCube = localUp.vector.clone() + .add(axisA.clone().multiplyScalar((percent.x - 0.5) * 2)) + .add(axisB.clone().multiplyScalar((percent.y - 0.5) * 2)); + vertices[i] = pointOnUnitCube.clone().normalize(); + + if (x != this.resolution - 1 && y != this.resolution - 1) { + triangles.push( + new Face3(i, i + this.resolution + 1, i + this.resolution), + new Face3(i, i + 1, i + this.resolution + 1) + ); + } + } + } + + geometry.vertices = vertices; + geometry.faces = triangles; + return geometry; + } +} \ No newline at end of file diff --git a/generator/models/sea-mesh.ts b/generator/models/sea-mesh.ts new file mode 100644 index 00000000..a7ad7020 --- /dev/null +++ b/generator/models/sea-mesh.ts @@ -0,0 +1,52 @@ +import { MeshPhongMaterial, Geometry, Color, Vector3, VertexColors} from 'three'; +import { QuadSphereMesh } from './quad-sphere-mesh'; +import { PlanetMesh } from './planet-mesh'; + +export class SeaMesh extends QuadSphereMesh { + private _radius: number = 1; + public get radius () { return this._radius } + public set radius ( value: number ) { this._radius = Math.max(0, value); } + public get opacity () { return ( this.material as MeshPhongMaterial ).opacity; } + public set opacity ( value: number ) { ( this.material as MeshPhongMaterial ).opacity = value; } + + public color: string = '#002050'; + public seed: string; + + private _planet: PlanetMesh; + public constructor (planet: PlanetMesh) { + super ( 32, new MeshPhongMaterial ({ + transparent: true, + color: '#000810', + opacity: 0.85, + specular: '#004488', + emissive: '#001030', + flatShading: true, + })); + + this._planet = planet; + } + + public regenerateTerrain() { + const geometry = this.geometry as Geometry; + geometry.vertices = geometry.vertices.map( vertex => vertex.normalize().multiplyScalar(( this._planet.radius + this._radius - 1 ))); + geometry.computeFaceNormals(); + geometry.computeVertexNormals(); + geometry.verticesNeedUpdate = true; + geometry.normalsNeedUpdate = true; + geometry.elementsNeedUpdate = true; + this.regenerateWireFrames(); + } + + public regenerateShading() { + const faceMaterial = this.material as MeshPhongMaterial; + faceMaterial.vertexColors = VertexColors; // facematerial.color = new Color('#ffffff'); // new Color(this.settings.color); + const center = new Vector3(0, 0, 0); + const geometry = this.geometry as Geometry; // geometry.faces.forEach(face => { face.vertexColors = [face.a, face.b, face.c].map(i => new Color('#000080')); }) + } + + public update(dT: number) { + /* if (!!this.rotate) { + this.rotateY(dT*this.rotate); + } */ + } +} \ No newline at end of file diff --git a/generator/models/shape-generator.ts b/generator/models/shape-generator.ts new file mode 100644 index 00000000..c5b521c1 --- /dev/null +++ b/generator/models/shape-generator.ts @@ -0,0 +1,79 @@ + +import { Vector3, Quaternion } from 'three'; +import Alea from 'alea'; +import SimplexNoise from 'simplex-noise'; // We had import errors with the latest Simplex version (^4.0.1), so we've gone backwards for now + +import { PlanetLayer, NoiseSettings, MaskTypes } from './planet-settings'; + +export class ShapeGenerator { + private _noiseFilters: NoiseFilter[]; + private _layers: PlanetLayer[]; + private _radius: number; + + public constructor(layers: PlanetLayer[], radius: number, seed: string) { + this._layers = layers; + this._radius = radius; + + const prng = Alea(seed || ''); + this._noiseFilters = []; + for (let i = 0; i < this._layers.length; i++) { + this._noiseFilters[i] = new NoiseFilter(new SimplexNoise(prng), this._layers[i].noiseSettings); + } + } + + public CalculatePointOnPlanet(pointOnSphere: Vector3): Vector3 { + let firstLayerValue = 0; + let prevLayerValue = 0; + let elevation = -1; + + pointOnSphere.normalize(); + const pointOnUnitSphere: Vector3 = pointOnSphere.clone(); + + if (this._noiseFilters.length > 0) { + firstLayerValue = prevLayerValue = this._noiseFilters[0].Evaluate(pointOnUnitSphere); + if (this._layers[0].enabled) { + elevation = firstLayerValue; + } + } + + for (let i = 1; i < this._noiseFilters.length; i++) { + if (this._layers[i].enabled) { + const mask = (this._layers[i].maskType === MaskTypes.FirstLayer && firstLayerValue > this._layers[0].noiseSettings.minValue) ? 1 : + (this._layers[i].maskType === MaskTypes.PrevLayer && prevLayerValue > this._layers[i-1].noiseSettings.minValue) ? 1 : + (this._layers[i].maskType === MaskTypes.None) ? 1 : 0; + + prevLayerValue = this._noiseFilters[i].Evaluate(pointOnUnitSphere); + elevation = Math.max(elevation, prevLayerValue * mask); + } + } + + return pointOnSphere.multiplyScalar(this._radius + elevation); + } +} + +export class NoiseFilter { + + public constructor(private noise: SimplexNoise, private settings: NoiseSettings) { } + + public Evaluate(point: Vector3): number { + let noiseValue = 0; + let frequency = this.settings.baseRoughness; + let amplitude = 1; + let ampTotal = amplitude; + + let q = new Quaternion().setFromAxisAngle(this.settings.skew, Math.PI / 2); + for (let i = 0; i < this.settings.octaves; i++) { + let p = point.clone().multiplyScalar(frequency).add(this.settings.offset); + p = p.applyQuaternion(q); + let v = (this.noise.noise3D(p.x/this.settings.stretch.x, p.y/this.settings.stretch.y, p.z/this.settings.stretch.x)); + noiseValue += v * amplitude; + frequency *= this.settings.roughness; + amplitude *= this.settings.persistence; + ampTotal += amplitude; + } + + noiseValue = noiseValue / ampTotal; + noiseValue = Math.max(noiseValue, this.settings.minValue); + return noiseValue * this.settings.strength; + } +} \ No newline at end of file diff --git a/generator/services/base-scene-manager.ts b/generator/services/base-scene-manager.ts new file mode 100644 index 00000000..0ff8be9c --- /dev/null +++ b/generator/services/base-scene-manager.ts @@ -0,0 +1,7 @@ +export default interface SceneManager { + scene: THREE.Scene; + camera: THREE.Camera; + init(canvas: HTMLCanvasElement): void; + start(): void; + stop(): void; +} \ No newline at end of file diff --git a/generator/services/event-emitter.ts b/generator/services/event-emitter.ts new file mode 100644 index 00000000..5cadfc55 --- /dev/null +++ b/generator/services/event-emitter.ts @@ -0,0 +1,37 @@ +export type EventHandler = (arg: any) => void; + +export class EventEmitter { + private _events: { [key: string]: EventHandler[] } = {}; + + public bind(event: string, handler: EventHandler) { + this._events[event] = this._events[event] || []; + this._events[event].push(handler); + } + + public once(event: string, handler: EventHandler) { + this.bind(event, function h (args) { + this.unbind(event, h); + handler.call(null, args); + }); + } + + public unbind(event: string, handler: EventHandler) { + if (!this._events[event]) return; + + let index = this._events[event].indexOf(handler); + if (index === -1) return; + + this._events[event].splice(index, 1); + } + + public emit(event: string, args: any) { + if (!this._events[event]) return; + + let handlers = this._events[event].slice(); + let count = handlers.length; + + for (let i = 0; i < count; i++) { + handlers[i].call(null, args); + } + } +} \ No newline at end of file diff --git a/generator/services/helpers.ts b/generator/services/helpers.ts new file mode 100644 index 00000000..12e15b5e --- /dev/null +++ b/generator/services/helpers.ts @@ -0,0 +1,42 @@ + +export const EMPTY_STRING = ''; + +export function guid(): string { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + +export function randomSeed(chunks: number = 2) { + return Array(chunks).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(36).toUpperCase()).join(''); +} + +export class StorageAdapter { + private _storage: Storage; + + constructor(storage: 'localStorage'|'sessionStorage') { + this._storage = process.browser ? window[storage] : null; + } + + public get(key: string, defaultValue: T = null): T { + if (!this._storage) return defaultValue; + try { + const item = this._storage.getItem(key); + return item ? JSON.parse(item) : defaultValue; + } catch (error) { + console.log(error); + return defaultValue; + } + } + + public set(key: string, value: T): T { + if(this._storage) this._storage.setItem(key, JSON.stringify(value)); + return value; + } +} + +export const storage = { + local: new StorageAdapter('localStorage'), + session: new StorageAdapter('sessionStorage') +}; \ No newline at end of file diff --git a/generator/services/orbit-controls.ts b/generator/services/orbit-controls.ts new file mode 100644 index 00000000..b97a0a9e --- /dev/null +++ b/generator/services/orbit-controls.ts @@ -0,0 +1,697 @@ +import { Camera, Vector2, Vector3, Matrix4, EventDispatcher, MOUSE, OrthographicCamera, PerspectiveCamera, Quaternion, Spherical } from 'three'; + +const STATE = { + NONE: - 1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_DOLLY: 4, + TOUCH_PAN: 5 +}; + +const CHANGE_EVENT = { type: 'change' }; +const START_EVENT = { type: 'start' }; +const END_EVENT = { type: 'end' }; +const EPS = 0.000001; +/* +* +* This set of controls performs orbiting, dollying (zooming), and panning. +* Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +* Orbit - left mouse / touch: one finger move +* Zoom - middle mouse, or mousewheel / touch: two finger spread or squish +* Pan - right mouse, or arrow keys / touch: three finger swipe +*/ +export class OrbitControls extends EventDispatcher { + object: Camera; + domElement: HTMLElement | HTMLDocument; + window: Window; + + // API + enabled: boolean; + target: Vector3; + + enableZoom: boolean; + zoomSpeed: number; + minDistance: number; + maxDistance: number; + enableRotate: boolean; + rotateSpeed: number; + enablePan: boolean; + keyPanSpeed: number; + autoRotate: boolean; + autoRotateSpeed: number; + minZoom: number; + maxZoom: number; + minPolarAngle: number; + maxPolarAngle: number; + minAzimuthAngle: number; + maxAzimuthAngle: number; + enableKeys: boolean; + keys: { LEFT: number; UP: number; RIGHT: number; BOTTOM: number; }; + mouseButtons: { ORBIT: MOUSE; ZOOM: MOUSE; PAN: MOUSE; }; + enableDamping: boolean; + dampingFactor: number; + + private spherical: Spherical; + private sphericalDelta: Spherical; + private scale: number; + private target0: Vector3; + private position0: Vector3; + private zoom0: any; + private state: number; + private panOffset: Vector3; + private zoomChanged: boolean; + + private rotateStart: Vector2; + private rotateEnd: Vector2; + private rotateDelta: Vector2 + + private panStart: Vector2; + private panEnd: Vector2; + private panDelta: Vector2; + + private dollyStart: Vector2; + private dollyEnd: Vector2; + private dollyDelta: Vector2; + + private updateLastPosition: Vector3; + private updateOffset: Vector3; + private updateQuat: Quaternion; + private updateLastQuaternion: Quaternion; + private updateQuatInverse: Quaternion; + + private panLeftV: Vector3; + private panUpV: Vector3; + private panInternalOffset: Vector3; + + private onContextMenu: EventListener; + private onMouseUp: EventListener; + private onMouseDown: EventListener; + private onMouseMove: EventListener; + private onMouseWheel: EventListener; + private onTouchStart: EventListener; + private onTouchEnd: EventListener; + private onTouchMove: EventListener; + private onKeyDown: EventListener; + + constructor (object: Camera, domElement?: HTMLElement, domWindow?: Window) { + super(); + this.object = object; + + this.domElement = ( domElement !== undefined ) ? domElement : document; + this.window = ( domWindow !== undefined ) ? domWindow : window; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: MOUSE.LEFT, ZOOM: MOUSE.MIDDLE, PAN: MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = (this.object as any).zoom; + + // for update speedup + this.updateOffset = new Vector3(); + // so camera.up is the orbit axis + this.updateQuat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) ); + this.updateQuatInverse = this.updateQuat.clone().inverse(); + this.updateLastPosition = new Vector3(); + this.updateLastQuaternion = new Quaternion(); + + this.state = STATE.NONE; + this.scale = 1; + + // current position in spherical coordinates + this.spherical = new Spherical(); + this.sphericalDelta = new Spherical(); + + this.panOffset = new Vector3(); + this.zoomChanged = false; + + this.rotateStart = new Vector2(); + this.rotateEnd = new Vector2(); + this.rotateDelta = new Vector2(); + + this.panStart = new Vector2(); + this.panEnd = new Vector2(); + this.panDelta = new Vector2(); + + this.dollyStart = new Vector2(); + this.dollyEnd = new Vector2(); + this.dollyDelta = new Vector2(); + + this.panLeftV = new Vector3(); + this.panUpV = new Vector3(); + this.panInternalOffset = new Vector3(); + + // event handlers - FSM: listen for events and reset state + + this.onMouseDown = ( event: ThreeEvent ) => { + if ( this.enabled === false ) return; + event.preventDefault(); + if ( (event as any).button === this.mouseButtons.ORBIT ) { + if ( this.enableRotate === false ) return; + this.rotateStart.set( event.clientX, event.clientY ); + this.state = STATE.ROTATE; + } else if ( event.button === this.mouseButtons.ZOOM ) { + if ( this.enableZoom === false ) return; + this.dollyStart.set( event.clientX, event.clientY ); + this.state = STATE.DOLLY; + } else if ( event.button === this.mouseButtons.PAN ) { + if ( this.enablePan === false ) return; + this.panStart.set( event.clientX, event.clientY ); + this.state = STATE.PAN; + } + + if ( this.state !== STATE.NONE ) { + document.addEventListener( 'mousemove', this.onMouseMove, false ); + document.addEventListener( 'mouseup', this.onMouseUp, false ); + this.dispatchEvent( START_EVENT ); + } + }; + + this.onMouseMove = ( event: ThreeEvent ) => { + + if ( this.enabled === false ) return; + + event.preventDefault(); + + if ( this.state === STATE.ROTATE ) { + if ( this.enableRotate === false ) return; + this.rotateEnd.set( event.clientX, event.clientY ); + this.rotateDelta.subVectors( this.rotateEnd, this.rotateStart ); + const element = this.domElement === document ? this.domElement.body : this.domElement; + + // rotating across whole screen goes 360 degrees around + this.rotateLeft( 2 * Math.PI * this.rotateDelta.x / (element as any).clientWidth * this.rotateSpeed ); + // rotating up and down along whole screen attempts to go 360, but limited to 180 + this.rotateUp( 2 * Math.PI * this.rotateDelta.y / (element as any).clientHeight * this.rotateSpeed ); + this.rotateStart.copy( this.rotateEnd ); + + this.update(); + } else if ( this.state === STATE.DOLLY ) { + + if ( this.enableZoom === false ) return; + + this.dollyEnd.set( event.clientX, event.clientY ); + this.dollyDelta.subVectors( this.dollyEnd, this.dollyStart ); + + if ( this.dollyDelta.y > 0 ) { + this.dollyIn( this.getZoomScale() ); + } else if ( this.dollyDelta.y < 0 ) { + this.dollyOut( this.getZoomScale() ); + } + + this.dollyStart.copy( this.dollyEnd ); + this.update(); + } else if ( this.state === STATE.PAN ) { + + if ( this.enablePan === false ) return; + + this.panEnd.set( event.clientX, event.clientY ); + this.panDelta.subVectors( this.panEnd, this.panStart ); + this.pan( this.panDelta.x, this.panDelta.y ); + this.panStart.copy( this.panEnd ); + this.update(); + } + } + + this.onMouseUp = ( event: ThreeEvent ) => { + if ( this.enabled === false ) return; + document.removeEventListener( 'mousemove', this.onMouseMove, false ); + document.removeEventListener( 'mouseup', this.onMouseUp, false ); + + this.dispatchEvent( END_EVENT ); + this.state = STATE.NONE; + }; + + this.onMouseWheel = ( event: ThreeEvent ) => { + + if ( this.enabled === false || this.enableZoom === false || ( this.state !== STATE.NONE && this.state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + event.stopPropagation(); + + if ( event.deltaY < 0 ) { + this.dollyOut( this.getZoomScale() ); + } else if ( event.deltaY > 0 ) { + this.dollyIn( this.getZoomScale() ); + } + + this.update(); + + this.dispatchEvent( START_EVENT ); // not sure why these are here... + this.dispatchEvent( END_EVENT ); + }; + + this.onKeyDown = ( event: ThreeEvent ) => { + + if ( this.enabled === false || this.enableKeys === false || this.enablePan === false ) return; + + switch ( event.keyCode ) { + case this.keys.UP: { + this.pan( 0, this.keyPanSpeed ); + this.update(); + } break; + case this.keys.BOTTOM: { + this.pan( 0, - this.keyPanSpeed ); + this.update(); + } break; + case this.keys.LEFT: { + this.pan( this.keyPanSpeed, 0 ); + this.update(); + } break; + case this.keys.RIGHT: { + this.pan( - this.keyPanSpeed, 0 ); + this.update(); + } break; + } + }; + + this.onTouchStart = ( event: ThreeEvent ) => { + + if ( this.enabled === false ) return; + + switch ( event.touches.length ) { + // one-fingered touch: rotate + case 1: { + if ( this.enableRotate === false ) return; + + this.rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + this.state = STATE.TOUCH_ROTATE; + } break; + // two-fingered touch: dolly + case 2: { + if ( this.enableZoom === false ) return; + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + this.dollyStart.set( 0, distance ); + this.state = STATE.TOUCH_DOLLY; + } break; + // three-fingered touch: pan + case 3: { + if ( this.enablePan === false ) return; + + this.panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + this.state = STATE.TOUCH_PAN; + } break; + default: { + this.state = STATE.NONE; + } + } + + if ( this.state !== STATE.NONE ) { + this.dispatchEvent( START_EVENT ); + } + }; + + this.onTouchMove = ( event: ThreeEvent ) => { + + if ( this.enabled === false ) return; + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + // one-fingered touch: rotate + case 1: { + if ( this.enableRotate === false ) return; + if ( this.state !== STATE.TOUCH_ROTATE ) return; // is this needed?... + + this.rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + this.rotateDelta.subVectors( this.rotateEnd, this.rotateStart ); + + var element = this.domElement === document ? this.domElement.body : this.domElement; + + // rotating across whole screen goes 360 degrees around + this.rotateLeft( 2 * Math.PI * this.rotateDelta.x / (element as any).clientWidth * this.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + this.rotateUp( 2 * Math.PI * this.rotateDelta.y / (element as any).clientHeight * this.rotateSpeed ); + + this.rotateStart.copy( this.rotateEnd ); + + this.update(); + } break; + // two-fingered touch: dolly + case 2: { + if ( this.enableZoom === false ) return; + if ( this.state !== STATE.TOUCH_DOLLY ) return; // is this needed?... + + //console.log( 'handleTouchMoveDolly' ); + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + this.dollyEnd.set( 0, distance ); + + this.dollyDelta.subVectors( this.dollyEnd, this.dollyStart ); + + if ( this.dollyDelta.y > 0 ) { + this.dollyOut( this.getZoomScale() ); + } else if ( this.dollyDelta.y < 0 ) { + this.dollyIn( this.getZoomScale() ); + } + + this.dollyStart.copy( this.dollyEnd ); + this.update(); + } break; + // three-fingered touch: pan + case 3: { + if ( this.enablePan === false ) return; + if ( this.state !== STATE.TOUCH_PAN ) return; // is this needed?... + this.panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + this.panDelta.subVectors( this.panEnd, this.panStart ); + this.pan( this.panDelta.x, this.panDelta.y ); + this.panStart.copy( this.panEnd ); + this.update(); + } break; + default: { + this.state = STATE.NONE; + } + } + }; + + this.onTouchEnd = ( event: Event ) => { + + if ( this.enabled === false ) return; + this.dispatchEvent( END_EVENT ); + this.state = STATE.NONE; + } + + this.onContextMenu = (event) => { + event.preventDefault(); + }; + + this.domElement.addEventListener( 'contextmenu', this.onContextMenu, false ); + + this.domElement.addEventListener( 'mousedown', this.onMouseDown, false ); + this.domElement.addEventListener( 'wheel', this.onMouseWheel, false ); + + this.domElement.addEventListener( 'touchstart', this.onTouchStart, false ); + this.domElement.addEventListener( 'touchend', this.onTouchEnd, false ); + this.domElement.addEventListener( 'touchmove', this.onTouchMove, false ); + + this.window.addEventListener( 'keydown', this.onKeyDown, false ); + + // force an update at start + this.update(); + } + + update () { + const position = this.object.position; + this.updateOffset.copy( position ).sub( this.target ); + + // rotate offset to "y-axis-is-up" space + this.updateOffset.applyQuaternion( this.updateQuat ); + + // angle from z-axis around y-axis + this.spherical.setFromVector3( this.updateOffset ); + + if ( this.autoRotate && this.state === STATE.NONE ) { + this.rotateLeft( this.getAutoRotationAngle() ); + } + + (this.spherical as any).theta += (this.sphericalDelta as any).theta; + (this.spherical as any).phi += (this.sphericalDelta as any).phi; + + // restrict theta to be between desired limits + (this.spherical as (any) as any).theta = Math.max( this.minAzimuthAngle, Math.min( this.maxAzimuthAngle, (this.spherical as any).theta ) ); + + // restrict phi to be between desired limits + (this.spherical as any).phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, (this.spherical as any).phi ) ); + + this.spherical.makeSafe(); + + (this.spherical as any).radius *= this.scale; + + // restrict radius to be between desired limits + (this.spherical as any).radius = Math.max( this.minDistance, Math.min( this.maxDistance, (this.spherical as any).radius ) ); + + // move target to panned location + this.target.add( this.panOffset ); + + this.updateOffset.setFromSpherical( this.spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + this.updateOffset.applyQuaternion( this.updateQuatInverse ); + + position.copy( this.target ).add( this.updateOffset ); + + this.object.lookAt( this.target ); + + if ( this.enableDamping === true ) { + + (this.sphericalDelta as any).theta *= ( 1 - this.dampingFactor ); + (this.sphericalDelta as any).phi *= ( 1 - this.dampingFactor ); + + } else { + + this.sphericalDelta.set( 0, 0, 0 ); + + } + + this.scale = 1; + this.panOffset.set( 0, 0, 0 ); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( this.zoomChanged || + this.updateLastPosition.distanceToSquared( this.object.position ) > EPS || + 8 * ( 1 - this.updateLastQuaternion.dot( this.object.quaternion ) ) > EPS ) { + + this.dispatchEvent( CHANGE_EVENT ); + this.updateLastPosition.copy( this.object.position ); + this.updateLastQuaternion.copy( this.object.quaternion ); + this.zoomChanged = false; + return true; + } + return false; + } + + panLeft( distance: number, objectMatrix: Matrix4 ) { + this.panLeftV.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + this.panLeftV.multiplyScalar( - distance ); + this.panOffset.add( this.panLeftV ); + } + + panUp( distance: number, objectMatrix: Matrix4 ) { + this.panUpV.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix + this.panUpV.multiplyScalar( distance ); + this.panOffset.add( this.panUpV ); + } + + // deltaX and deltaY are in pixels; right and down are positive + pan( deltaX: number, deltaY: number ) { + const element = this.domElement === document ? this.domElement.body : this.domElement; + + if (this._checkPerspectiveCamera(this.object)) { + // perspective + const position = this.object.position; + this.panInternalOffset.copy( position ).sub( this.target ); + var targetDistance = this.panInternalOffset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( this.object.fov / 2 ) * Math.PI / 180.0 ); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + this.panLeft( 2 * deltaX * targetDistance / (element as any).clientHeight, this.object.matrix ); + this.panUp( 2 * deltaY * targetDistance / (element as any).clientHeight, this.object.matrix ); + } else if (this._checkOrthographicCamera(this.object)) { + // orthographic + this.panLeft( deltaX * ( this.object.right - this.object.left ) / this.object.zoom / (element as any).clientWidth, this.object.matrix ); + this.panUp( deltaY * ( this.object.top - this.object.bottom ) / this.object.zoom / (element as any).clientHeight, this.object.matrix ); + } else { + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + this.enablePan = false; + } + } + + dollyIn( dollyScale: number ) { + if (this._checkPerspectiveCamera(this.object)) { + this.scale /= dollyScale; + } else if (this._checkOrthographicCamera(this.object)) { + this.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom * dollyScale ) ); + this.object.updateProjectionMatrix(); + this.zoomChanged = true; + } else { + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + this.enableZoom = false; + } + } + + dollyOut( dollyScale: number ) { + if (this._checkPerspectiveCamera(this.object)) { + this.scale *= dollyScale; + } else if (this._checkOrthographicCamera(this.object)) { + this.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / dollyScale ) ); + this.object.updateProjectionMatrix(); + this.zoomChanged = true; + } else { + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + this.enableZoom = false; + } + } + + getAutoRotationAngle() { + return 2 * Math.PI / 60 / 60 * this.autoRotateSpeed; + } + + getZoomScale() { + return Math.pow( 0.95, this.zoomSpeed ); + } + + rotateLeft( angle: number ) { + (this.sphericalDelta as any).theta -= angle; + } + + rotateUp( angle: number ) { + (this.sphericalDelta as any).phi -= angle; + } + + getPolarAngle (): number { + return (this.spherical as any).phi; + } + + getAzimuthalAngle (): number { + return (this.spherical as any).theta; + } + + dispose (): void { + this.domElement.removeEventListener( 'contextmenu', this.onContextMenu, false ); + this.domElement.removeEventListener( 'mousedown', this.onMouseDown, false ); + this.domElement.removeEventListener( 'wheel', this.onMouseWheel, false ); + + this.domElement.removeEventListener( 'touchstart', this.onTouchStart, false ); + this.domElement.removeEventListener( 'touchend', this.onTouchEnd, false ); + this.domElement.removeEventListener( 'touchmove', this.onTouchMove, false ); + + document.removeEventListener( 'mousemove', this.onMouseMove, false ); + document.removeEventListener( 'mouseup', this.onMouseUp, false ); + + this.window.removeEventListener( 'keydown', this.onKeyDown, false ); + //this.dispatchEvent( { type: 'dispose' } ); // should this be added here? + } + + reset (): void { + this.target.copy( this.target0 ); + this.object.position.copy( this.position0 ); + (this.object as any).zoom = this.zoom0; + + (this.object as any).updateProjectionMatrix(); + this.dispatchEvent( CHANGE_EVENT ); + + this.update(); + + this.state = STATE.NONE; + } + + saveState(): void { + this.target0.copy(this.target); + this.position0.copy(this.object.position); + // Check whether the camera has zoom property + if (this._checkOrthographicCamera(this.object) || this._checkPerspectiveCamera(this.object)){ + this.zoom0 = this.object.zoom; + } + } + + // backward compatibility + get center(): Vector3 { + console.warn('OrbitControls: .center has been renamed to .target'); + return this.target; + } + get noZoom(): boolean { + console.warn( 'OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + return ! this.enableZoom; + } + + set noZoom( value: boolean ) { + console.warn( 'OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + this.enableZoom = ! value; + } + + /** + * TS typeguard. Checks whether the provided camera is PerspectiveCamera. + * If the check passes (returns true) the passed camera will have the type PerspectiveCamera in the if branch where the check was performed. + * @param camera Object to be checked. + */ + private _checkPerspectiveCamera(camera: Camera): camera is PerspectiveCamera{ + return (camera as PerspectiveCamera).isPerspectiveCamera; + } + /** + * TS typeguard. Checks whether the provided camera is OrthographicCamera. + * If the check passes (returns true) the passed camera will have the type OrthographicCamera in the if branch where the check was performed. + * @param camera Object to be checked. + */ + private _checkOrthographicCamera(camera: Camera): camera is OrthographicCamera{ + return (camera as OrthographicCamera).isOrthographicCamera; + } +} + +interface ThreeEvent extends Event { + clientX: number; + clientY: number; + deltaY: number; + button: MOUSE; + touches: Array; + keyCode: number; +} \ No newline at end of file diff --git a/generator/services/planet-editor-scene.ts b/generator/services/planet-editor-scene.ts new file mode 100644 index 00000000..6e7249f6 --- /dev/null +++ b/generator/services/planet-editor-scene.ts @@ -0,0 +1,69 @@ +import * as THREE from 'three'; +import { OrbitControls } from './orbit-controls'; + +import SceneManager from './base-scene-manager'; +import { Planet } from '../models/planet'; + +export default class PlanetEditorSceneManager implements SceneManager { + + public planet: Planet; + public scene: THREE.Scene; + public camera: THREE.Camera; + public controls: OrbitControls; + + private _renderer: THREE.WebGLRenderer; + private _handleAnimationFrame: (deltaT: number) => void; + private _prevT: number = 0; + + constructor() { + this.scene = new THREE.Scene(); + this.scene.background = new THREE.Color('#000000'); + + this.planet = new Planet(); + this.scene.add(this.planet); + + const ambientLight = new THREE.AmbientLight('#ffffff', 0.15) + this.scene.add(ambientLight); + + const directionalLight = new THREE.DirectionalLight('#efe8e9', 0.8) + directionalLight.position.set(-1000, 0, 1000) + directionalLight.target = this.planet; + this.scene.add(directionalLight); + + this._handleAnimationFrame = (t) => { + const dT = (t - this._prevT) / 1000; + this._prevT = t; + this.planet.update(dT); + this.controls.update(); + + this._renderer.render(this.scene, this.camera); + }; + } + + public init(canvas: HTMLCanvasElement) { + canvas.height = 1080; + canvas.width = canvas.height;// * (16 / 9); + + this._renderer = new THREE.WebGLRenderer({ + canvas, + antialias: true + }); + this._renderer.setPixelRatio(window.devicePixelRatio); + + this.camera = new THREE.PerspectiveCamera(60, canvas.width / canvas.height, 0.1, 1000); + + this.controls = new OrbitControls(this.camera, this._renderer.domElement); + + this.camera.position.set(0, 0, 5); + this.camera.lookAt(0, 0, 0); + this.controls.update(); + } + + public start() { + this._renderer.setAnimationLoop(this._handleAnimationFrame.bind(this)); + } + + public stop() { + this._renderer.setAnimationLoop(null); + } +} \ No newline at end of file diff --git a/package.json b/package.json index abfd8d9c..642325d9 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@emotion/styled": "^11", "@headlessui/react": "^1.7.7", "@lens-protocol/react": "^0.1.1", + "@primer/octicons-react": "9.1.1", "@reach/portal": "^0.18.0", "@supabase/auth-helpers-nextjs": "^0.5.2", "@supabase/auth-helpers-react": "^0.3.1", @@ -27,7 +28,14 @@ "@thirdweb-dev/react": "^3.6.8", "@thirdweb-dev/sdk": "^3.6.8", "@thirdweb-dev/storage": "^1.0.6", + "@types/rc-slider": "^9.3.1", + "@types/rc-tooltip": "^3.7.7", + "@types/react-color": "^3.0.6", + "@types/react-dom": "^18.0.10", + "alea": "^1.0.1", + "bootstrap": "^5.2.3", "classnames": "^2.3.2", + "cross-env": "^7.0.3", "cuid": "^2.1.8", "dayjs": "^1.11.7", "ethers": "^5.7.2", @@ -35,19 +43,25 @@ "graphql": "^16.6.0", "moralis": "^2.10.3", "moralis-v1": "^1.12.0", - "next": "13.1.0", + "next": "^13.1.4", "next-themes": "^0.2.1", "omit-deep": "^0.3.0", "performant-array-to-tree": "^1.11.0", "preact": "^10.11.3", - "react": "18.2.0", + "rc-slider": "^10.1.0", + "rc-tooltip": "^5.3.1", + "react": "^18.2.0", + "react-bootstrap": "1.0.0-beta.12", + "react-color": "^2.19.3", "react-dom": "^18.2.0", "react-hook-form": "^7.41.3", "react-icons": "^4.7.1", "react-markdown": "^8.0.4", "react-moralis": "^1.4.2", "react-syntax-highlighter": "^15.5.0", + "simplex-noise": "2.4.0", "swr": "^2.0.0", + "three": "0.108.0", "uuid": "^9.0.0", "uuidv4": "^6.2.13", "web3uikit": "^1.0.4" @@ -65,8 +79,9 @@ "@types/cookie": "^0.5.1", "@types/node": "^18.11.18", "@types/omit-deep": "^0.3.0", - "@types/react": "^18.0.26", + "@types/react": "^18.0.27", "@types/react-syntax-highlighter": "^15.5.5", + "@types/three": "^0.148.0", "@types/unist": "^2.0.6", "auto-prefixer": "^0.4.2", "autoprefixer": "^10.4.13", diff --git a/pages/.DS_Store b/pages/.DS_Store index f14418e4..d882e7d7 100644 Binary files a/pages/.DS_Store and b/pages/.DS_Store differ diff --git a/pages/_app.tsx b/pages/_app.tsx index 670020b2..6bcadde6 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -11,6 +11,11 @@ import { useState } from "react"; import { createBrowserSupabaseClient } from '@supabase/auth-helpers-nextjs'; import { SessionContextProvider, Session } from '@supabase/auth-helpers-react'; +// For threejs generator components +import 'bootstrap/dist/css/bootstrap.min.css'; +import 'rc-slider/assets/index.css'; +import 'rc-tooltip/assets/bootstrap.css'; + function MyApp({ Component, pageProps }: AppProps<{ initialSession: Session, // Supabase user session }>) { diff --git a/pages/generator/about.tsx b/pages/generator/about.tsx new file mode 100644 index 00000000..daa696bb --- /dev/null +++ b/pages/generator/about.tsx @@ -0,0 +1,19 @@ +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; +import ListGroup from 'react-bootstrap/ListGroup'; +import SubPage from '../../generator/components/SubPage'; + +export default function AboutPage() { + return ( + + + + + + Designed by Signal Kinetics + + + + + ); +} \ No newline at end of file diff --git a/pages/generator/index.tsx b/pages/generator/index.tsx new file mode 100644 index 00000000..29505658 --- /dev/null +++ b/pages/generator/index.tsx @@ -0,0 +1,38 @@ +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; +import ListGroup from 'react-bootstrap/ListGroup'; +import NextLink from 'next/link'; +import Layout from '../../generator/components/Layout'; + +export default function GeneratorIndexPage() { + return ( + + + +

W🌎rldGen

+ +
+ + + + + {/* + */} + + + + + + +

An experiment by Signal Kinetics.

+ +
+
+ ); + + function ListGroupMenuItem ({ label, href }: {label: string, href: string}) { + return + {label} + + } +} \ No newline at end of file diff --git a/pages/generator/planet-editor.tsx b/pages/generator/planet-editor.tsx new file mode 100644 index 00000000..adbec7c5 --- /dev/null +++ b/pages/generator/planet-editor.tsx @@ -0,0 +1,27 @@ +import Link from 'next/link'; +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; + +import SubPage from '../../generator/components/SubPage'; +import Controls from '../../generator/components/Controls'; +import { usePlanetEditorState } from '../../generator/hooks/use-planet-editor-state'; +import SceneDisplay from '../../generator/components/SceneDisplay'; +import PlanetEditorSceneManager from '../../generator/services/planet-editor-scene'; + +const sceneManager = new PlanetEditorSceneManager(); // Then add a section to mint the image as an NFT + +export default function PlanetEditor () { + const planetState = usePlanetEditorState(sceneManager.planet); + + return ( + + + + + + + + + + ); +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 6750c7d1..2bac71a8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,31 @@ { - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] - } \ No newline at end of file + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "noImplicitAny": true, + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true + }, + "exclude": [ + "node_modules" + ], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 00000000..2f02a0f9 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1 @@ +type Observable = unknown; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c3520971..ddd8a04d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -552,6 +552,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/template@^7.18.10", "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" @@ -2786,11 +2793,24 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@hypnosphi/create-react-context@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" + integrity sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + "@iarna/toml@^2.2.5": version "2.2.5" resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== +"@icons/material@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" + integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -3264,10 +3284,10 @@ hey-listen "^1.0.8" tslib "^2.3.1" -"@next/env@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.0.tgz#fdb4d4711c6bd544dd80f0afd9846af2699b8c1c" - integrity sha512-6iNixFzCndH+Bl4FetQzOMjxCJqg8fs0LAlZviig1K6mIjOWH2m2oPcHcOg1Ta5VCe7Bx5KG1Hs+NrWDUkBt9A== +"@next/env@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.4.tgz#ed91156ee48791ad85992d95d8e1f46a740c0d5e" + integrity sha512-x7ydhMpi9/xX7yVK+Fw33OuwwQWVZUFRxenK3z89fmPzQZyUk35Ynb+b7JkrhfRhDIFFvvqpzVSXeseSlBAw7A== "@next/eslint-plugin-next@13.1.0": version "13.1.0" @@ -3276,70 +3296,70 @@ dependencies: glob "7.1.7" -"@next/swc-android-arm-eabi@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.0.tgz#b754f03c1af5572e950993b00cbc189d063e7642" - integrity sha512-ANBZZRjZBV+Sii11ZVxbxSvfIi6dZwu4w+XnJBDmz+0/wtAigpjYWyMkuWZ/RCD7INdusOlU4EgJ99WzWGIDjA== - -"@next/swc-android-arm64@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.1.0.tgz#8794b4c1680ed8825b9a0e9ae5b3d14cd0ad9f07" - integrity sha512-nPwbkS3aZjCIe61wztgjXjIeylijOP8uGtDGjjJVUF3B/5GLVx3ngZu6tjPTMEgaLM0u//HuGK+aZolWUQWE4g== - -"@next/swc-darwin-arm64@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.0.tgz#c7aeb19e53ee06f333b3af1a192a9a5b5b583755" - integrity sha512-0hUydiAW18jK2uGPnZRdnRQtdB/3ZoPo84A6zH7MJHxAWw9lzVsv3kMg9kgVBBlrivzqdNN8rdgA+eYNxzXU9w== - -"@next/swc-darwin-x64@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.0.tgz#2efe163863cf8a72d71b9f72b31b6c1c94f7213a" - integrity sha512-3S3iQqJIysklj0Q9gnanuYMzF8H9p+fUVhvSHxVVLcKH4HsE8EGddNkXsaOyznL1kC6vGKw7h6uz1ojaXEafCA== - -"@next/swc-freebsd-x64@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.0.tgz#bf80e44d0aae021104a4c80f1056d0b13f1b7ba7" - integrity sha512-wAgzwm/em48GIuWq3OYr0BpncMy7c+UA3hsyX+xKh/vb/sOIpQly7JTa+GNdk17s7kprhMfsgzPG3da36NLpkA== - -"@next/swc-linux-arm-gnueabihf@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.0.tgz#71ecac0482bfc7ad4bbe15ae7609cc8119772a0c" - integrity sha512-Cr2hzL7ad+4nj9KrR1Cz1RDcsWa61X6I7gc6PToRYIY4gL480Sijq19xo7dlXQPnr1viVzbNiNnNXZASHv7uvw== - -"@next/swc-linux-arm64-gnu@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.0.tgz#212c2e3f092c8de9a97bbb13a2754271ec38ad90" - integrity sha512-EjCIKfeZB9h72evL2yGNwBvE5Im96Zn7o2zxImlvCiUYb/xXDqn4hzhck035BSP3g3sGDLfijFTE1wKRyXIk4w== - -"@next/swc-linux-arm64-musl@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.0.tgz#950c757b929b84aa359f3f9c3a5d90704d5c8f45" - integrity sha512-WAsZtCtPXlz/7/bnW9ryw856xEun+c6xSwZwbcvrMxtcSiW3z0LD91Nsj3AkexsjRtBjeEpNeVtDExqF2VKKSA== - -"@next/swc-linux-x64-gnu@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.0.tgz#f60582199b2d2ba763deb3355e205733bf408c20" - integrity sha512-Tjd5gieI3X9vPce5yF+GsQxOl0jwUkyOrTR1g5PQr+bT/9Qos/yPL48H1L5ayEp0hxgLVPW7skGal7lVnAoVEQ== - -"@next/swc-linux-x64-musl@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.0.tgz#3a95a243521f5d07985aa6308200d3834e73282b" - integrity sha512-H9UMEQv40e9pkgdX4mCms0dDf2dimmZ6WXhDTWF/yIh9icgcsHaP73BJ9IFlgvh80wLiUgWZ3LAX4vXnXzidmg== - -"@next/swc-win32-arm64-msvc@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.0.tgz#7cc6d467c769dff23ecb9c3953b4429e4ca9f3f8" - integrity sha512-LFFIKjW/cPl4wvG8HF/6oYPJZ+Jy32G3FUflC8UW1Od6W9yOSEvadhk9fMyDZN4cgsNOcVc3uVSMpcuuCpbDGw== - -"@next/swc-win32-ia32-msvc@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.0.tgz#7bf1ed77d80b86c04cea12ecdf6ac4bf54b5160c" - integrity sha512-MBLaoHZSenMdxhB3Ww1VNEhjyPT3uLjzAi5Ygk48LLLbOGu5KxQolhINRrqGuJWqJRNWSJ9JSFBfJrZwQzrUew== - -"@next/swc-win32-x64-msvc@13.1.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.0.tgz#2e23251a84b95182249132480d55fb122a7ae4f0" - integrity sha512-fFTfIQvnmpbKoyh4v3ezlGqtERlgc2Sx8qJwPuYqoVi0V08wCx9wp2Iq1CINxP3UMHkEeNX7gYpDOd+9Cw9EiQ== +"@next/swc-android-arm-eabi@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.4.tgz#7d258554b0812f693e91d1bfc940d0e386b394f7" + integrity sha512-5PAchzFst3In6Ml+9APvBj89H29lcPXcUqEYBVv09fWK/V4IuViKc2qOqM9pyPyw7KsqaZPmuqaG595E6jdZLA== + +"@next/swc-android-arm64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.1.4.tgz#03572661993ba554c4ac6a2b99c35b5062727489" + integrity sha512-LCLjjRhsQ5fR9ExzR2fqxuyJe/D4Ct/YkdonVfJfqOfkEpFwUTQDOVo5GrQec4LZDk3zY+o6vZYjXbB0nD9VLA== + +"@next/swc-darwin-arm64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.4.tgz#10189b4753b43941ffb0f396ee878176c8b4b662" + integrity sha512-LSc/tF1FQ1y1SwKiCdGg8IIl7+Csk6nuLcLIyQXs24UNYjXg5+7vUQXqE8y66v/Dq8qFDC9rM61QhpM9ZDftbg== + +"@next/swc-darwin-x64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.4.tgz#e6574b43699bfe74e38dd620fdaecd7a1676aa0a" + integrity sha512-WoApDo8xfafrNc9+Mz5MwGFKUwbDHsGqLleTGZ8upegwVqDyHsYzqJQudf+loqhV58oGTOqP1eWaHn2J7dijXA== + +"@next/swc-freebsd-x64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.4.tgz#96e77d986bd22b08ce12d3a5fc884494328b94b2" + integrity sha512-fqNyeT8G4guN8AHPIoBRhGY2GJg89FyWpuwX4o0Y3vUy/84IGZpNst3paCzaYkQSqQE/AuCpkB7hKxkN7ittXw== + +"@next/swc-linux-arm-gnueabihf@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.4.tgz#91b035a6c88e8d583f8b9aef465b64d05ecd1f95" + integrity sha512-MEfm8OC1YR9/tYHUzlQsxcSmiuf8XdO7bqh5VtG4pilScjc5I5t+tQgIDgoDGePfh5W99W23hb3s6oCFrt99rw== + +"@next/swc-linux-arm64-gnu@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.4.tgz#15726af0ce29450ffde593e993b0ec1beba75154" + integrity sha512-2wgth/KsuODzW/E7jsRoWdhKmE5oZzXcBPvf9RW+ZpBNvYQkEDlzfLA7n8DtxTU8I4oMas0mdEPdCWXrSNnVZw== + +"@next/swc-linux-arm64-musl@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.4.tgz#74f449a2bb7b6f6fdaa67df0fa3665ee99a826b8" + integrity sha512-GdWhCRljsT7rNEElEsdu4RRppd+XaQOX1IJslsh/+HU6LsJGUE8tXpa68yJjCsHZHifkbdZNeCr5SYdsN6CbAA== + +"@next/swc-linux-x64-gnu@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.4.tgz#dfaed86d84f11ce6c14c267ead267eab7cbea66d" + integrity sha512-Rsk/ojwYqMskN2eo5hUSVe7UuMV/aSjmrmJ0BCFGFPfBY9sPgmYj/oXlDDN0y5lJD9acPuiBjknLWgnOnx5JIA== + +"@next/swc-linux-x64-musl@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.4.tgz#6f5f184967ba00379ac179546a9575bb7aff9c21" + integrity sha512-gKSVPozedA2gpA+vggYnAqpDuzWFed2oxFeXxHw0aW2ALdAZswAinn1ZwXEQ5fHnVguxjZhH0+2nBxpMdF8p5Q== + +"@next/swc-win32-arm64-msvc@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.4.tgz#ccfa61a8ea56b55d7251f32b6c518ed0962d2923" + integrity sha512-+kAXIIVb7Q4LCKmi7dn9qVlG1XUf3Chgj5Rwl0rAP4WBV2TnJIgsOEC24G1Mm3jjif+qXm7SJS9YZ9Yg3Y8sSQ== + +"@next/swc-win32-ia32-msvc@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.4.tgz#8d164ce4de9eeaf3400ad4becdd653f68f0d9527" + integrity sha512-EsfzAFBVaw1zg1FzlLMgRaTX/DKY+EnAvJ6mCIJMGeSOPIj4Oy6xF2yEQ3VaRkwFpAafHJH6JNB/CGrdKFCMXw== + +"@next/swc-win32-x64-msvc@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.4.tgz#0eab48201b90e862c76add99c4feff00bfb0fb67" + integrity sha512-bygNjmnq+F9NqJXh7OfhJgqu6LGU29GNKQYVyZkxY/h5K0WWUvAE/VL+TdyMwbvQr9KByx5XLwORwetLxXCo4g== "@noble/ed25519@^1.6.1", "@noble/ed25519@^1.7.0", "@noble/ed25519@^1.7.1": version "1.7.1" @@ -3426,6 +3446,13 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== +"@primer/octicons-react@9.1.1": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@primer/octicons-react/-/octicons-react-9.1.1.tgz#bee3d091c6ecc179c5e46d4716929b987b07baf7" + integrity sha512-+ZgALoxUOYUeEnqqN6ZqSfRP6LDRgfmErhY4ZIuGlw5Ocjj7AI87J68dD/wYqWl4IW7xE6rmLvpC3kU3iGmAfQ== + dependencies: + prop-types "^15.6.1" + "@project-serum/anchor@^0.25.0": version "0.25.0" resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.25.0.tgz#88ee4843336005cf5a64c80636ce626f0996f503" @@ -3479,6 +3506,18 @@ resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.18.0.tgz#4f3cebe093dd436eeaff633809bf0f68f4f9d2ee" integrity sha512-KdVMdpTgDyK8FzdKO9SCpiibuy/kbv3pwgfXshTI6tEcQT1OOwj7BAksnzGC0rPz0UholwC+AgkqEl3EJX3M1A== +"@react-bootstrap/react-popper@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@react-bootstrap/react-popper/-/react-popper-1.2.1.tgz#4edf4851d5b4dcf2eb6b264ebbed1a7b7654177b" + integrity sha512-4l3q7LcZEhrSkI4d3Ie3g4CdrXqqTexXX4PFT45CB0z5z2JUbaxgRwKNq7r5j2bLdVpZm+uvUGqxJw8d9vgbJQ== + dependencies: + babel-runtime "6.x.x" + create-react-context "^0.2.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.5" + warning "^3.0.0" + "@react-icons/all-files@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@react-icons/all-files/-/all-files-4.1.0.tgz#477284873a0821928224b6fc84c62d2534d6650b" @@ -3494,6 +3533,18 @@ resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== +"@restart/context@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" + integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q== + +"@restart/hooks@^0.3.11": + version "0.3.27" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.27.tgz#91f356d66d4699a8cd8b3d008402708b6a9dc505" + integrity sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw== + dependencies: + dequal "^2.0.2" + "@rushstack/eslint-patch@^1.1.3": version "1.2.0" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" @@ -4147,6 +4198,35 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/rc-slider@^9.3.1": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@types/rc-slider/-/rc-slider-9.3.1.tgz#ed0a11a87fdb3064b2767705c7bd94b62a112725" + integrity sha512-apvhMnpQltIzLIvKfZGeI5uvBK4CoDAnqXlV7rtFRVn4Ecwe5Db32I4LF1sNlhAVevLjLJuE+7Fpi3OnG1mVbg== + dependencies: + rc-slider "*" + +"@types/rc-tooltip@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/rc-tooltip/-/rc-tooltip-3.7.7.tgz#3c3b0d813a03d03d95377f43c3c679ff47b62d8a" + integrity sha512-oTcXDJ9hSug+8MZgotVcfXlPmw5K0XiLwuGKkL7lsf12jGLsYAGez3KIRxuxR0icfZkmNN4JQLsScbrBQnJlkg== + dependencies: + "@types/react" "*" + +"@types/react-color@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/react-color/-/react-color-3.0.6.tgz#602fed023802b2424e7cd6ff3594ccd3d5055f9a" + integrity sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w== + dependencies: + "@types/react" "*" + "@types/reactcss" "*" + +"@types/react-dom@^18.0.10": + version "18.0.10" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" + integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== + dependencies: + "@types/react" "*" + "@types/react-syntax-highlighter@^15.5.5": version "15.5.5" resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.5.tgz#4d3b51f8956195f1f63360ff03f8822c5d74c516" @@ -4154,7 +4234,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.26": +"@types/react@*": version "18.0.26" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== @@ -4163,6 +4243,22 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@>=16.9.11", "@types/react@^18.0.27": + version "18.0.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/reactcss@*": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/reactcss/-/reactcss-1.2.6.tgz#133c1e7e896f2726370d1d5a26bf06a30a038bcc" + integrity sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg== + dependencies: + "@types/react" "*" + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" @@ -4175,6 +4271,13 @@ dependencies: "@types/node" "*" +"@types/three@^0.148.0": + version "0.148.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.148.0.tgz#bf7f0f6f12a9b318eebb7dc3813ae69824e13ae6" + integrity sha512-1GiErjt1pJMadO8EhaxNrtULzdn+f3BbM3YTukiiXBVeRvvx4CXc2rpYdEuEBU/ouCX7Rc95j1HoVG9kFQXQJw== + dependencies: + "@types/webxr" "*" + "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" @@ -4185,6 +4288,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== +"@types/webxr@*": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.0.tgz#aae1cef3210d88fd4204f8c33385a0bbc4da07c9" + integrity sha512-IUMDPSXnYIbEO2IereEFcgcqfDREOgmbGqtrMpVPpACTU6pltYLwHgVkrnYv0XhWEcjio9sYEfIEzgn3c7nDqA== + "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" @@ -4971,6 +5079,11 @@ ajv@^8.0.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" +alea@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/alea/-/alea-1.0.1.tgz#957f60741c5ad11b13f72aa02a6b89fe96a26dc4" + integrity sha512-QU+wv+ziDXaMxRdsQg/aH7sVfWdhKps5YP97IIwFkHCsbDZA3k87JXoZ5/iuemf4ntytzIWeScrRpae8+lDrXA== + algo-msgpack-with-bigint@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" @@ -5442,6 +5555,14 @@ babel-preset-fbjs@^3.4.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" +babel-runtime@6.x.x: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + backoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" @@ -5586,6 +5707,11 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +bootstrap@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.3.tgz#54739f4414de121b9785c5da3c87b37ff008322b" + integrity sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ== + borsh@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.6.0.tgz#a7c9eeca6a31ca9e0607cb49f329cb659eb791e1" @@ -6003,7 +6129,7 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -classnames@^2.3.1, classnames@^2.3.2: +classnames@2.x, classnames@^2.2.1, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== @@ -6260,6 +6386,16 @@ core-js-pure@^3.20.2, core-js-pure@^3.25.1: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.1.tgz#ede4a6b8440585c7190062757069c01d37a19dca" integrity sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw== +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -6340,11 +6476,26 @@ create-hmac@1.1.7, create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-react-context@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3" + integrity sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag== + dependencies: + fbjs "^0.8.0" + gud "^1.0.0" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + cross-fetch@^2.1.0: version "2.2.6" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" @@ -6360,7 +6511,7 @@ cross-fetch@^3.1.4, cross-fetch@^3.1.5: dependencies: node-fetch "2.6.7" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -6533,6 +6684,18 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +deep-equal@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -6595,7 +6758,7 @@ dependency-graph@^0.11.0: resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== -dequal@^2.0.0: +dequal@^2.0.0, dequal@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -6692,6 +6855,26 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-align@^1.7.0: + version "1.12.4" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.4.tgz#3503992eb2a7cfcb2ed3b2a6d21e0b9c00d54511" + integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw== + +dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -6784,6 +6967,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.1.0, end-of-stream@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -7654,6 +7844,19 @@ fbjs-css-vars@^1.0.0: resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== +fbjs@^0.8.0: + version "0.8.18" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" + integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + fbjs@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" @@ -8123,6 +8326,11 @@ gray-matter@^4.0.3: section-matter "^1.0.0" strip-bom-string "^1.0.0" +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -8329,6 +8537,13 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -8662,7 +8877,7 @@ is-plain-object@^2.0.1: dependencies: isobject "^3.0.1" -is-regex@^1.1.4: +is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -8689,6 +8904,11 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + is-stream@^2.0.0, is-stream@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -8794,6 +9014,14 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isomorphic-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" @@ -9045,6 +9273,11 @@ keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keycode@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.1.tgz#09c23b2be0611d26117ea2501c2c391a01f39eff" + integrity sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg== + keyvaluestorage-interface@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" @@ -9195,7 +9428,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.21: +lodash-es@^4.17.15, lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== @@ -9240,7 +9473,7 @@ lodash.topath@^4.5.2: resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== -lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: +lodash@^4.0.1, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9343,6 +9576,11 @@ map-cache@^0.2.0: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== +material-colors@^1.2.1: + version "1.2.6" + resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" + integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -9875,30 +10113,30 @@ next-tick@^1.1.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== -next@13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/next/-/next-13.1.0.tgz#fe65eff07dbdb08c8c925876cffdaf59d4552b32" - integrity sha512-lQMZH1V94L5IL/WaihQkTYabSY73aqgrkGPJB5uz+2O3ES4I3losV/maXLY7l7x5e+oNyE9N81upNQ8uRsR5/A== +next@^13.1.4: + version "13.1.4" + resolved "https://registry.yarnpkg.com/next/-/next-13.1.4.tgz#fe13ff4a656153b6249c101d79a54569c0cd05e5" + integrity sha512-g0oBUU+tcOPKbXTVdsDO2adc6wd/ggqauHHysPQJxuIKqZ+fwICGJht0C5D5V0A/77eQDF5EFwNdAHkFvBDsog== dependencies: - "@next/env" "13.1.0" + "@next/env" "13.1.4" "@swc/helpers" "0.4.14" caniuse-lite "^1.0.30001406" postcss "8.4.14" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-android-arm-eabi" "13.1.0" - "@next/swc-android-arm64" "13.1.0" - "@next/swc-darwin-arm64" "13.1.0" - "@next/swc-darwin-x64" "13.1.0" - "@next/swc-freebsd-x64" "13.1.0" - "@next/swc-linux-arm-gnueabihf" "13.1.0" - "@next/swc-linux-arm64-gnu" "13.1.0" - "@next/swc-linux-arm64-musl" "13.1.0" - "@next/swc-linux-x64-gnu" "13.1.0" - "@next/swc-linux-x64-musl" "13.1.0" - "@next/swc-win32-arm64-msvc" "13.1.0" - "@next/swc-win32-ia32-msvc" "13.1.0" - "@next/swc-win32-x64-msvc" "13.1.0" + "@next/swc-android-arm-eabi" "13.1.4" + "@next/swc-android-arm64" "13.1.4" + "@next/swc-darwin-arm64" "13.1.4" + "@next/swc-darwin-x64" "13.1.4" + "@next/swc-freebsd-x64" "13.1.4" + "@next/swc-linux-arm-gnueabihf" "13.1.4" + "@next/swc-linux-arm64-gnu" "13.1.4" + "@next/swc-linux-arm64-musl" "13.1.4" + "@next/swc-linux-x64-gnu" "13.1.4" + "@next/swc-linux-x64-musl" "13.1.4" + "@next/swc-win32-arm64-msvc" "13.1.4" + "@next/swc-win32-ia32-msvc" "13.1.4" + "@next/swc-win32-x64-msvc" "13.1.4" no-case@^3.0.4: version "3.0.4" @@ -9925,6 +10163,14 @@ node-fetch@2, node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch dependencies: whatwg-url "^5.0.0" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" @@ -10443,6 +10689,11 @@ popmotion@11.0.3: style-value-types "5.0.0" tslib "^2.1.0" +popper.js@^1.14.4, popper.js@^1.14.7: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + postcss-import@^14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" @@ -10577,7 +10828,15 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -10743,6 +11002,64 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +rc-align@^4.0.0: + version "4.0.15" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.15.tgz#2bbd665cf85dfd0b0244c5a752b07565e9098577" + integrity sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + rc-util "^5.26.0" + resize-observer-polyfill "^1.5.1" + +rc-motion@^2.0.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.6.3.tgz#e6d8ca06591c2c1bcd3391a8e7a822ebc4d94e9c" + integrity sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.21.0" + +rc-slider@*, rc-slider@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.1.0.tgz#11e401d8412ae20f9c2ee478bdbaddd042158753" + integrity sha512-nhC8V0+lNj4gGKZix2QAfcj/EP3NvCtFhNJPFMvXUdn7pe8bSa2vXNSxQVN5b9veVSic4Xeqgd/7KamX3gqznA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.18.1" + shallowequal "^1.1.0" + +rc-tooltip@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.3.1.tgz#3dde4e1865f79cd23f202bba4e585c2a1173024b" + integrity sha512-e6H0dMD38EPaSPD2XC8dRfct27VvT2TkPdoBSuNl3RRZ5tspiY/c5xYEmGC0IrABvMBgque4Mr2SMZuliCvoiQ== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "^2.3.1" + rc-trigger "^5.3.1" + +rc-trigger@^5.3.1: + version "5.3.4" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.3.4.tgz#6b4b26e32825677c837d1eb4d7085035eecf9a61" + integrity sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.6" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-util "^5.19.2" + +rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.21.0, rc-util@^5.26.0: + version "5.27.1" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.27.1.tgz#d12f02b9577b04299c0f1a235c8acbcf56e2824b" + integrity sha512-PsjHA+f+KBCz+YTZxrl3ukJU5RoNKoe3KSNMh0xGiISbR67NaM9E9BiMjCwxa3AcCUOg/rZ+V0ZKLSimAA+e3w== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^16.12.0" + react-blockies@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/react-blockies/-/react-blockies-1.4.1.tgz#d4f0faf95ac197213a297a370a4d7f77ea3d0b08" @@ -10750,6 +11067,27 @@ react-blockies@^1.4.1: dependencies: prop-types "^15.5.10" +react-bootstrap@1.0.0-beta.12: + version "1.0.0-beta.12" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.0.0-beta.12.tgz#49fb83e288b1b5fa86e4c51e145630ec8b8598bb" + integrity sha512-qBEAthAzqM+OTS2h5ZCfV5/yZUadQcMlaep4iPyPqsu92JzdcznhSDjw6b+asiepsyQgiS33t8OPeLLRiIDh9Q== + dependencies: + "@babel/runtime" "^7.4.2" + "@react-bootstrap/react-popper" "1.2.1" + "@restart/context" "^2.1.4" + "@restart/hooks" "^0.3.11" + classnames "^2.2.6" + dom-helpers "^3.4.0" + invariant "^2.2.4" + keycode "^2.2.0" + popper.js "^1.14.7" + prop-types "^15.7.2" + prop-types-extra "^1.1.0" + react-overlays "^1.2.0" + react-transition-group "^4.0.0" + uncontrollable "^7.0.0" + warning "^4.0.3" + react-clientside-effect@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" @@ -10757,6 +11095,24 @@ react-clientside-effect@^1.2.6: dependencies: "@babel/runtime" "^7.12.13" +react-color@^2.19.3: + version "2.19.3" + resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.19.3.tgz#ec6c6b4568312a3c6a18420ab0472e146aa5683d" + integrity sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA== + dependencies: + "@icons/material" "^0.2.4" + lodash "^4.17.15" + lodash-es "^4.17.15" + material-colors "^1.2.1" + prop-types "^15.5.10" + reactcss "^1.2.0" + tinycolor2 "^1.4.1" + +react-context-toolbox@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/react-context-toolbox/-/react-context-toolbox-2.0.2.tgz#35637287cb23f801e6ed802c2bb7a97e1f04e3fb" + integrity sha512-tY4j0imkYC3n5ZlYSgFkaw7fmlCp3IoQQ6DxpqeNHzcD0hf+6V+/HeJxviLUZ1Rv1Yn3N3xyO2EhkkZwHn0m1A== + react-cool-dimensions@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/react-cool-dimensions/-/react-cool-dimensions-2.0.7.tgz#2fe6657608f034cd7c89f149ed14e79cf1cb2d50" @@ -10806,7 +11162,7 @@ react-icons@^4.7.1: resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.7.1.tgz#0f4b25a5694e6972677cb189d2a72eabea7a8345" integrity sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw== -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -10816,6 +11172,11 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + react-markdown@^8.0.4: version "8.0.4" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.4.tgz#b5ff1f0f29ead71a7a6f98815eb1a70bcc2a036e" @@ -10851,6 +11212,33 @@ react-native-crypto-js@1.0.0: resolved "https://registry.yarnpkg.com/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz#e677e022e147f41b35614416c92d655f87e2450a" integrity sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA== +react-overlays@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-1.2.0.tgz#205368eeb0a5fb0b7f9b717fa7a12d518500abdb" + integrity sha512-i/FCV8wR6aRaI+Kz/dpJhOdyx+ah2tN1RhT9InPrexyC4uzf3N4bNayFTGtUeQVacj57j1Mqh1CwV60/5153Iw== + dependencies: + classnames "^2.2.6" + dom-helpers "^3.4.0" + prop-types "^15.6.2" + prop-types-extra "^1.1.0" + react-context-toolbox "^2.0.2" + react-popper "^1.3.2" + uncontrollable "^6.0.0" + warning "^4.0.2" + +react-popper@^1.3.2: + version "1.3.11" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" + integrity sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg== + dependencies: + "@babel/runtime" "^7.1.2" + "@hypnosphi/create-react-context" "^0.3.1" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + react-qr-code@^2.0.7: version "2.0.11" resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.11.tgz#444c759a2100424972e17135fbe0e32eaffa19e8" @@ -10913,12 +11301,15 @@ react-syntax-highlighter@^15.5.0: prismjs "^1.27.0" refractor "^3.6.0" -react@18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== +react-transition-group@^4.0.0: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: - loose-envify "^1.1.0" + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" react@^17: version "17.0.2" @@ -10928,6 +11319,20 @@ react@^17: loose-envify "^1.1.0" object-assign "^4.1.1" +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +reactcss@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd" + integrity sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A== + dependencies: + lodash "^4.0.1" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -10993,12 +11398,17 @@ refractor@^3.6.0: parse-entities "^2.0.0" prismjs "~1.27.0" +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -11096,6 +11506,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-from@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -11256,7 +11671,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -11386,6 +11801,11 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -11443,6 +11863,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simplex-noise@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/simplex-noise/-/simplex-noise-2.4.0.tgz#81b3458fb22dccc3bc8dd9a977c73797f86f523a" + integrity sha512-OjyDWm/QZjVbMrPxDVi9b2as+SeNn9EBXlrWVRlFW+TSyWMSXouDryXkQN0vf5YP+QZKobrmkvx1eQYPLtuqfw== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -11851,6 +12276,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +three@0.108.0: + version "0.108.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.108.0.tgz#53d26597c7932f214bb43f4655e566d2058143b5" + integrity sha512-d1ysIXwi8qTlbmMwrTxi5pYiiYIflEr0e48krP0LAY8ndS8c6fkLHn6NvRT+o76/Fs9PBLxFViuI62iGVWwwlg== + through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -11889,6 +12319,11 @@ tiny-invariant@^1.0.6, tiny-invariant@^1.2.0: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== +tinycolor2@^1.4.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.5.2.tgz#7d30b4584d8b7d62b9a94dacc505614a6516a95f" + integrity sha512-h80m9GPFGbcLzZByXlNSEhp1gf8Dy+VX/2JCGUZsWLo7lV1mnE/XlxGYgRBoMLJh1lIDXP0EMC4RPTjlRaV+Bg== + title-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" @@ -12113,6 +12548,16 @@ typed-emitter@^2.1.0: optionalDependencies: rxjs "^7.5.2" +typed-styles@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.5.tgz#a60df245d482a9b1adf9c06c078d0f06085ed1cf" + integrity sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw== + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -12150,6 +12595,24 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== +uncontrollable@^6.0.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-6.2.3.tgz#e7dba0d746e075122ed178f27ad2354d343196c7" + integrity sha512-VgOAoBU2ptCL2bfTG2Mra0I8i1u6Aq84AFonD5tmCAYSfs3hWvr2Rlw0q2ntoxXTHjcQOmZOh3FKaN+UZVyREQ== + dependencies: + "@babel/runtime" "^7.4.5" + invariant "^2.2.4" + +uncontrollable@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + undici@^5.12.0: version "5.14.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.14.0.tgz#1169d0cdee06a4ffdd30810f6228d57998884d00" @@ -12456,6 +12919,20 @@ walletlink@^2.5.0: rxjs "^6.6.3" stream-browserify "^3.0.0" +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ== + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.0, warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -12765,16 +13242,16 @@ websocket@^1.0.32, websocket@^1.0.34: utf-8-validate "^5.0.2" yaeti "^0.0.6" +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + whatwg-fetch@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== -whatwg-fetch@^3.4.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"