diff --git a/.TODO b/.TODO index 414833079..fe77727ab 100644 --- a/.TODO +++ b/.TODO @@ -18,6 +18,8 @@ ☐ Job queue system ☐ Native file previews ☐ Secret keystore +☐ Search + Efficient way to search sqlite: make file table WITHOUT ROWID ☐ File encryptor ☐ File viewer / player ☐ Open with diff --git a/package.json b/package.json index d7f243e7c..4dfd2753b 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "react-dom": "^17.0.2", "react-dropzone": "^11.3.4", "react-router-dom": "^5.2.0", + "react-spline": "^1.2.1", "react-virtualized": "^9.22.3", "rooks": "^5.7.1", "tailwindcss": "^2.2.16", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index e98534b03..999d602a1 100644 Binary files a/src-tauri/Cargo.lock and b/src-tauri/Cargo.lock differ diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index af9a8ec98..7a8625c7d 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "SpaceDrive" +name = "spacedrive" version = "0.1.0" description = "The next gen private virtual filesystem." authors = ["you"] license = "" repository = "" -default-run = "SpaceDrive" +default-run = "spacedrive" edition = "2018" build = "src/build.rs" diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 93e32200d..62be979e9 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,30 +1,39 @@ -use crate::db::entity::file; +use crate::db::connection::db_instance; +use crate::filesystem; use crate::filesystem::retrieve::Directory; use crate::swift::get_file_thumbnail_base64; -use crate::{db, filesystem}; use anyhow::Result; -use once_cell::sync::OnceCell; -use sea_orm::ColumnTrait; -use sea_orm::{DatabaseConnection, EntityTrait, QueryFilter}; -pub static DB_INSTANCE: OnceCell = OnceCell::new(); +use serde::Serialize; -async fn db_instance() -> Result<&'static DatabaseConnection, String> { - if DB_INSTANCE.get().is_none() { - let db = db::connection::get_connection() - .await - .map_err(|e| e.to_string())?; - DB_INSTANCE.set(db).unwrap_or_default(); - Ok(DB_INSTANCE.get().unwrap()) - } else { - Ok(DB_INSTANCE.get().unwrap()) - } +#[derive(Serialize)] +pub enum GlobalEventKind { + FileTypeThumb, +} + +#[derive(Serialize)] +pub struct GlobalEvent { + pub kind: GlobalEventKind, + pub data: T, +} +#[derive(Serialize)] +pub struct GenFileTypeIconsResponse { + pub thumbnail_b64: String, + pub file_id: u32, +} + +pub fn reply(window: &tauri::Window, kind: GlobalEventKind, data: T) { + let _message = window + .emit("message", GlobalEvent { kind, data }) + .map_err(|e| println!("{}", e)); } #[tauri::command(async)] -pub async fn scan_dir(path: String) -> Result<(), String> { +pub async fn scan_dir(window: tauri::Window, path: String) -> Result<(), String> { db_instance().await?; + // reply(&window, GlobalEventKind::JEFF, "jeff"); + let files = filesystem::indexer::scan(&path) .await .map_err(|e| e.to_string())?; @@ -35,37 +44,31 @@ pub async fn scan_dir(path: String) -> Result<(), String> { } #[tauri::command(async)] pub async fn get_file_thumb(path: &str) -> Result { - let thumbnail_b46 = get_file_thumbnail_base64(path).to_string(); + let thumbnail_b64 = get_file_thumbnail_base64(path).to_string(); - Ok(thumbnail_b46) + Ok(thumbnail_b64) } #[tauri::command(async)] pub async fn get_files(path: String) -> Result { - let connection = db_instance().await?; + Ok(filesystem::retrieve::get_dir_with_contents(&path).await?) +} - println!("getting files... {:?}", &path); - - let directories = file::Entity::find() - .filter(file::Column::Uri.eq(path)) - .all(connection) - .await - .map_err(|e| e.to_string())?; - - if directories.is_empty() { - return Err("fuk".to_owned()); +#[tauri::command] +pub async fn get_thumbs_for_directory(window: tauri::Window, path: &str) -> Result<(), String> { + let dir = filesystem::retrieve::get_dir_with_contents(&path).await?; + for file in dir.contents.into_iter() { + let thumbnail_b64 = get_file_thumbnail_base64(&file.uri).to_string(); + println!("getting thumb: {:?}", file.id); + reply( + &window, + GlobalEventKind::FileTypeThumb, + GenFileTypeIconsResponse { + thumbnail_b64, + file_id: file.id, + }, + ) } - let directory = &directories[0]; - - let files = file::Entity::find() - .filter(file::Column::ParentId.eq(directory.id)) - .all(connection) - .await - .map_err(|e| e.to_string())?; - - Ok(Directory { - directory: directory.clone(), - contents: files, - }) + Ok(()) } diff --git a/src-tauri/src/db/connection.rs b/src-tauri/src/db/connection.rs index f6744ed6c..9809451a4 100644 --- a/src-tauri/src/db/connection.rs +++ b/src-tauri/src/db/connection.rs @@ -1,5 +1,6 @@ use crate::app::config; use anyhow::{Context, Result}; +use once_cell::sync::OnceCell; use rusqlite::Connection; use sea_orm::{Database, DatabaseConnection, DbErr}; // use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode}; @@ -16,6 +17,17 @@ pub async fn get_connection() -> Result { Ok(db) } +pub static DB_INSTANCE: OnceCell = OnceCell::new(); +pub async fn db_instance() -> Result<&'static DatabaseConnection, String> { + if DB_INSTANCE.get().is_none() { + let db = get_connection().await.map_err(|e| e.to_string())?; + DB_INSTANCE.set(db).unwrap_or_default(); + Ok(DB_INSTANCE.get().unwrap()) + } else { + Ok(DB_INSTANCE.get().unwrap()) + } +} + pub async fn create_primary_db() -> Result<(), sqlx::Error> { let config = config::get_config(); diff --git a/src-tauri/src/filesystem/indexer.rs b/src-tauri/src/filesystem/indexer.rs index 4cf63998b..d98f03d18 100644 --- a/src-tauri/src/filesystem/indexer.rs +++ b/src-tauri/src/filesystem/indexer.rs @@ -1,4 +1,4 @@ -use crate::commands::DB_INSTANCE; +use crate::db::connection::DB_INSTANCE; use crate::db::entity::file; use crate::filesystem::{checksum, init}; use crate::util::time; @@ -24,10 +24,18 @@ fn is_app_bundle(entry: &DirEntry) -> bool { let contains_dot = entry .file_name() .to_str() - .map(|s| s.contains(".")) + .map(|s| s.contains(".app") | s.contains(".bundle")) .unwrap_or(false); - is_dir && contains_dot + let is_app_bundle = is_dir && contains_dot; + // if is_app_bundle { + // let path_buff = entry.path(); + // let path = path_buff.to_str().unwrap(); + + // self::path(&path, ); + // } + + is_app_bundle } pub async fn scan(path: &str) -> Result<()> { @@ -42,33 +50,50 @@ pub async fn scan(path: &str) -> Result<()> { // insert root directory dirs.insert(path.to_owned(), file.id); // iterate over files and subdirectories - for entry in WalkDir::new(path) - .into_iter() - .filter_entry(|e| !is_hidden(e) && !is_app_bundle(e)) - { + for entry in WalkDir::new(path).into_iter().filter_entry(|dir| { + let approved = !is_hidden(dir) && !is_app_bundle(dir); + approved + }) { let entry = entry?; - let path_buff = entry.path(); - let path = path_buff.to_str().unwrap(); - // get the parent directory from the path - let parent = path_buff.parent().unwrap().to_str().unwrap(); - // get parent dir database id from hashmap - let parent_dir = dirs.get(&parent.to_owned()); + let child_path = entry.path().to_str().unwrap(); + let parent_dir = get_parent_dir_id(&dirs, &entry); // analyse the child file - let child_file = self::path(&path, parent_dir).await.unwrap(); + let child_file = self::path(&child_path, parent_dir).await.unwrap(); + + println!( + "Reading file from dir {:?} {:?} assigned id {:?}", + parent_dir, child_path, child_file.id + ); // if this file is a directory, save in hashmap with database id if child_file.is_dir { - dirs.insert(path.to_owned(), child_file.id); + dirs.insert(child_path.to_owned(), child_file.id); } // println!("{}", entry.path().display()); } } + + println!("Scanning complete: {}", &path); Ok(()) } +fn get_parent_dir_id(dirs: &HashMap, entry: &DirEntry) -> Option { + let path = entry.path(); + let parent_path = path + .parent() + .unwrap_or_else(|| path) + .to_str() + .unwrap_or_default(); + let parent_dir_id = dirs.get(&parent_path.to_owned()); + match parent_dir_id { + Some(x) => Some(x.clone()), + None => None, + } +} + // Read a file from path returning the File struct // Generates meta checksum and extracts metadata -pub async fn path(path: &str, parent_id: Option<&u32>) -> Result { +pub async fn path(path: &str, parent_id: Option) -> Result { let db = DB_INSTANCE.get().unwrap(); let path_buff = path::PathBuf::from(path); @@ -99,9 +124,7 @@ pub async fn path(path: &str, parent_id: Option<&u32>) -> Result { ..Default::default() }; - let file = file.save(&db).await.unwrap(); - - println!("FILE: {:?}", file); + let _file = file.save(&db).await.unwrap(); // REPLACE WHEN SEA QL PULLS THROUGH let existing_files = file::Entity::find() diff --git a/src-tauri/src/filesystem/retrieve.rs b/src-tauri/src/filesystem/retrieve.rs index b81eddce9..62a8318bd 100644 --- a/src-tauri/src/filesystem/retrieve.rs +++ b/src-tauri/src/filesystem/retrieve.rs @@ -1,4 +1,8 @@ +use crate::db::connection::db_instance; use crate::db::entity::file; +use anyhow::Result; +use sea_orm::ColumnTrait; +use sea_orm::{EntityTrait, QueryFilter}; use serde::Serialize; #[derive(Serialize)] @@ -6,3 +10,32 @@ pub struct Directory { pub directory: file::Model, pub contents: Vec, } + +pub async fn get_dir_with_contents(path: &str) -> Result { + let connection = db_instance().await?; + + println!("getting files... {:?}", &path); + + let directories = file::Entity::find() + .filter(file::Column::Uri.eq(path)) + .all(connection) + .await + .map_err(|e| e.to_string())?; + + if directories.is_empty() { + return Err("fuk".to_owned()); + } + + let directory = &directories[0]; + + let files = file::Entity::find() + .filter(file::Column::ParentId.eq(directory.id)) + .all(connection) + .await + .map_err(|e| e.to_string())?; + + Ok(Directory { + directory: directory.clone(), + contents: files, + }) +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 061e1102a..27d749287 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -13,6 +13,8 @@ mod util; use crate::app::menu; use env_logger; use futures::executor::block_on; +use tauri::Manager; + // use systemstat::{saturating_sub_bytes, Platform, System}; fn main() { @@ -31,10 +33,17 @@ fn main() { // block_on(filesystem::device::discover_storage_devices()).unwrap(); tauri::Builder::default() + .setup(|app| { + // let main_window = app.get_window("main").unwrap(); + // // would need to emit this elsewhere in my Rust code + // main_window.emit("my-event", "payload"); + Ok(()) + }) .invoke_handler(tauri::generate_handler![ commands::scan_dir, commands::get_files, - commands::get_file_thumb + commands::get_file_thumb, + commands::get_thumbs_for_directory ]) .menu(menu::get_menu()) .run(tauri::generate_context!()) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index b38a8105c..b79fde7e9 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -13,7 +13,7 @@ "bundle": { "active": true, "targets": "all", - "identifier": "co.sd.client", + "identifier": "co.spacedrive.client", "icon": ["icons/icon.icns"], "resources": [], "externalBin": [], diff --git a/src/App.tsx b/src/App.tsx index ca42026b3..6b5cbcef8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import React, { useEffect, useRef } from 'react'; import { Route, BrowserRouter as Router, Switch, Redirect } from 'react-router-dom'; import { Sidebar } from './components/file/Sidebar'; import { TopBar } from './components/layout/TopBar'; @@ -6,11 +6,15 @@ import { useInputState } from './hooks/useInputState'; import { SettingsScreen } from './screens/Settings'; import { ExplorerScreen } from './screens/Explorer'; import { invoke } from '@tauri-apps/api'; +import { DebugGlobalStore } from './store/Debug'; +import { useGlobalEvents } from './hooks/useGlobalEvents'; export default function App() { + useGlobalEvents(); return (
+
diff --git a/src/assets/spline/scene.json b/src/assets/spline/scene.json new file mode 100644 index 000000000..2e19d88b3 --- /dev/null +++ b/src/assets/spline/scene.json @@ -0,0 +1 @@ +{"object":{"uuid":"175E006A-5EBA-428E-858B-AD67CF13B00E","objectType":"Scene","name":"Windows - Copy","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"layers":1,"children":[{"uuid":"77ADD982-E4B2-4600-94D2-E78893595C41","objectType":"LightDirectional","name":"Directional Light","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,-491.00000000000006,382,292.47744883990526,1],"castShadow":true,"layers":1,"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"5E3DFC6D-0388-4AD8-B204-8FAC82E02235"},"enableHelper":true,"color":16777215,"intensity":0.75,"shadow":{"mapSize":[1024,1024],"camera":{"uuid":"5A1C0D8F-DE84-4A41-BC74-77D0BC238D4F","type":"OrthographicCamera","layers":1,"zoom":1,"left":-2400,"right":2400,"top":2400,"bottom":-2400,"near":1,"far":2500}}},{"uuid":"C73DDE09-5B20-4082-A675-565808D54A5E","objectType":"Mesh2D","name":"Rectangle","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,-22.510038480475487,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"91D4CE4E-BEFB-47CF-AA6B-F35422788C8A"},"geometry":"5396B27A-0F36-43B4-907B-01669D6EE59D","material":"8E2EDBCA-0887-443C-8AE6-B6D3CD29E809"},{"uuid":"FC386E0B-2C2F-4374-BCD8-BE3EB989E05C","objectType":"Mesh3D","name":"Cube 3","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,53,-52.749999999999986,2.5,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"275E6C76-6409-4698-92C7-71479FD68090","selectedState":0,"states":["9CE25592-844A-4CD0-89D3-2BC7A74365C3","329C221D-8853-4B1A-A245-DEF66009665C"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"FC386E0B-2C2F-4374-BCD8-BE3EB989E05C","state":"329C221D-8853-4B1A-A245-DEF66009665C"}]}]},"geometry":"7A5C7B49-C615-4E82-AC38-14FD98A96DB3","material":"5B96993B-D142-4122-A7CC-FE0A12C7C8A1"},{"uuid":"121D4F3C-6A59-4C5E-B447-5A98956ACE8C","objectType":"Mesh3D","name":"Cube 3","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,-53,-52.749999999999986,3,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"EDCDC5E3-3065-4FF7-B4A4-064EF66A13C2","selectedState":0,"states":["6C283F81-B5FA-401A-B187-3E63AAAF84AC","DC47EA21-1332-4687-9D9B-5368BF0A078F"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"121D4F3C-6A59-4C5E-B447-5A98956ACE8C","state":"DC47EA21-1332-4687-9D9B-5368BF0A078F"}]}]},"geometry":"9CF44599-4A50-4A2C-BE8C-14CA200641F6","material":"67EE316E-F664-4ECA-B882-C1B84BDD61D4"},{"uuid":"6E6FEAA8-C11F-42E0-8F01-BEF71DC5B50D","objectType":"Mesh3D","name":"Cube 2","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,53,52.749999999999986,4.5,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"C000579A-C43F-4C75-ACA2-B1F9B7DEADD0","selectedState":0,"states":["3C0A0EFF-AFC9-4BF5-AF7E-E97D2BB42C9D","37732E7B-3E34-4FF9-A072-09F2BBD38DD5"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"6E6FEAA8-C11F-42E0-8F01-BEF71DC5B50D","state":"37732E7B-3E34-4FF9-A072-09F2BBD38DD5"}]}]},"geometry":"3EAE887C-2313-4FB5-B8B9-0635B1CEE6D9","material":"A5A3C657-7996-4927-B570-802AD621A5E6"},{"uuid":"1E532681-5EE1-4428-AC52-EBBF4CC61FB1","objectType":"Mesh3D","name":"Cube","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,-52.00000000000006,52.749999999999986,5.5,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"70ECC936-3263-471E-A056-0138FB901F5B","selectedState":0,"states":["11FF7F14-A2D3-4896-8BA8-76875751A5BD","BC6CBD64-3ACA-46C4-80D4-5CC0A4546356"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"1E532681-5EE1-4428-AC52-EBBF4CC61FB1","state":"BC6CBD64-3ACA-46C4-80D4-5CC0A4546356"}]}]},"geometry":"F0B2D47A-4E59-4097-9172-71A5ACEA8264","material":"ED2A7386-0134-48CB-BF37-CD8D07288A45"},{"uuid":"0EB4956E-4B9D-4CC5-BAC9-D2562A733E06","objectType":"CombinedCamera","name":"Default Camera","matrix":[0.9592203497819743,1.3877787807814457e-17,0.28265937197295754,0,-0.1403466409943231,0.8680240479778703,0.47627415686106955,0,-0.24535513225884917,-0.49652215673835953,0.832626330920498,0,-245.35513225884878,-496.52215673835894,832.6263309204967,1],"layers":1,"userData":{"activeCamera":true},"children":[{"uuid":"E4F06C2F-9B77-4DBC-B9AC-36EE9866A81E","type":"DirectionalLight","name":"Default Directional Light","visible":false,"layers":1,"matrix":[1,0,0,0,0,1,0,0,0,0,1,0,850000,1300000,1000000,1],"color":16777215,"intensity":0.75,"shadow":{"camera":{"uuid":"B78D71CA-611B-4F2E-AA8D-6E3103DA8B1E","type":"OrthographicCamera","layers":1,"zoom":1,"left":-5,"right":5,"top":5,"bottom":-5,"near":0.5,"far":500}}}],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"00BF1C2A-8435-499D-9C13-2079B5AD473E"},"enableHelper":false,"cameraType":"OrthographicCamera","targetOffset":999.9999999999986,"isUpVectorFlipped":false,"angleOffsetFromUp":0,"left":-1280,"right":1280,"top":638,"bottom":-638,"zoomOrtho":1,"nearOrtho":-50000,"far":100000,"aspect":2.006269592476489,"fov":45,"focus":10,"filmGauge":35,"filmOffset":0,"zoomPersp":1,"nearPersp":0.1},{"uuid":"09F67B42-59A5-42D1-A657-4B00178F655D","type":"HemisphereLight","name":"Default Ambient Light","userData":{"isDefaultHemisphereLight":true},"layers":1,"matrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1],"color":13882323,"intensity":0.75,"groundColor":8553090}],"activeCamera":"0EB4956E-4B9D-4CC5-BAC9-D2562A733E06","camera":"0EB4956E-4B9D-4CC5-BAC9-D2562A733E06","directionalLight":"E4F06C2F-9B77-4DBC-B9AC-36EE9866A81E","ambientLight":"09F67B42-59A5-42D1-A657-4B00178F655D","color":[1,0.8549019607843137,0.7647058823529411],"alpha":0,"ambientLightState":true,"canvas":{"mode":2,"preset":"crop","editorSize":{"width":2560,"height":1276},"color":[0,0,0,0.5],"size":{"width":438,"height":396}},"postprocessing":{"enabled":false,"bloom":{"enabled":false,"opacity":1,"blendFunction":16,"intensity":1,"luminanceThreshold":0.9,"luminanceSmoothing":0.025,"blurScale":1,"kernelSize":3},"chromaticAberration":{"enabled":false,"opacity":1,"blendFunction":13,"offset":[10,10]},"vignette":{"enabled":false,"opacity":1,"blendFunction":13,"eskil":false,"darkness":0.5,"offset":0.5},"noise":{"enabled":false,"opacity":1,"blendFunction":14},"colorAverage":{"enabled":false,"opacity":1,"blendFunction":13},"hueSaturation":{"enabled":false,"opacity":1,"blendFunction":13,"_hue":0,"hue":0,"saturation":0},"brightnessContrast":{"enabled":false,"opacity":1,"blendFunction":13,"contrast":0,"brightness":0},"depthOfField":{"enabled":false,"opacity":1,"blendFunction":13,"focalLength":0.1,"focusDistance":0,"bokehScale":1},"pixelation":{"enabled":false,"opacity":1,"blendFunction":13,"granularity":30}}},"metadata":{"version":1.5,"type":"Object","generator":"Object3D.toJSON"},"geometries":[{"uuid":"5396B27A-0F36-43B4-907B-01669D6EE59D","userData":{"shape":{"points":[-165,165,-165,165,-165,165,20,165,165,165,165,165,165,20,165,-165,165,-165,165,-165,20,-165,-165,-165,-165,-165,-165,20],"shapeHoles":[],"isClosed":true,"roundness":20},"parameters":{"width":330,"depth":36,"cornerRadius":[20,20,20,20],"cornerType":1,"extrudeDepth":36,"extrudeBevelSize":9,"extrudeBevelSegments":48,"height":330,"surfaceMaxCount":1000},"ui":{"enabledIndieCorners":false},"type":"RectangleGeometry"}},{"uuid":"7A5C7B49-C615-4E82-AC38-14FD98A96DB3","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":45,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}},{"uuid":"9CF44599-4A50-4A2C-BE8C-14CA200641F6","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":44,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}},{"uuid":"3EAE887C-2313-4FB5-B8B9-0635B1CEE6D9","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":41,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}},{"uuid":"F0B2D47A-4E59-4097-9172-71A5ACEA8264","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":39,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}}],"materials":[{"uuid":"8E2EDBCA-0887-443C-8AE6-B6D3CD29E809","type":"ShaderMaterial","emissiveIntensity":{"uuid":"EE943729-0A24-45BE-B735-E66B8957ED11","type":"f","value":1,"nodeType":"Float"},"transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"LambertMaterial","category":"Lambert","nodeType":"LambertNodeMaterial","layers":{"id":3,"uuid":"9731CEB6-9DE4-4AFC-8ABC-5F4F3BDDB62D","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"57D2B157-D884-4E04-9A73-4C9E72515B23","f0_alpha":"196BD431-114A-4D1A-8107-9B8ACA2DA775","f0_mode":"4CAD73E1-4256-4B40-8E7B-B82662656BD7"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"A30BF4AB-5DFB-4B14-A267-4A6EC476FB18","f1_mode":"6B554DC3-E4DD-4B29-8D93-D26D90F44F0C","f1_emissive":"D4C97229-A45B-4AA2-954D-07216CD4A2B5"}}}}},"glslVersion":null,"defines":{"LAMBERT":1},"vertex":"8BCB73A4-FDDD-4E57-9AED-331EAFB6C51E","fragment":"8BCB73A4-FDDD-4E57-9AED-331EAFB6C51E"},{"uuid":"5B96993B-D142-4122-A7CC-FE0A12C7C8A1","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":2,"uuid":"6E548701-CE56-47F0-991B-ADA38CD98F95","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"50C9ED49-0E89-4DDC-A335-8424E87AF88C","f0_alpha":"3EB420B7-0F15-44BC-8A28-944E06F80EF1","f0_mode":"1E5F2339-DCE8-457E-9E14-680808EC0972"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"AD377F69-6D6A-413C-B39C-A2874FC1231C","f1_mode":"2C3BDC0D-41D3-4EB0-8294-63DCE538631E","f1_shininess":"A2EAD601-278B-46D3-BE50-1CCD84D8C65C","f1_specular":"099F6815-F834-4135-9735-C2CC5D0C15D6"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"1149FF4A-8255-4995-8F44-3CB8C54CF74F","fragment":"1149FF4A-8255-4995-8F44-3CB8C54CF74F"},{"uuid":"67EE316E-F664-4ECA-B882-C1B84BDD61D4","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":2,"uuid":"E0408BF0-E26F-4FBD-815A-562D58292A3C","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"A64F7EB1-1989-47DD-8949-0A89D888B338","f0_alpha":"D5C3515B-7880-425F-BF9B-06C42A792A0E","f0_mode":"626031E6-FB12-49DD-8BC4-063EA9C72937"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"DA9275BB-C356-4399-B32E-F87B0EA254E5","f1_mode":"E333B26C-9C48-47C7-8088-32EB9A75E8E1","f1_shininess":"F6661F1E-3B5F-4672-8412-D90E747DCCC6","f1_specular":"7F35FE77-F485-4A4B-98A3-11B0ABEA95AE"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"A4A0B558-3CE7-4327-9EE8-B850CAF58992","fragment":"A4A0B558-3CE7-4327-9EE8-B850CAF58992"},{"uuid":"A5A3C657-7996-4927-B570-802AD621A5E6","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":3,"uuid":"8028A7A1-F3AA-4F6D-89E9-502868B5DEF1","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"E35B5B46-1889-4A8E-B193-BF304873AE1A","f0_alpha":"C5C53BC9-F87C-40AF-B796-F07DBDC6EA8D","f0_mode":"EE4E1E03-4D99-4801-B483-61F879611745"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"049E0BAA-1C97-421E-8B4A-0FD616531843","f1_mode":"BE77914A-469F-48AA-A4FF-8F325B68F7B6","f1_shininess":"3E0FB0E5-698F-41E2-A885-23D3361B97AA","f1_specular":"EA551D8C-5767-448D-B279-F3B80FE83D32"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"6EE15D33-773D-4A3E-8FB2-4F258E8B83DC","fragment":"6EE15D33-773D-4A3E-8FB2-4F258E8B83DC"},{"uuid":"ED2A7386-0134-48CB-BF37-CD8D07288A45","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":2,"uuid":"C92FC012-9BF9-4A1A-A9A2-4E5D374CC55B","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"BFF13516-FD10-4443-84E4-2D77C1357AD5","f0_alpha":"DB1463CC-5CA8-4337-B6A6-6A807220638E","f0_mode":"79BFC1CF-D45C-445F-8B57-3C556574B738"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"022DA645-E369-4B57-AA68-0D4732062D09","f1_mode":"F16105B7-A58D-4E6D-B91F-F56648112CAF","f1_shininess":"6CA374EC-4877-4BE5-8CBA-CF6A76FDBB34","f1_specular":"29F0AD4A-5272-4357-8BC6-2A3B66C32CDF"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"530DD463-5C04-47E2-A484-05F3F488846B","fragment":"530DD463-5C04-47E2-A484-05F3F488846B"}],"interactionStates":[{"uuid":"9CE25592-844A-4CD0-89D3-2BC7A74365C3","name":"Base State","position":[53,-52.749999999999986,2.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":45},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"382EF2C1-B605-4B3A-9490-763DDDAB12E8","f0_alpha":"7C3FAF8B-5B86-498A-AC6C-0C17AD0A88CA","f0_mode":"B9606F81-4A30-4C6D-AA87-CE19B1B8A12C"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"09BB9B51-176D-4D35-9887-B1E81C5FAA53","f1_mode":"9A515F76-C2E1-4FC4-9AA6-9CDF8EDFB5DC"}}]}},{"uuid":"329C221D-8853-4B1A-A245-DEF66009665C","name":"State 1","position":[47.5,-47.249999999999986,0],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":89,"height":89,"depth":40},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"01173A81-A2B8-4B75-A425-D166B754A24F","f0_alpha":"06587453-23CF-49D3-894A-CFA4A4BB0DA5","f0_mode":"EDD4833F-29B0-4CFE-81E1-C6415D67C711"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"32925F30-E0E2-4D0F-A6BB-27CC9CF27B8D","f1_mode":"CFB49D26-5698-4580-AF37-BF314EA84996"}}]}},{"uuid":"6C283F81-B5FA-401A-B187-3E63AAAF84AC","name":"Base State","position":[-53,-52.749999999999986,3],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":44},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"5552E3F9-97FB-4ED8-9919-EE8D62768064","f0_alpha":"855470C8-7CA2-47CC-B5B8-D63F3B6633ED","f0_mode":"B19E8531-F89E-43C2-864E-D6B090BE503A"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"43AE2CCB-1861-4E23-B36F-4D51C8257596","f1_mode":"D58BA42D-75ED-4901-9B84-C9621B0E7D6E"}}]}},{"uuid":"DC47EA21-1332-4687-9D9B-5368BF0A078F","name":"State 1","position":[-56,-55.749999999999986,4],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":106,"height":106,"depth":46},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"055C6DD8-917D-4105-A6CC-55EE208A20FB","f0_alpha":"A48B472A-F90C-41FC-B242-98CF4D3A0415","f0_mode":"67D14EEE-42D1-426A-8DE1-3D53230F4CAB"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"3860F709-DDC1-491C-8EE0-EA32B482F774","f1_mode":"D074712E-D53F-4EB0-B899-87427215974B"}}]}},{"uuid":"3C0A0EFF-AFC9-4BF5-AF7E-E97D2BB42C9D","name":"Base State","position":[53,52.749999999999986,4.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":41},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"51BC96D4-64C2-4E31-95C0-74AE4B5A68BA","f0_alpha":"5129EB5A-DC56-4A3D-990A-942A803B39D7","f0_mode":"F5F497CD-5680-424C-B5D8-3DFA7ED3C109"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"B03F74CC-A350-4C27-9AC4-3EC656E468CA","f1_mode":"09A1BF88-9352-490B-B63D-A6381F039EA3"}}]}},{"uuid":"37732E7B-3E34-4FF9-A072-09F2BBD38DD5","name":"State 1","position":[61.5,61.249999999999986,8],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":117,"height":117,"depth":48},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"36B3DCC2-FE9E-4D2A-BD91-2B56A2DC792D","f0_alpha":"FC1335E9-FE1D-42A5-8581-A5CEF739D897","f0_mode":"4ED84F5A-BF4A-481B-8A51-03A41760E9B3"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"52F18FD2-BE0F-4320-AFCE-70CA0C5449EC","f1_mode":"569C230D-42BF-43DD-A645-AEC43A5A7004"}}]}},{"uuid":"11FF7F14-A2D3-4896-8BA8-76875751A5BD","name":"Base State","position":[-52.00000000000006,52.749999999999986,5.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":39},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"311A594B-8A47-41BF-9459-E91E61279F11","f0_alpha":"CEF1A959-724C-49D5-9CB1-B4620D2D5131","f0_mode":"12D012AA-377E-48CE-9FB4-000BE002F0B5"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"F2C8C376-1C75-42E9-86B7-411C0E132572","f1_mode":"0556B66C-70B8-4F26-9055-E8E21FE54454"}}]}},{"uuid":"BC6CBD64-3ACA-46C4-80D4-5CC0A4546356","name":"State 1","position":[-47.00000000000006,47.749999999999986,3.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":90,"height":90,"depth":35},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"CD38CF32-FC41-41A6-8F65-1D13ABC676E3","f0_alpha":"C3FF3DEE-FC7F-4AE3-A660-653E6F0F656A","f0_mode":"2C2F18E9-86CC-4141-AD62-68FF99E86BF3"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"4D0655D7-9FEE-407B-87AF-936812B5FE9A","f1_mode":"45FBA650-C38A-4EAB-B32A-6DE1F6088331"}}]}}],"nodes":[{"uuid":"57D2B157-D884-4E04-9A73-4C9E72515B23","type":"c","r":0.33725490196078434,"g":0.35294117647058826,"b":0.4117647058823529,"value":5659241,"alpha":"196BD431-114A-4D1A-8107-9B8ACA2DA775","nodeType":"Color"},{"uuid":"196BD431-114A-4D1A-8107-9B8ACA2DA775","type":"f","value":1,"nodeType":"Float"},{"uuid":"4CAD73E1-4256-4B40-8E7B-B82662656BD7","type":"i","value":0,"nodeType":"Int"},{"uuid":"A30BF4AB-5DFB-4B14-A267-4A6EC476FB18","type":"f","value":1,"nodeType":"Float"},{"uuid":"6B554DC3-E4DD-4B29-8D93-D26D90F44F0C","type":"i","value":"3","nodeType":"Int"},{"uuid":"D4C97229-A45B-4AA2-954D-07216CD4A2B5","type":"c","r":0,"g":0,"b":0,"value":0,"nodeType":"Color"},{"uuid":"8BCB73A4-FDDD-4E57-9AED-331EAFB6C51E","type":"lambert","color":"57D2B157-D884-4E04-9A73-4C9E72515B23","emissiveIntensity":"EE943729-0A24-45BE-B735-E66B8957ED11","shadingAlpha":"A30BF4AB-5DFB-4B14-A267-4A6EC476FB18","shadingBlend":"6B554DC3-E4DD-4B29-8D93-D26D90F44F0C","alpha":"F51C82D0-6B71-4B80-8D05-A7B6DBCD2CD8","emissive":"D4C97229-A45B-4AA2-954D-07216CD4A2B5","nodeType":"Lambert"},{"uuid":"EE943729-0A24-45BE-B735-E66B8957ED11","type":"f","value":1,"nodeType":"Float"},{"uuid":"F51C82D0-6B71-4B80-8D05-A7B6DBCD2CD8","type":"f","value":1,"nodeType":"Float"},{"uuid":"382EF2C1-B605-4B3A-9490-763DDDAB12E8","type":"c","r":1,"g":0.48627450980392156,"b":0,"value":16743424,"alpha":"7C3FAF8B-5B86-498A-AC6C-0C17AD0A88CA","nodeType":"Color"},{"uuid":"7C3FAF8B-5B86-498A-AC6C-0C17AD0A88CA","type":"f","value":1,"nodeType":"Float"},{"uuid":"B9606F81-4A30-4C6D-AA87-CE19B1B8A12C","type":"i","value":0,"nodeType":"Int"},{"uuid":"09BB9B51-176D-4D35-9887-B1E81C5FAA53","type":"f","value":1,"nodeType":"Float"},{"uuid":"9A515F76-C2E1-4FC4-9AA6-9CDF8EDFB5DC","type":"i","value":"2","nodeType":"Int"},{"uuid":"01173A81-A2B8-4B75-A425-D166B754A24F","type":"c","r":1,"g":0.48627450980392156,"b":0,"value":16743424,"alpha":"06587453-23CF-49D3-894A-CFA4A4BB0DA5","nodeType":"Color"},{"uuid":"06587453-23CF-49D3-894A-CFA4A4BB0DA5","type":"f","value":1,"nodeType":"Float"},{"uuid":"EDD4833F-29B0-4CFE-81E1-C6415D67C711","type":"i","value":0,"nodeType":"Int"},{"uuid":"32925F30-E0E2-4D0F-A6BB-27CC9CF27B8D","type":"f","value":1,"nodeType":"Float"},{"uuid":"CFB49D26-5698-4580-AF37-BF314EA84996","type":"i","value":"2","nodeType":"Int"},{"uuid":"50C9ED49-0E89-4DDC-A335-8424E87AF88C","type":"c","r":1,"g":0.48627450980392156,"b":0,"value":16743424,"alpha":"3EB420B7-0F15-44BC-8A28-944E06F80EF1","nodeType":"Color"},{"uuid":"3EB420B7-0F15-44BC-8A28-944E06F80EF1","type":"f","value":1,"nodeType":"Float"},{"uuid":"1E5F2339-DCE8-457E-9E14-680808EC0972","type":"i","value":0,"nodeType":"Int"},{"uuid":"AD377F69-6D6A-413C-B39C-A2874FC1231C","type":"f","value":1,"nodeType":"Float"},{"uuid":"2C3BDC0D-41D3-4EB0-8294-63DCE538631E","type":"i","value":"2","nodeType":"Int"},{"uuid":"A2EAD601-278B-46D3-BE50-1CCD84D8C65C","type":"f","value":30,"nodeType":"Float"},{"uuid":"099F6815-F834-4135-9735-C2CC5D0C15D6","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"1149FF4A-8255-4995-8F44-3CB8C54CF74F","type":"phong","color":"50C9ED49-0E89-4DDC-A335-8424E87AF88C","specular":"099F6815-F834-4135-9735-C2CC5D0C15D6","shininess":"A2EAD601-278B-46D3-BE50-1CCD84D8C65C","shadingAlpha":"AD377F69-6D6A-413C-B39C-A2874FC1231C","shadingBlend":"2C3BDC0D-41D3-4EB0-8294-63DCE538631E","alpha":"3A5BA0C1-E1ED-4E0A-AEA0-6B9CADFC29C0","nodeType":"Phong"},{"uuid":"3A5BA0C1-E1ED-4E0A-AEA0-6B9CADFC29C0","type":"f","value":1,"nodeType":"Float"},{"uuid":"5552E3F9-97FB-4ED8-9919-EE8D62768064","type":"c","r":0.11764705882352941,"g":0.3215686274509804,"b":1,"value":1987327,"alpha":"855470C8-7CA2-47CC-B5B8-D63F3B6633ED","nodeType":"Color"},{"uuid":"855470C8-7CA2-47CC-B5B8-D63F3B6633ED","type":"f","value":1,"nodeType":"Float"},{"uuid":"B19E8531-F89E-43C2-864E-D6B090BE503A","type":"i","value":0,"nodeType":"Int"},{"uuid":"43AE2CCB-1861-4E23-B36F-4D51C8257596","type":"f","value":1,"nodeType":"Float"},{"uuid":"D58BA42D-75ED-4901-9B84-C9621B0E7D6E","type":"i","value":"2","nodeType":"Int"},{"uuid":"055C6DD8-917D-4105-A6CC-55EE208A20FB","type":"c","r":0.11764705882352941,"g":0.3215686274509804,"b":1,"value":1987327,"alpha":"A48B472A-F90C-41FC-B242-98CF4D3A0415","nodeType":"Color"},{"uuid":"A48B472A-F90C-41FC-B242-98CF4D3A0415","type":"f","value":1,"nodeType":"Float"},{"uuid":"67D14EEE-42D1-426A-8DE1-3D53230F4CAB","type":"i","value":0,"nodeType":"Int"},{"uuid":"3860F709-DDC1-491C-8EE0-EA32B482F774","type":"f","value":1,"nodeType":"Float"},{"uuid":"D074712E-D53F-4EB0-B899-87427215974B","type":"i","value":"2","nodeType":"Int"},{"uuid":"A64F7EB1-1989-47DD-8949-0A89D888B338","type":"c","r":0.11764705882352941,"g":0.3215686274509804,"b":1,"value":1987327,"alpha":"D5C3515B-7880-425F-BF9B-06C42A792A0E","nodeType":"Color"},{"uuid":"D5C3515B-7880-425F-BF9B-06C42A792A0E","type":"f","value":1,"nodeType":"Float"},{"uuid":"626031E6-FB12-49DD-8BC4-063EA9C72937","type":"i","value":0,"nodeType":"Int"},{"uuid":"DA9275BB-C356-4399-B32E-F87B0EA254E5","type":"f","value":1,"nodeType":"Float"},{"uuid":"E333B26C-9C48-47C7-8088-32EB9A75E8E1","type":"i","value":"2","nodeType":"Int"},{"uuid":"F6661F1E-3B5F-4672-8412-D90E747DCCC6","type":"f","value":30,"nodeType":"Float"},{"uuid":"7F35FE77-F485-4A4B-98A3-11B0ABEA95AE","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"A4A0B558-3CE7-4327-9EE8-B850CAF58992","type":"phong","color":"A64F7EB1-1989-47DD-8949-0A89D888B338","specular":"7F35FE77-F485-4A4B-98A3-11B0ABEA95AE","shininess":"F6661F1E-3B5F-4672-8412-D90E747DCCC6","shadingAlpha":"DA9275BB-C356-4399-B32E-F87B0EA254E5","shadingBlend":"E333B26C-9C48-47C7-8088-32EB9A75E8E1","alpha":"9B74DC99-0463-4E5B-B89F-601E2165A6D4","nodeType":"Phong"},{"uuid":"9B74DC99-0463-4E5B-B89F-601E2165A6D4","type":"f","value":1,"nodeType":"Float"},{"uuid":"51BC96D4-64C2-4E31-95C0-74AE4B5A68BA","type":"c","r":0.10980392156862745,"g":0.7490196078431373,"b":0.2196078431372549,"value":1883960,"alpha":"5129EB5A-DC56-4A3D-990A-942A803B39D7","nodeType":"Color"},{"uuid":"5129EB5A-DC56-4A3D-990A-942A803B39D7","type":"f","value":1,"nodeType":"Float"},{"uuid":"F5F497CD-5680-424C-B5D8-3DFA7ED3C109","type":"i","value":0,"nodeType":"Int"},{"uuid":"B03F74CC-A350-4C27-9AC4-3EC656E468CA","type":"f","value":1,"nodeType":"Float"},{"uuid":"09A1BF88-9352-490B-B63D-A6381F039EA3","type":"i","value":"2","nodeType":"Int"},{"uuid":"36B3DCC2-FE9E-4D2A-BD91-2B56A2DC792D","type":"c","r":0.10980392156862745,"g":0.7490196078431373,"b":0.2196078431372549,"value":1883960,"alpha":"FC1335E9-FE1D-42A5-8581-A5CEF739D897","nodeType":"Color"},{"uuid":"FC1335E9-FE1D-42A5-8581-A5CEF739D897","type":"f","value":1,"nodeType":"Float"},{"uuid":"4ED84F5A-BF4A-481B-8A51-03A41760E9B3","type":"i","value":0,"nodeType":"Int"},{"uuid":"52F18FD2-BE0F-4320-AFCE-70CA0C5449EC","type":"f","value":1,"nodeType":"Float"},{"uuid":"569C230D-42BF-43DD-A645-AEC43A5A7004","type":"i","value":"2","nodeType":"Int"},{"uuid":"E35B5B46-1889-4A8E-B193-BF304873AE1A","type":"c","r":0.10980392156862745,"g":0.7490196078431373,"b":0.2196078431372549,"value":1883960,"alpha":"C5C53BC9-F87C-40AF-B796-F07DBDC6EA8D","nodeType":"Color"},{"uuid":"C5C53BC9-F87C-40AF-B796-F07DBDC6EA8D","type":"f","value":1,"nodeType":"Float"},{"uuid":"EE4E1E03-4D99-4801-B483-61F879611745","type":"i","value":0,"nodeType":"Int"},{"uuid":"049E0BAA-1C97-421E-8B4A-0FD616531843","type":"f","value":1,"nodeType":"Float"},{"uuid":"BE77914A-469F-48AA-A4FF-8F325B68F7B6","type":"i","value":"2","nodeType":"Int"},{"uuid":"3E0FB0E5-698F-41E2-A885-23D3361B97AA","type":"f","value":30,"nodeType":"Float"},{"uuid":"EA551D8C-5767-448D-B279-F3B80FE83D32","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"6EE15D33-773D-4A3E-8FB2-4F258E8B83DC","type":"phong","color":"E35B5B46-1889-4A8E-B193-BF304873AE1A","specular":"EA551D8C-5767-448D-B279-F3B80FE83D32","shininess":"3E0FB0E5-698F-41E2-A885-23D3361B97AA","shadingAlpha":"049E0BAA-1C97-421E-8B4A-0FD616531843","shadingBlend":"BE77914A-469F-48AA-A4FF-8F325B68F7B6","alpha":"9BE26472-704D-4E45-B9BB-E7CADD9F8761","nodeType":"Phong"},{"uuid":"9BE26472-704D-4E45-B9BB-E7CADD9F8761","type":"f","value":1,"nodeType":"Float"},{"uuid":"311A594B-8A47-41BF-9459-E91E61279F11","type":"c","r":1,"g":0.24313725490196078,"b":0.24313725490196078,"value":16727614,"alpha":"CEF1A959-724C-49D5-9CB1-B4620D2D5131","nodeType":"Color"},{"uuid":"CEF1A959-724C-49D5-9CB1-B4620D2D5131","type":"f","value":1,"nodeType":"Float"},{"uuid":"12D012AA-377E-48CE-9FB4-000BE002F0B5","type":"i","value":0,"nodeType":"Int"},{"uuid":"F2C8C376-1C75-42E9-86B7-411C0E132572","type":"f","value":1,"nodeType":"Float"},{"uuid":"0556B66C-70B8-4F26-9055-E8E21FE54454","type":"i","value":"2","nodeType":"Int"},{"uuid":"CD38CF32-FC41-41A6-8F65-1D13ABC676E3","type":"c","r":1,"g":0.24313725490196078,"b":0.24313725490196078,"value":16727614,"alpha":"C3FF3DEE-FC7F-4AE3-A660-653E6F0F656A","nodeType":"Color"},{"uuid":"C3FF3DEE-FC7F-4AE3-A660-653E6F0F656A","type":"f","value":1,"nodeType":"Float"},{"uuid":"2C2F18E9-86CC-4141-AD62-68FF99E86BF3","type":"i","value":0,"nodeType":"Int"},{"uuid":"4D0655D7-9FEE-407B-87AF-936812B5FE9A","type":"f","value":1,"nodeType":"Float"},{"uuid":"45FBA650-C38A-4EAB-B32A-6DE1F6088331","type":"i","value":"2","nodeType":"Int"},{"uuid":"BFF13516-FD10-4443-84E4-2D77C1357AD5","type":"c","r":1,"g":0.24313725490196078,"b":0.24313725490196078,"value":16727614,"alpha":"DB1463CC-5CA8-4337-B6A6-6A807220638E","nodeType":"Color"},{"uuid":"DB1463CC-5CA8-4337-B6A6-6A807220638E","type":"f","value":1,"nodeType":"Float"},{"uuid":"79BFC1CF-D45C-445F-8B57-3C556574B738","type":"i","value":0,"nodeType":"Int"},{"uuid":"022DA645-E369-4B57-AA68-0D4732062D09","type":"f","value":1,"nodeType":"Float"},{"uuid":"F16105B7-A58D-4E6D-B91F-F56648112CAF","type":"i","value":"2","nodeType":"Int"},{"uuid":"6CA374EC-4877-4BE5-8CBA-CF6A76FDBB34","type":"f","value":30,"nodeType":"Float"},{"uuid":"29F0AD4A-5272-4357-8BC6-2A3B66C32CDF","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"530DD463-5C04-47E2-A484-05F3F488846B","type":"phong","color":"BFF13516-FD10-4443-84E4-2D77C1357AD5","specular":"29F0AD4A-5272-4357-8BC6-2A3B66C32CDF","shininess":"6CA374EC-4877-4BE5-8CBA-CF6A76FDBB34","shadingAlpha":"022DA645-E369-4B57-AA68-0D4732062D09","shadingBlend":"F16105B7-A58D-4E6D-B91F-F56648112CAF","alpha":"FF2EDB83-BE2E-4F41-9E0C-B9ED14EEEDA6","nodeType":"Phong"},{"uuid":"FF2EDB83-BE2E-4F41-9E0C-B9ED14EEEDA6","type":"f","value":1,"nodeType":"Float"}],"frames":{"currentId":"default-frame-id","coords":[0,0],"frames":{"default-frame-id":{"id":"default-frame-id","name":"Frame","preset":"crop","size":[438,396],"coords":[0,0],"editorScale":1,"backgroundColor":{"r":255,"g":218,"b":195,"a":0},"color":{"r":0,"g":0,"b":0,"a":0.5},"guides":true,"hasSceneScaling":false,"sceneScale":1}}},"assets":{"materials":{}},"editor":{"orbitControls":{"useKeyEvents":false,"enableDamping":true,"enablePan":false,"enableZoom":false,"enableRotate":false,"rotationLimitsMode":0,"rotationVerticalOffset":{"min":1.5707963267948966,"max":1.5707963267948966},"rotationHorizontalOffset":{"min":1.5707963267948966,"max":1.5707963267948966},"autoRotate":false,"autoRotateSpeed":2,"autoRotateClockwise":true},"helperState":true,"publish":{"type":2,"web":{"logo":true}},"settings":{"wireframe":false,"helpers":true}}} \ No newline at end of file diff --git a/src/assets/spline/windows.json b/src/assets/spline/windows.json new file mode 100644 index 000000000..2e19d88b3 --- /dev/null +++ b/src/assets/spline/windows.json @@ -0,0 +1 @@ +{"object":{"uuid":"175E006A-5EBA-428E-858B-AD67CF13B00E","objectType":"Scene","name":"Windows - Copy","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"layers":1,"children":[{"uuid":"77ADD982-E4B2-4600-94D2-E78893595C41","objectType":"LightDirectional","name":"Directional Light","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,-491.00000000000006,382,292.47744883990526,1],"castShadow":true,"layers":1,"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"5E3DFC6D-0388-4AD8-B204-8FAC82E02235"},"enableHelper":true,"color":16777215,"intensity":0.75,"shadow":{"mapSize":[1024,1024],"camera":{"uuid":"5A1C0D8F-DE84-4A41-BC74-77D0BC238D4F","type":"OrthographicCamera","layers":1,"zoom":1,"left":-2400,"right":2400,"top":2400,"bottom":-2400,"near":1,"far":2500}}},{"uuid":"C73DDE09-5B20-4082-A675-565808D54A5E","objectType":"Mesh2D","name":"Rectangle","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,-22.510038480475487,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"91D4CE4E-BEFB-47CF-AA6B-F35422788C8A"},"geometry":"5396B27A-0F36-43B4-907B-01669D6EE59D","material":"8E2EDBCA-0887-443C-8AE6-B6D3CD29E809"},{"uuid":"FC386E0B-2C2F-4374-BCD8-BE3EB989E05C","objectType":"Mesh3D","name":"Cube 3","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,53,-52.749999999999986,2.5,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"275E6C76-6409-4698-92C7-71479FD68090","selectedState":0,"states":["9CE25592-844A-4CD0-89D3-2BC7A74365C3","329C221D-8853-4B1A-A245-DEF66009665C"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"FC386E0B-2C2F-4374-BCD8-BE3EB989E05C","state":"329C221D-8853-4B1A-A245-DEF66009665C"}]}]},"geometry":"7A5C7B49-C615-4E82-AC38-14FD98A96DB3","material":"5B96993B-D142-4122-A7CC-FE0A12C7C8A1"},{"uuid":"121D4F3C-6A59-4C5E-B447-5A98956ACE8C","objectType":"Mesh3D","name":"Cube 3","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,-53,-52.749999999999986,3,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"EDCDC5E3-3065-4FF7-B4A4-064EF66A13C2","selectedState":0,"states":["6C283F81-B5FA-401A-B187-3E63AAAF84AC","DC47EA21-1332-4687-9D9B-5368BF0A078F"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"121D4F3C-6A59-4C5E-B447-5A98956ACE8C","state":"DC47EA21-1332-4687-9D9B-5368BF0A078F"}]}]},"geometry":"9CF44599-4A50-4A2C-BE8C-14CA200641F6","material":"67EE316E-F664-4ECA-B882-C1B84BDD61D4"},{"uuid":"6E6FEAA8-C11F-42E0-8F01-BEF71DC5B50D","objectType":"Mesh3D","name":"Cube 2","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,53,52.749999999999986,4.5,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"C000579A-C43F-4C75-ACA2-B1F9B7DEADD0","selectedState":0,"states":["3C0A0EFF-AFC9-4BF5-AF7E-E97D2BB42C9D","37732E7B-3E34-4FF9-A072-09F2BBD38DD5"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"6E6FEAA8-C11F-42E0-8F01-BEF71DC5B50D","state":"37732E7B-3E34-4FF9-A072-09F2BBD38DD5"}]}]},"geometry":"3EAE887C-2313-4FB5-B8B9-0635B1CEE6D9","material":"A5A3C657-7996-4927-B570-802AD621A5E6"},{"uuid":"1E532681-5EE1-4428-AC52-EBBF4CC61FB1","objectType":"Mesh3D","name":"Cube","matrix":[1,0,0,0,0,1,0,0,0,0,1,0,-52.00000000000006,52.749999999999986,5.5,1],"castShadow":true,"receiveShadow":true,"layers":1,"userData":{"positionToCenter":{"x":0,"y":0,"z":0}},"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"70ECC936-3263-471E-A056-0138FB901F5B","selectedState":0,"states":["11FF7F14-A2D3-4896-8BA8-76875751A5BD","BC6CBD64-3ACA-46C4-80D4-5CC0A4546356"],"events":[{"type":7,"ui":{"isCollapsed":false},"targets":[{"easing":6,"duration":1000,"delay":0,"cubicControls":[0.5,0.05,0.1,0.3],"springParameters":{"mass":1,"stiffness":80,"damping":10,"velocity":0},"repeat":true,"cycle":true,"object":"1E532681-5EE1-4428-AC52-EBBF4CC61FB1","state":"BC6CBD64-3ACA-46C4-80D4-5CC0A4546356"}]}]},"geometry":"F0B2D47A-4E59-4097-9172-71A5ACEA8264","material":"ED2A7386-0134-48CB-BF37-CD8D07288A45"},{"uuid":"0EB4956E-4B9D-4CC5-BAC9-D2562A733E06","objectType":"CombinedCamera","name":"Default Camera","matrix":[0.9592203497819743,1.3877787807814457e-17,0.28265937197295754,0,-0.1403466409943231,0.8680240479778703,0.47627415686106955,0,-0.24535513225884917,-0.49652215673835953,0.832626330920498,0,-245.35513225884878,-496.52215673835894,832.6263309204967,1],"layers":1,"userData":{"activeCamera":true},"children":[{"uuid":"E4F06C2F-9B77-4DBC-B9AC-36EE9866A81E","type":"DirectionalLight","name":"Default Directional Light","visible":false,"layers":1,"matrix":[1,0,0,0,0,1,0,0,0,0,1,0,850000,1300000,1000000,1],"color":16777215,"intensity":0.75,"shadow":{"camera":{"uuid":"B78D71CA-611B-4F2E-AA8D-6E3103DA8B1E","type":"OrthographicCamera","layers":1,"zoom":1,"left":-5,"right":5,"top":5,"bottom":-5,"near":0.5,"far":500}}}],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"interaction":{"uuid":"00BF1C2A-8435-499D-9C13-2079B5AD473E"},"enableHelper":false,"cameraType":"OrthographicCamera","targetOffset":999.9999999999986,"isUpVectorFlipped":false,"angleOffsetFromUp":0,"left":-1280,"right":1280,"top":638,"bottom":-638,"zoomOrtho":1,"nearOrtho":-50000,"far":100000,"aspect":2.006269592476489,"fov":45,"focus":10,"filmGauge":35,"filmOffset":0,"zoomPersp":1,"nearPersp":0.1},{"uuid":"09F67B42-59A5-42D1-A657-4B00178F655D","type":"HemisphereLight","name":"Default Ambient Light","userData":{"isDefaultHemisphereLight":true},"layers":1,"matrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1],"color":13882323,"intensity":0.75,"groundColor":8553090}],"activeCamera":"0EB4956E-4B9D-4CC5-BAC9-D2562A733E06","camera":"0EB4956E-4B9D-4CC5-BAC9-D2562A733E06","directionalLight":"E4F06C2F-9B77-4DBC-B9AC-36EE9866A81E","ambientLight":"09F67B42-59A5-42D1-A657-4B00178F655D","color":[1,0.8549019607843137,0.7647058823529411],"alpha":0,"ambientLightState":true,"canvas":{"mode":2,"preset":"crop","editorSize":{"width":2560,"height":1276},"color":[0,0,0,0.5],"size":{"width":438,"height":396}},"postprocessing":{"enabled":false,"bloom":{"enabled":false,"opacity":1,"blendFunction":16,"intensity":1,"luminanceThreshold":0.9,"luminanceSmoothing":0.025,"blurScale":1,"kernelSize":3},"chromaticAberration":{"enabled":false,"opacity":1,"blendFunction":13,"offset":[10,10]},"vignette":{"enabled":false,"opacity":1,"blendFunction":13,"eskil":false,"darkness":0.5,"offset":0.5},"noise":{"enabled":false,"opacity":1,"blendFunction":14},"colorAverage":{"enabled":false,"opacity":1,"blendFunction":13},"hueSaturation":{"enabled":false,"opacity":1,"blendFunction":13,"_hue":0,"hue":0,"saturation":0},"brightnessContrast":{"enabled":false,"opacity":1,"blendFunction":13,"contrast":0,"brightness":0},"depthOfField":{"enabled":false,"opacity":1,"blendFunction":13,"focalLength":0.1,"focusDistance":0,"bokehScale":1},"pixelation":{"enabled":false,"opacity":1,"blendFunction":13,"granularity":30}}},"metadata":{"version":1.5,"type":"Object","generator":"Object3D.toJSON"},"geometries":[{"uuid":"5396B27A-0F36-43B4-907B-01669D6EE59D","userData":{"shape":{"points":[-165,165,-165,165,-165,165,20,165,165,165,165,165,165,20,165,-165,165,-165,165,-165,20,-165,-165,-165,-165,-165,-165,20],"shapeHoles":[],"isClosed":true,"roundness":20},"parameters":{"width":330,"depth":36,"cornerRadius":[20,20,20,20],"cornerType":1,"extrudeDepth":36,"extrudeBevelSize":9,"extrudeBevelSegments":48,"height":330,"surfaceMaxCount":1000},"ui":{"enabledIndieCorners":false},"type":"RectangleGeometry"}},{"uuid":"7A5C7B49-C615-4E82-AC38-14FD98A96DB3","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":45,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}},{"uuid":"9CF44599-4A50-4A2C-BE8C-14CA200641F6","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":44,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}},{"uuid":"3EAE887C-2313-4FB5-B8B9-0635B1CEE6D9","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":41,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}},{"uuid":"F0B2D47A-4E59-4097-9172-71A5ACEA8264","userData":{"parameters":{"width":100,"widthSegments":1,"heightSegments":1,"depthSegments":1,"cornerRadius":8,"cornerSegments":8,"height":100,"depth":39,"extrudeDepth":0,"extrudeBevelSize":0,"extrudeBevelSegments":1},"type":"CubeGeometry"}}],"materials":[{"uuid":"8E2EDBCA-0887-443C-8AE6-B6D3CD29E809","type":"ShaderMaterial","emissiveIntensity":{"uuid":"EE943729-0A24-45BE-B735-E66B8957ED11","type":"f","value":1,"nodeType":"Float"},"transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"LambertMaterial","category":"Lambert","nodeType":"LambertNodeMaterial","layers":{"id":3,"uuid":"9731CEB6-9DE4-4AFC-8ABC-5F4F3BDDB62D","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"57D2B157-D884-4E04-9A73-4C9E72515B23","f0_alpha":"196BD431-114A-4D1A-8107-9B8ACA2DA775","f0_mode":"4CAD73E1-4256-4B40-8E7B-B82662656BD7"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"A30BF4AB-5DFB-4B14-A267-4A6EC476FB18","f1_mode":"6B554DC3-E4DD-4B29-8D93-D26D90F44F0C","f1_emissive":"D4C97229-A45B-4AA2-954D-07216CD4A2B5"}}}}},"glslVersion":null,"defines":{"LAMBERT":1},"vertex":"8BCB73A4-FDDD-4E57-9AED-331EAFB6C51E","fragment":"8BCB73A4-FDDD-4E57-9AED-331EAFB6C51E"},{"uuid":"5B96993B-D142-4122-A7CC-FE0A12C7C8A1","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":2,"uuid":"6E548701-CE56-47F0-991B-ADA38CD98F95","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"50C9ED49-0E89-4DDC-A335-8424E87AF88C","f0_alpha":"3EB420B7-0F15-44BC-8A28-944E06F80EF1","f0_mode":"1E5F2339-DCE8-457E-9E14-680808EC0972"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"AD377F69-6D6A-413C-B39C-A2874FC1231C","f1_mode":"2C3BDC0D-41D3-4EB0-8294-63DCE538631E","f1_shininess":"A2EAD601-278B-46D3-BE50-1CCD84D8C65C","f1_specular":"099F6815-F834-4135-9735-C2CC5D0C15D6"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"1149FF4A-8255-4995-8F44-3CB8C54CF74F","fragment":"1149FF4A-8255-4995-8F44-3CB8C54CF74F"},{"uuid":"67EE316E-F664-4ECA-B882-C1B84BDD61D4","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":2,"uuid":"E0408BF0-E26F-4FBD-815A-562D58292A3C","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"A64F7EB1-1989-47DD-8949-0A89D888B338","f0_alpha":"D5C3515B-7880-425F-BF9B-06C42A792A0E","f0_mode":"626031E6-FB12-49DD-8BC4-063EA9C72937"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"DA9275BB-C356-4399-B32E-F87B0EA254E5","f1_mode":"E333B26C-9C48-47C7-8088-32EB9A75E8E1","f1_shininess":"F6661F1E-3B5F-4672-8412-D90E747DCCC6","f1_specular":"7F35FE77-F485-4A4B-98A3-11B0ABEA95AE"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"A4A0B558-3CE7-4327-9EE8-B850CAF58992","fragment":"A4A0B558-3CE7-4327-9EE8-B850CAF58992"},{"uuid":"A5A3C657-7996-4927-B570-802AD621A5E6","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":3,"uuid":"8028A7A1-F3AA-4F6D-89E9-502868B5DEF1","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"E35B5B46-1889-4A8E-B193-BF304873AE1A","f0_alpha":"C5C53BC9-F87C-40AF-B796-F07DBDC6EA8D","f0_mode":"EE4E1E03-4D99-4801-B483-61F879611745"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"049E0BAA-1C97-421E-8B4A-0FD616531843","f1_mode":"BE77914A-469F-48AA-A4FF-8F325B68F7B6","f1_shininess":"3E0FB0E5-698F-41E2-A885-23D3361B97AA","f1_specular":"EA551D8C-5767-448D-B279-F3B80FE83D32"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"6EE15D33-773D-4A3E-8FB2-4F258E8B83DC","fragment":"6EE15D33-773D-4A3E-8FB2-4F258E8B83DC"},{"uuid":"ED2A7386-0134-48CB-BF37-CD8D07288A45","type":"ShaderMaterial","transparent":true,"depthFunc":3,"depthTest":true,"depthWrite":true,"colorWrite":true,"stencilWrite":false,"stencilWriteMask":255,"stencilFunc":519,"stencilRef":0,"stencilFuncMask":255,"stencilFail":7680,"stencilZFail":7680,"stencilZPass":7680,"dithering":true,"wireframeLinecap":"","wireframeLinejoin":"","userData":{"type":"PhongMaterial","category":"Phong","nodeType":"PhongNodeMaterial","layers":{"id":2,"uuid":"C92FC012-9BF9-4A1A-A9A2-4E5D374CC55B","head":{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"BFF13516-FD10-4443-84E4-2D77C1357AD5","f0_alpha":"DB1463CC-5CA8-4337-B6A6-6A807220638E","f0_mode":"79BFC1CF-D45C-445F-8B57-3C556574B738"},"next":{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"022DA645-E369-4B57-AA68-0D4732062D09","f1_mode":"F16105B7-A58D-4E6D-B91F-F56648112CAF","f1_shininess":"6CA374EC-4877-4BE5-8CBA-CF6A76FDBB34","f1_specular":"29F0AD4A-5272-4357-8BC6-2A3B66C32CDF"}}}}},"glslVersion":null,"defines":{"PHONG":1},"vertex":"530DD463-5C04-47E2-A484-05F3F488846B","fragment":"530DD463-5C04-47E2-A484-05F3F488846B"}],"interactionStates":[{"uuid":"9CE25592-844A-4CD0-89D3-2BC7A74365C3","name":"Base State","position":[53,-52.749999999999986,2.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":45},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"382EF2C1-B605-4B3A-9490-763DDDAB12E8","f0_alpha":"7C3FAF8B-5B86-498A-AC6C-0C17AD0A88CA","f0_mode":"B9606F81-4A30-4C6D-AA87-CE19B1B8A12C"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"09BB9B51-176D-4D35-9887-B1E81C5FAA53","f1_mode":"9A515F76-C2E1-4FC4-9AA6-9CDF8EDFB5DC"}}]}},{"uuid":"329C221D-8853-4B1A-A245-DEF66009665C","name":"State 1","position":[47.5,-47.249999999999986,0],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":89,"height":89,"depth":40},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"01173A81-A2B8-4B75-A425-D166B754A24F","f0_alpha":"06587453-23CF-49D3-894A-CFA4A4BB0DA5","f0_mode":"EDD4833F-29B0-4CFE-81E1-C6415D67C711"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"32925F30-E0E2-4D0F-A6BB-27CC9CF27B8D","f1_mode":"CFB49D26-5698-4580-AF37-BF314EA84996"}}]}},{"uuid":"6C283F81-B5FA-401A-B187-3E63AAAF84AC","name":"Base State","position":[-53,-52.749999999999986,3],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":44},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"5552E3F9-97FB-4ED8-9919-EE8D62768064","f0_alpha":"855470C8-7CA2-47CC-B5B8-D63F3B6633ED","f0_mode":"B19E8531-F89E-43C2-864E-D6B090BE503A"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"43AE2CCB-1861-4E23-B36F-4D51C8257596","f1_mode":"D58BA42D-75ED-4901-9B84-C9621B0E7D6E"}}]}},{"uuid":"DC47EA21-1332-4687-9D9B-5368BF0A078F","name":"State 1","position":[-56,-55.749999999999986,4],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":106,"height":106,"depth":46},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"055C6DD8-917D-4105-A6CC-55EE208A20FB","f0_alpha":"A48B472A-F90C-41FC-B242-98CF4D3A0415","f0_mode":"67D14EEE-42D1-426A-8DE1-3D53230F4CAB"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"3860F709-DDC1-491C-8EE0-EA32B482F774","f1_mode":"D074712E-D53F-4EB0-B899-87427215974B"}}]}},{"uuid":"3C0A0EFF-AFC9-4BF5-AF7E-E97D2BB42C9D","name":"Base State","position":[53,52.749999999999986,4.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":41},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"51BC96D4-64C2-4E31-95C0-74AE4B5A68BA","f0_alpha":"5129EB5A-DC56-4A3D-990A-942A803B39D7","f0_mode":"F5F497CD-5680-424C-B5D8-3DFA7ED3C109"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"B03F74CC-A350-4C27-9AC4-3EC656E468CA","f1_mode":"09A1BF88-9352-490B-B63D-A6381F039EA3"}}]}},{"uuid":"37732E7B-3E34-4FF9-A072-09F2BBD38DD5","name":"State 1","position":[61.5,61.249999999999986,8],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":117,"height":117,"depth":48},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"36B3DCC2-FE9E-4D2A-BD91-2B56A2DC792D","f0_alpha":"FC1335E9-FE1D-42A5-8581-A5CEF739D897","f0_mode":"4ED84F5A-BF4A-481B-8A51-03A41760E9B3"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"52F18FD2-BE0F-4320-AFCE-70CA0C5449EC","f1_mode":"569C230D-42BF-43DD-A645-AEC43A5A7004"}}]}},{"uuid":"11FF7F14-A2D3-4896-8BA8-76875751A5BD","name":"Base State","position":[-52.00000000000006,52.749999999999986,5.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":100,"height":100,"depth":39},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"311A594B-8A47-41BF-9459-E91E61279F11","f0_alpha":"CEF1A959-724C-49D5-9CB1-B4620D2D5131","f0_mode":"12D012AA-377E-48CE-9FB4-000BE002F0B5"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"F2C8C376-1C75-42E9-86B7-411C0E132572","f1_mode":"0556B66C-70B8-4F26-9055-E8E21FE54454"}}]}},{"uuid":"BC6CBD64-3ACA-46C4-80D4-5CC0A4546356","name":"State 1","position":[-47.00000000000006,47.749999999999986,3.5],"rotation":[0,0,0,"XYZ"],"scale":[1,1,1],"hiddenMatrix":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],"geometry":{"width":90,"height":90,"depth":35},"material":{"layersList":[{"id":0,"type":"color","defines":{},"uniforms":{"f0_color":"CD38CF32-FC41-41A6-8F65-1D13ABC676E3","f0_alpha":"C3FF3DEE-FC7F-4AE3-A660-653E6F0F656A","f0_mode":"2C2F18E9-86CC-4141-AD62-68FF99E86BF3"}},{"id":1,"type":"light","defines":{},"uniforms":{"f1_alpha":"4D0655D7-9FEE-407B-87AF-936812B5FE9A","f1_mode":"45FBA650-C38A-4EAB-B32A-6DE1F6088331"}}]}}],"nodes":[{"uuid":"57D2B157-D884-4E04-9A73-4C9E72515B23","type":"c","r":0.33725490196078434,"g":0.35294117647058826,"b":0.4117647058823529,"value":5659241,"alpha":"196BD431-114A-4D1A-8107-9B8ACA2DA775","nodeType":"Color"},{"uuid":"196BD431-114A-4D1A-8107-9B8ACA2DA775","type":"f","value":1,"nodeType":"Float"},{"uuid":"4CAD73E1-4256-4B40-8E7B-B82662656BD7","type":"i","value":0,"nodeType":"Int"},{"uuid":"A30BF4AB-5DFB-4B14-A267-4A6EC476FB18","type":"f","value":1,"nodeType":"Float"},{"uuid":"6B554DC3-E4DD-4B29-8D93-D26D90F44F0C","type":"i","value":"3","nodeType":"Int"},{"uuid":"D4C97229-A45B-4AA2-954D-07216CD4A2B5","type":"c","r":0,"g":0,"b":0,"value":0,"nodeType":"Color"},{"uuid":"8BCB73A4-FDDD-4E57-9AED-331EAFB6C51E","type":"lambert","color":"57D2B157-D884-4E04-9A73-4C9E72515B23","emissiveIntensity":"EE943729-0A24-45BE-B735-E66B8957ED11","shadingAlpha":"A30BF4AB-5DFB-4B14-A267-4A6EC476FB18","shadingBlend":"6B554DC3-E4DD-4B29-8D93-D26D90F44F0C","alpha":"F51C82D0-6B71-4B80-8D05-A7B6DBCD2CD8","emissive":"D4C97229-A45B-4AA2-954D-07216CD4A2B5","nodeType":"Lambert"},{"uuid":"EE943729-0A24-45BE-B735-E66B8957ED11","type":"f","value":1,"nodeType":"Float"},{"uuid":"F51C82D0-6B71-4B80-8D05-A7B6DBCD2CD8","type":"f","value":1,"nodeType":"Float"},{"uuid":"382EF2C1-B605-4B3A-9490-763DDDAB12E8","type":"c","r":1,"g":0.48627450980392156,"b":0,"value":16743424,"alpha":"7C3FAF8B-5B86-498A-AC6C-0C17AD0A88CA","nodeType":"Color"},{"uuid":"7C3FAF8B-5B86-498A-AC6C-0C17AD0A88CA","type":"f","value":1,"nodeType":"Float"},{"uuid":"B9606F81-4A30-4C6D-AA87-CE19B1B8A12C","type":"i","value":0,"nodeType":"Int"},{"uuid":"09BB9B51-176D-4D35-9887-B1E81C5FAA53","type":"f","value":1,"nodeType":"Float"},{"uuid":"9A515F76-C2E1-4FC4-9AA6-9CDF8EDFB5DC","type":"i","value":"2","nodeType":"Int"},{"uuid":"01173A81-A2B8-4B75-A425-D166B754A24F","type":"c","r":1,"g":0.48627450980392156,"b":0,"value":16743424,"alpha":"06587453-23CF-49D3-894A-CFA4A4BB0DA5","nodeType":"Color"},{"uuid":"06587453-23CF-49D3-894A-CFA4A4BB0DA5","type":"f","value":1,"nodeType":"Float"},{"uuid":"EDD4833F-29B0-4CFE-81E1-C6415D67C711","type":"i","value":0,"nodeType":"Int"},{"uuid":"32925F30-E0E2-4D0F-A6BB-27CC9CF27B8D","type":"f","value":1,"nodeType":"Float"},{"uuid":"CFB49D26-5698-4580-AF37-BF314EA84996","type":"i","value":"2","nodeType":"Int"},{"uuid":"50C9ED49-0E89-4DDC-A335-8424E87AF88C","type":"c","r":1,"g":0.48627450980392156,"b":0,"value":16743424,"alpha":"3EB420B7-0F15-44BC-8A28-944E06F80EF1","nodeType":"Color"},{"uuid":"3EB420B7-0F15-44BC-8A28-944E06F80EF1","type":"f","value":1,"nodeType":"Float"},{"uuid":"1E5F2339-DCE8-457E-9E14-680808EC0972","type":"i","value":0,"nodeType":"Int"},{"uuid":"AD377F69-6D6A-413C-B39C-A2874FC1231C","type":"f","value":1,"nodeType":"Float"},{"uuid":"2C3BDC0D-41D3-4EB0-8294-63DCE538631E","type":"i","value":"2","nodeType":"Int"},{"uuid":"A2EAD601-278B-46D3-BE50-1CCD84D8C65C","type":"f","value":30,"nodeType":"Float"},{"uuid":"099F6815-F834-4135-9735-C2CC5D0C15D6","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"1149FF4A-8255-4995-8F44-3CB8C54CF74F","type":"phong","color":"50C9ED49-0E89-4DDC-A335-8424E87AF88C","specular":"099F6815-F834-4135-9735-C2CC5D0C15D6","shininess":"A2EAD601-278B-46D3-BE50-1CCD84D8C65C","shadingAlpha":"AD377F69-6D6A-413C-B39C-A2874FC1231C","shadingBlend":"2C3BDC0D-41D3-4EB0-8294-63DCE538631E","alpha":"3A5BA0C1-E1ED-4E0A-AEA0-6B9CADFC29C0","nodeType":"Phong"},{"uuid":"3A5BA0C1-E1ED-4E0A-AEA0-6B9CADFC29C0","type":"f","value":1,"nodeType":"Float"},{"uuid":"5552E3F9-97FB-4ED8-9919-EE8D62768064","type":"c","r":0.11764705882352941,"g":0.3215686274509804,"b":1,"value":1987327,"alpha":"855470C8-7CA2-47CC-B5B8-D63F3B6633ED","nodeType":"Color"},{"uuid":"855470C8-7CA2-47CC-B5B8-D63F3B6633ED","type":"f","value":1,"nodeType":"Float"},{"uuid":"B19E8531-F89E-43C2-864E-D6B090BE503A","type":"i","value":0,"nodeType":"Int"},{"uuid":"43AE2CCB-1861-4E23-B36F-4D51C8257596","type":"f","value":1,"nodeType":"Float"},{"uuid":"D58BA42D-75ED-4901-9B84-C9621B0E7D6E","type":"i","value":"2","nodeType":"Int"},{"uuid":"055C6DD8-917D-4105-A6CC-55EE208A20FB","type":"c","r":0.11764705882352941,"g":0.3215686274509804,"b":1,"value":1987327,"alpha":"A48B472A-F90C-41FC-B242-98CF4D3A0415","nodeType":"Color"},{"uuid":"A48B472A-F90C-41FC-B242-98CF4D3A0415","type":"f","value":1,"nodeType":"Float"},{"uuid":"67D14EEE-42D1-426A-8DE1-3D53230F4CAB","type":"i","value":0,"nodeType":"Int"},{"uuid":"3860F709-DDC1-491C-8EE0-EA32B482F774","type":"f","value":1,"nodeType":"Float"},{"uuid":"D074712E-D53F-4EB0-B899-87427215974B","type":"i","value":"2","nodeType":"Int"},{"uuid":"A64F7EB1-1989-47DD-8949-0A89D888B338","type":"c","r":0.11764705882352941,"g":0.3215686274509804,"b":1,"value":1987327,"alpha":"D5C3515B-7880-425F-BF9B-06C42A792A0E","nodeType":"Color"},{"uuid":"D5C3515B-7880-425F-BF9B-06C42A792A0E","type":"f","value":1,"nodeType":"Float"},{"uuid":"626031E6-FB12-49DD-8BC4-063EA9C72937","type":"i","value":0,"nodeType":"Int"},{"uuid":"DA9275BB-C356-4399-B32E-F87B0EA254E5","type":"f","value":1,"nodeType":"Float"},{"uuid":"E333B26C-9C48-47C7-8088-32EB9A75E8E1","type":"i","value":"2","nodeType":"Int"},{"uuid":"F6661F1E-3B5F-4672-8412-D90E747DCCC6","type":"f","value":30,"nodeType":"Float"},{"uuid":"7F35FE77-F485-4A4B-98A3-11B0ABEA95AE","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"A4A0B558-3CE7-4327-9EE8-B850CAF58992","type":"phong","color":"A64F7EB1-1989-47DD-8949-0A89D888B338","specular":"7F35FE77-F485-4A4B-98A3-11B0ABEA95AE","shininess":"F6661F1E-3B5F-4672-8412-D90E747DCCC6","shadingAlpha":"DA9275BB-C356-4399-B32E-F87B0EA254E5","shadingBlend":"E333B26C-9C48-47C7-8088-32EB9A75E8E1","alpha":"9B74DC99-0463-4E5B-B89F-601E2165A6D4","nodeType":"Phong"},{"uuid":"9B74DC99-0463-4E5B-B89F-601E2165A6D4","type":"f","value":1,"nodeType":"Float"},{"uuid":"51BC96D4-64C2-4E31-95C0-74AE4B5A68BA","type":"c","r":0.10980392156862745,"g":0.7490196078431373,"b":0.2196078431372549,"value":1883960,"alpha":"5129EB5A-DC56-4A3D-990A-942A803B39D7","nodeType":"Color"},{"uuid":"5129EB5A-DC56-4A3D-990A-942A803B39D7","type":"f","value":1,"nodeType":"Float"},{"uuid":"F5F497CD-5680-424C-B5D8-3DFA7ED3C109","type":"i","value":0,"nodeType":"Int"},{"uuid":"B03F74CC-A350-4C27-9AC4-3EC656E468CA","type":"f","value":1,"nodeType":"Float"},{"uuid":"09A1BF88-9352-490B-B63D-A6381F039EA3","type":"i","value":"2","nodeType":"Int"},{"uuid":"36B3DCC2-FE9E-4D2A-BD91-2B56A2DC792D","type":"c","r":0.10980392156862745,"g":0.7490196078431373,"b":0.2196078431372549,"value":1883960,"alpha":"FC1335E9-FE1D-42A5-8581-A5CEF739D897","nodeType":"Color"},{"uuid":"FC1335E9-FE1D-42A5-8581-A5CEF739D897","type":"f","value":1,"nodeType":"Float"},{"uuid":"4ED84F5A-BF4A-481B-8A51-03A41760E9B3","type":"i","value":0,"nodeType":"Int"},{"uuid":"52F18FD2-BE0F-4320-AFCE-70CA0C5449EC","type":"f","value":1,"nodeType":"Float"},{"uuid":"569C230D-42BF-43DD-A645-AEC43A5A7004","type":"i","value":"2","nodeType":"Int"},{"uuid":"E35B5B46-1889-4A8E-B193-BF304873AE1A","type":"c","r":0.10980392156862745,"g":0.7490196078431373,"b":0.2196078431372549,"value":1883960,"alpha":"C5C53BC9-F87C-40AF-B796-F07DBDC6EA8D","nodeType":"Color"},{"uuid":"C5C53BC9-F87C-40AF-B796-F07DBDC6EA8D","type":"f","value":1,"nodeType":"Float"},{"uuid":"EE4E1E03-4D99-4801-B483-61F879611745","type":"i","value":0,"nodeType":"Int"},{"uuid":"049E0BAA-1C97-421E-8B4A-0FD616531843","type":"f","value":1,"nodeType":"Float"},{"uuid":"BE77914A-469F-48AA-A4FF-8F325B68F7B6","type":"i","value":"2","nodeType":"Int"},{"uuid":"3E0FB0E5-698F-41E2-A885-23D3361B97AA","type":"f","value":30,"nodeType":"Float"},{"uuid":"EA551D8C-5767-448D-B279-F3B80FE83D32","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"6EE15D33-773D-4A3E-8FB2-4F258E8B83DC","type":"phong","color":"E35B5B46-1889-4A8E-B193-BF304873AE1A","specular":"EA551D8C-5767-448D-B279-F3B80FE83D32","shininess":"3E0FB0E5-698F-41E2-A885-23D3361B97AA","shadingAlpha":"049E0BAA-1C97-421E-8B4A-0FD616531843","shadingBlend":"BE77914A-469F-48AA-A4FF-8F325B68F7B6","alpha":"9BE26472-704D-4E45-B9BB-E7CADD9F8761","nodeType":"Phong"},{"uuid":"9BE26472-704D-4E45-B9BB-E7CADD9F8761","type":"f","value":1,"nodeType":"Float"},{"uuid":"311A594B-8A47-41BF-9459-E91E61279F11","type":"c","r":1,"g":0.24313725490196078,"b":0.24313725490196078,"value":16727614,"alpha":"CEF1A959-724C-49D5-9CB1-B4620D2D5131","nodeType":"Color"},{"uuid":"CEF1A959-724C-49D5-9CB1-B4620D2D5131","type":"f","value":1,"nodeType":"Float"},{"uuid":"12D012AA-377E-48CE-9FB4-000BE002F0B5","type":"i","value":0,"nodeType":"Int"},{"uuid":"F2C8C376-1C75-42E9-86B7-411C0E132572","type":"f","value":1,"nodeType":"Float"},{"uuid":"0556B66C-70B8-4F26-9055-E8E21FE54454","type":"i","value":"2","nodeType":"Int"},{"uuid":"CD38CF32-FC41-41A6-8F65-1D13ABC676E3","type":"c","r":1,"g":0.24313725490196078,"b":0.24313725490196078,"value":16727614,"alpha":"C3FF3DEE-FC7F-4AE3-A660-653E6F0F656A","nodeType":"Color"},{"uuid":"C3FF3DEE-FC7F-4AE3-A660-653E6F0F656A","type":"f","value":1,"nodeType":"Float"},{"uuid":"2C2F18E9-86CC-4141-AD62-68FF99E86BF3","type":"i","value":0,"nodeType":"Int"},{"uuid":"4D0655D7-9FEE-407B-87AF-936812B5FE9A","type":"f","value":1,"nodeType":"Float"},{"uuid":"45FBA650-C38A-4EAB-B32A-6DE1F6088331","type":"i","value":"2","nodeType":"Int"},{"uuid":"BFF13516-FD10-4443-84E4-2D77C1357AD5","type":"c","r":1,"g":0.24313725490196078,"b":0.24313725490196078,"value":16727614,"alpha":"DB1463CC-5CA8-4337-B6A6-6A807220638E","nodeType":"Color"},{"uuid":"DB1463CC-5CA8-4337-B6A6-6A807220638E","type":"f","value":1,"nodeType":"Float"},{"uuid":"79BFC1CF-D45C-445F-8B57-3C556574B738","type":"i","value":0,"nodeType":"Int"},{"uuid":"022DA645-E369-4B57-AA68-0D4732062D09","type":"f","value":1,"nodeType":"Float"},{"uuid":"F16105B7-A58D-4E6D-B91F-F56648112CAF","type":"i","value":"2","nodeType":"Int"},{"uuid":"6CA374EC-4877-4BE5-8CBA-CF6A76FDBB34","type":"f","value":30,"nodeType":"Float"},{"uuid":"29F0AD4A-5272-4357-8BC6-2A3B66C32CDF","type":"c","r":0.06666666666666667,"g":0.06666666666666667,"b":0.06666666666666667,"value":1118481,"nodeType":"Color"},{"uuid":"530DD463-5C04-47E2-A484-05F3F488846B","type":"phong","color":"BFF13516-FD10-4443-84E4-2D77C1357AD5","specular":"29F0AD4A-5272-4357-8BC6-2A3B66C32CDF","shininess":"6CA374EC-4877-4BE5-8CBA-CF6A76FDBB34","shadingAlpha":"022DA645-E369-4B57-AA68-0D4732062D09","shadingBlend":"F16105B7-A58D-4E6D-B91F-F56648112CAF","alpha":"FF2EDB83-BE2E-4F41-9E0C-B9ED14EEEDA6","nodeType":"Phong"},{"uuid":"FF2EDB83-BE2E-4F41-9E0C-B9ED14EEEDA6","type":"f","value":1,"nodeType":"Float"}],"frames":{"currentId":"default-frame-id","coords":[0,0],"frames":{"default-frame-id":{"id":"default-frame-id","name":"Frame","preset":"crop","size":[438,396],"coords":[0,0],"editorScale":1,"backgroundColor":{"r":255,"g":218,"b":195,"a":0},"color":{"r":0,"g":0,"b":0,"a":0.5},"guides":true,"hasSceneScaling":false,"sceneScale":1}}},"assets":{"materials":{}},"editor":{"orbitControls":{"useKeyEvents":false,"enableDamping":true,"enablePan":false,"enableZoom":false,"enableRotate":false,"rotationLimitsMode":0,"rotationVerticalOffset":{"min":1.5707963267948966,"max":1.5707963267948966},"rotationHorizontalOffset":{"min":1.5707963267948966,"max":1.5707963267948966},"autoRotate":false,"autoRotateSpeed":2,"autoRotateClockwise":true},"helperState":true,"publish":{"type":2,"web":{"logo":true}},"settings":{"wireframe":false,"helpers":true}}} \ No newline at end of file diff --git a/src/components/file/FileList.tsx b/src/components/file/FileList.tsx index 19b37bce3..705719479 100644 --- a/src/components/file/FileList.tsx +++ b/src/components/file/FileList.tsx @@ -5,7 +5,13 @@ import { IFile } from '../../types'; import byteSize from 'pretty-bytes'; import { useKey } from 'rooks'; import { invoke } from '@tauri-apps/api'; -import { useExplorerStore } from '../../store/explorer'; +import { + useCurrentDir, + useExplorerStore, + useFile, + useSelectedFile, + useSelectedFileIndex +} from '../../store/explorer'; import { DirectoryResponse } from '../../screens/Explorer'; interface Column { @@ -14,13 +20,6 @@ interface Column { width: number; } -function renderIcon(dirHash: string, path: string, rowIndex: number) { - const setIconForFile = useExplorerStore.getState().setIconForFile; - invoke('get_file_thumb', { path }).then((imageData) => { - if (dirHash) setIconForFile(dirHash, rowIndex, imageData as string); - }); -} - // Function ensure no types are loss, but guarantees that they are Column[] function ensureIsColumns(data: T) { return data; @@ -40,38 +39,20 @@ export const FileList: React.FC<{}> = (props) => { const scrollContainer = useRef(null); const [rowHeight, setRowHeight] = useState(0); // const [selectedRow, setSelectedRow] = useState(0); - const [currentDir, activeDirHash, collectDir, selectedRow, setSelectedRow] = useExplorerStore( - (state) => [ - state.dirs[state.activeDirHash], - state.activeDirHash, - state.collectDir, - state.selected, - state.setSelected - ] - ); + const currentDir = useCurrentDir(); + console.log({ currentDir }); + + if (!currentDir) return <>; + + const explorer = useExplorerStore.getState(); useKey('ArrowUp', (e) => { e.preventDefault(); - if (!selectedRow || !currentDir?.children) return; - if (selectedRow?.index > 0) { - const nextRowIndex = selectedRow.index - 1; - const row = currentDir.children[selectedRow.index - 1]; - setSelectedRow(nextRowIndex, row); - if (!row.icon_b64) renderIcon(activeDirHash, row.uri, nextRowIndex); - } - // loop to bottom - else setSelectedRow(currentDir.children_count, currentDir.children[currentDir.children_count]); + if (explorer.selectedFile) explorer.selectFile(currentDir.id, explorer.selectedFile, 'above'); }); useKey('ArrowDown', (e) => { e.preventDefault(); - if (!selectedRow || !currentDir?.children) return; - // increment if rows below exist - if (selectedRow.index < currentDir.children_count) { - const nextRowIndex = selectedRow.index + 1; - const row = currentDir.children[selectedRow.index + 1]; - setSelectedRow(nextRowIndex, row); - if (!row.icon_b64) renderIcon(activeDirHash, row.uri, nextRowIndex); - } else setSelectedRow(0, currentDir.children[0]); + if (explorer.selectedFile) explorer.selectFile(currentDir.id, explorer.selectedFile, 'below'); }); function isRowOutOfView(rowHeight: number, rowIndex: number) { @@ -80,58 +61,48 @@ export const FileList: React.FC<{}> = (props) => { function handleScroll() {} - return useMemo( - () => ( -
-
-
- {columns.map((col) => ( -
- - {col.column} -
- ))} -
-
-
- {currentDir?.children?.map((row, index) => ( - + return ( +
+
+
+ {columns.map((col) => ( +
+ + {col.column} +
))}
- ), - [activeDirHash] +
+ {currentDir?.children?.map((row, index) => ( + + ))} +
+
); }; -const RenderRow: React.FC<{ row: IFile; rowIndex: number; dirId: string }> = ({ +const RenderRow: React.FC<{ row: IFile; rowIndex: number; dirId: number }> = ({ row, rowIndex, dirId }) => { - const [setIconForFile] = useExplorerStore((state) => [state.setIconForFile]); + const selectedFileIndex = useSelectedFileIndex(dirId); - const [collectDir, selectedRow, setSelectedRow] = useExplorerStore((state) => [ - state.collectDir, - state.selected, - state.setSelected - ]); - - const isActive = selectedRow?.index === rowIndex; + const isActive = selectedFileIndex === rowIndex; const isAlternate = rowIndex % 2 == 0; function selectFile() { - if (!row.icon_b64) renderIcon(dirId, row.uri, rowIndex); - if (selectedRow?.index == rowIndex) setSelectedRow(null); - else setSelectedRow(rowIndex, row); + if (selectedFileIndex == rowIndex) useExplorerStore.getState().clearSelectedFiles(); + else useExplorerStore.getState().selectFile(dirId, row.id); } return useMemo( @@ -141,7 +112,7 @@ const RenderRow: React.FC<{ row: IFile; rowIndex: number; dirId: string }> = ({ onDoubleClick={() => { if (row.is_dir) { invoke('get_files', { path: row.uri }).then((res) => { - collectDir(res.directory, res.contents); + useExplorerStore.getState().ingestDir(res.directory, res.contents); }); } }} @@ -156,7 +127,7 @@ const RenderRow: React.FC<{ row: IFile; rowIndex: number; dirId: string }> = ({ className="table-body-cell px-4 py-2 flex items-center pr-2" style={{ width: col.width }} > - +
))}
@@ -165,13 +136,13 @@ const RenderRow: React.FC<{ row: IFile; rowIndex: number; dirId: string }> = ({ ); }; -const RenderCell: React.FC<{ colKey?: ColumnKey; dirHash?: string; rowIndex?: number }> = ({ +const RenderCell: React.FC<{ colKey?: ColumnKey; dirId?: number; fileId?: number }> = ({ colKey, - rowIndex, - dirHash + fileId, + dirId }) => { - if (!rowIndex || !colKey || !dirHash) return <>; - const [row] = useExplorerStore((state) => [state.dirs[dirHash].children?.[rowIndex]]); + if (!fileId || !colKey || !dirId) return <>; + const row = useFile(fileId); if (!row) return <>; const value = row[colKey]; if (!value) return <>; @@ -180,9 +151,11 @@ const RenderCell: React.FC<{ colKey?: ColumnKey; dirHash?: string; rowIndex?: nu case 'name': return (
- {!!row?.icon_b64 && ( - - )} +
+ {!!row?.icon_b64 && ( + + )} +
{/* {colKey == 'name' && (() => { switch (row.extension.toLowerCase()) { diff --git a/src/components/file/Inspector.tsx b/src/components/file/Inspector.tsx index a0738cd95..e3969adeb 100644 --- a/src/components/file/Inspector.tsx +++ b/src/components/file/Inspector.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import { useExplorerStore } from '../../store/explorer'; +import { useExplorerStore, useSelectedFile } from '../../store/explorer'; import { Transition } from '@headlessui/react'; +import { IFile } from '../../types'; interface MetaItemProps { title: string; @@ -19,10 +20,12 @@ const MetaItem = (props: MetaItemProps) => { const Divider = () =>
; export const Inspector = () => { - const [selectedFile] = useExplorerStore((state) => [state.selected?.file]); + const selectedFile = useSelectedFile(); const isOpen = !!selectedFile; + const file = selectedFile; + return ( {
- {!!selectedFile?.icon_b64 && ( - + {!!file?.icon_b64 && ( + )}
-

{selectedFile?.name}

- +

{file?.name}

+ - +
diff --git a/src/components/layout/TopBar.tsx b/src/components/layout/TopBar.tsx index c2ea8de28..db876d342 100644 --- a/src/components/layout/TopBar.tsx +++ b/src/components/layout/TopBar.tsx @@ -18,6 +18,7 @@ import { TrafficLights } from '../os/TrafficLights'; import { Button, ButtonProps, Input } from '../primative'; import { Shortcut } from '../primative/Shortcut'; import { DefaultProps } from '../primative/types'; +import { appWindow } from '@tauri-apps/api/window'; export interface TopBarProps extends DefaultProps {} export interface TopBarButtonProps extends ButtonProps { @@ -33,12 +34,12 @@ const TopBarButton: React.FC = ({ icon: Icon, ...props }) =>
diff --git a/src/components/os/trafficLights.tsx b/src/components/os/trafficLights.tsx index 02529979b..d2ccf7b2b 100644 --- a/src/components/os/trafficLights.tsx +++ b/src/components/os/trafficLights.tsx @@ -26,7 +26,8 @@ interface LightProps { const Light: React.FC = (props) => { return (
{ + listen('message', (e: Event) => { + console.log({ e }); + + switch (e.payload?.kind) { + case 'FileTypeThumb': + useExplorerStore + .getState() + .tempInjectThumb(e.payload.data.file_id, e.payload.data.thumbnail_b64); + break; + + default: + break; + } + }); + }, []); +} diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 000000000..ac9b506c9 --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1 @@ +declare module 'react-spline'; diff --git a/src/screens/Explorer.tsx b/src/screens/Explorer.tsx index c01ff2922..860da7714 100644 --- a/src/screens/Explorer.tsx +++ b/src/screens/Explorer.tsx @@ -12,21 +12,17 @@ export interface DirectoryResponse { } export const ExplorerScreen: React.FC<{}> = () => { - const [activeDirHash, collectDir] = useExplorerStore((state) => [ - state.activeDirHash, - state.collectDir - ]); + const [currentDir] = useExplorerStore((state) => [state.currentDir]); useEffect(() => { - invoke('get_files', { path: '/Users/jamie/Downloads/CoolFolder' }).then( - (res) => { - console.log({ res }); - collectDir(res.directory, res.contents); - } - ); + invoke('get_files', { path: '/Users/jamie/Downloads' }).then((res) => { + console.log({ res }); + useExplorerStore.getState().ingestDir(res.directory, res.contents); + invoke('get_thumbs_for_directory', { path: '/Users/jamie/Downloads' }); + }); }, []); - if (!activeDirHash) return <>; + if (currentDir === null) return <>; return (
diff --git a/src/screens/Settings.tsx b/src/screens/Settings.tsx index 95c5b366c..250d69e80 100644 --- a/src/screens/Settings.tsx +++ b/src/screens/Settings.tsx @@ -9,15 +9,24 @@ import { Dropdown } from '../components/primative/Dropdown'; import { InputContainer } from '../components/primative/InputContainer'; import { Shortcut } from '../components/primative/Shortcut'; import { useInputState } from '../hooks/useInputState'; +//@ts-ignore +// import { Spline } from 'react-spline'; +// import WINDOWS_SCENE from '../assets/spline/scene.json'; export const SettingsScreen: React.FC<{}> = () => { const fileUploader = useRef(null); - const inputState = useInputState('/Users/jamie/Downloads'); + const inputState = useInputState('/Users/jamie/Downloads/CoolFolder'); return (
-
+
{/* */} + {/* */} + {/* */}
= () => { > - - -
-
+
- -
-
- -
+
diff --git a/src/store/Debug.tsx b/src/store/Debug.tsx new file mode 100644 index 000000000..97a0f6758 --- /dev/null +++ b/src/store/Debug.tsx @@ -0,0 +1,7 @@ +import React from 'react'; +import { useExplorerStore } from './explorer'; + +export function DebugGlobalStore() { + useExplorerStore(); + return <>; +} diff --git a/src/store/explorer.ts b/src/store/explorer.ts deleted file mode 100644 index c897442cb..000000000 --- a/src/store/explorer.ts +++ /dev/null @@ -1,63 +0,0 @@ -import create from 'zustand'; -import { IDirectory, IFile } from '../types'; -import produce from 'immer'; - -interface ExplorerStore { - dirs: Record; - activeDirHash: string; - history: string[]; - selected: null | { index: number; file: IFile }; - collectDir: (dirHash: IFile, files: IFile[]) => void; - currentDir?: () => IFile[]; - setSelected: (index: number | null, file?: IFile) => void; - goBack: () => void; - setIconForFile: (dirId: string, fileIndex: number, b64: string) => void; -} - -export const useExplorerStore = create((set, get) => ({ - dirs: {}, - activeDirHash: '', - history: [], - selected: null, - collectDir: (directory, files) => { - set((state) => - produce(state, (draft) => { - draft.history.push(directory.meta_checksum); - draft.activeDirHash = directory.meta_checksum; - draft.dirs[directory.meta_checksum] = { - children: files, - children_count: files.length, - ...directory - }; - }) - ); - }, - goBack: () => { - if (get().history.length > 1) { - set((state) => - produce(state, (draft) => { - draft.history.pop(); - draft.activeDirHash = draft.history[draft.history.length - 1]; - }) - ); - } - }, - setIconForFile: (dirId: string, fileIndex: number, b64: string) => { - set((state) => - produce(state, (draft) => { - console.log({ dirId, fileIndex, b64: b64?.slice(1, 50) }); - const dir = draft.dirs[dirId]; - const file = dir.children?.[fileIndex]; - if (file) { - file.icon_b64 = b64; - } - }) - ); - }, - setSelected: (index?: number | null, file?: IFile) => - set((state) => - produce(state, (draft) => { - draft.selected = !index || !file ? null : { index, file }; - }) - ) -})); diff --git a/src/store/explorer.tsx b/src/store/explorer.tsx new file mode 100644 index 000000000..a58c3cb7b --- /dev/null +++ b/src/store/explorer.tsx @@ -0,0 +1,146 @@ +import create from 'zustand'; +import { IDirectory, IFile } from '../types'; +import produce from 'immer'; + +interface ExplorerStore { + // storage + files: Record; + // indexes + dirs: Record; + // ingest + ingestDir: (dir: IFile, children: IFile[]) => void; + // selection + selectedFile: number | null; + selectedFiles: number[]; + selectedFilesHistory: string[][]; + selectFile: (dirId: number, fileId: number, type?: 'below' | 'above') => void; + clearSelectedFiles: () => void; + // selectAnotherFile?: (fileId: number) => void; + // selectFilesBetween?: (firstFileId: number, secondFileId: number) => void; + // explorer state + currentDir: number | null; + dirHistory: number[]; + goBack?: () => void; + goForward?: () => void; + + tempInjectThumb: (fileId: number, b64: string) => void; +} + +export const useExplorerStore = create((set, get) => ({ + files: {}, + dirs: {}, + selectedFile: null, + selectedFiles: [], + selectedFilesHistory: [], + currentDir: null, + dirHistory: [], + + ingestDir: (dir, children) => { + set((state) => + produce(state, (draft) => { + draft.files[dir.id] = dir; + // extract directory index of file ids + draft.dirs[dir.id] = children.map((file) => file.id); + // save files by id + for (const index in children) { + const child = children[index]; + draft.files[child.id] = child; + } + // if this dir in the history stack, remove history since then + const existingDirHistoryIndex = draft.dirHistory.findIndex((i) => i === dir.id); + if (existingDirHistoryIndex != -1) { + draft.dirHistory.splice(existingDirHistoryIndex); + } + // push onto history stack + draft.dirHistory.push(dir.id); + + draft.currentDir = dir.id; + }) + ); + }, + goBack: () => { + set((state) => + produce(state, (draft) => { + const prevDirId = draft.dirHistory[draft.dirHistory.length - 2]; + if (prevDirId == undefined) return; + draft.currentDir = prevDirId; + }) + ); + }, + goForward: () => { + set((state) => + produce(state, (draft) => { + const nextDirId = draft.dirHistory[draft.dirHistory.length]; + if (nextDirId == undefined) return; + draft.currentDir = nextDirId; + }) + ); + }, + selectFile: (dirId, fileId, type) => { + set((state) => + produce(state, (draft) => { + if (!draft.files[fileId]) return; + if (!type) { + draft.selectedFile = fileId; + } + // this is the logic for up / down movement on selected file + const dirIndex = draft.dirs[dirId]; + const maxIndex = dirIndex.length - 1; + const activeIndex = dirIndex.findIndex((i) => i === fileId); + switch (type) { + case 'above': + if (activeIndex - 1 < 0) draft.selectedFile = dirIndex[maxIndex]; + else draft.selectedFile = dirIndex[activeIndex - 1]; + break; + case 'below': + if (activeIndex + 1 > maxIndex) draft.selectedFile = dirIndex[0]; + else draft.selectedFile = dirIndex[activeIndex + 1]; + break; + } + }) + ); + }, + clearSelectedFiles: () => { + set((state) => + produce(state, (draft) => { + draft.selectedFile = null; + }) + ); + }, + tempInjectThumb: (fileId: number, b64: string) => { + set((state) => + produce(state, (draft) => { + if (!draft.files[fileId]) return; + draft.files[fileId].icon_b64 = b64; + }) + ); + } +})); + +export function useSelectedFile(): null | IFile { + const [file] = useExplorerStore((state) => [state.files[state.selectedFile || -1]]); + return file; +} + +export function useSelectedFileIndex(dirId: number): null | number { + return useExplorerStore((state) => + state.dirs[dirId].findIndex((i) => i === state.files[state.selectedFile || -1]?.id) + ); +} + +export function useFile(fileId: number): null | IFile { + return useExplorerStore((state) => state.files[fileId || -1]); +} + +export function useCurrentDir(): IDirectory | null { + return useExplorerStore((state) => { + const children = state.dirs[state.currentDir || -1].map((id) => state.files[id]); + const directory = state.files[state.currentDir || -1]; + + return { + ...directory, + children, + children_count: children.length + }; + }); +} diff --git a/src/types/filesystem.ts b/src/types/filesystem.ts index ba8794875..692eefc03 100644 --- a/src/types/filesystem.ts +++ b/src/types/filesystem.ts @@ -2,7 +2,7 @@ import { Encryption } from './library'; import { ImageMeta, VideoMeta } from './media'; export interface IFile { - id?: number; + id: number; meta_checksum: string; uri: string; is_dir: string; @@ -22,6 +22,11 @@ export interface IFile { parent_id: string; tags?: ITag[]; + // this state is used to tell the renderer to look in the designated + // folder for this media type + has_native_icon?: boolean; + has_thumb?: boolean; + has_preview_media?: boolean; icon_b64?: string; } diff --git a/yarn-error.log b/yarn-error.log index 372e39e7b..7b2dd821e 100644 --- a/yarn-error.log +++ b/yarn-error.log @@ -1,8 +1,8 @@ Arguments: - /usr/local/bin/node /usr/local/Cellar/yarn/1.22.5/libexec/bin/yarn.js add @types/heroicons -D + /usr/local/bin/node /usr/local/Cellar/yarn/1.22.5/libexec/bin/yarn.js add @types/react-spline PATH: - /Users/jamie/Library/Android/sdk/tools:/Users/jamie/Library/Android/sdk/platform-tools:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Apple/usr/bin:/Users/jamie/.cargo/bin + /Users/jamie/Library/Android/sdk/tools:/Users/jamie/Library/Android/sdk/platform-tools:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Apple/usr/bin:/Users/jamie/Library/Android/sdk/tools:/Users/jamie/Library/Android/sdk/platform-tools:/Users/jamie/.cargo/bin Yarn version: 1.22.5 @@ -14,7 +14,7 @@ Platform: darwin x64 Trace: - Error: https://registry.yarnpkg.com/@types%2fheroicons: Not found + Error: https://registry.yarnpkg.com/@types%2freact-spline: Not found at Request.params.callback [as _callback] (/usr/local/Cellar/yarn/1.22.5/libexec/lib/cli.js:66988:18) at Request.self.callback (/usr/local/Cellar/yarn/1.22.5/libexec/lib/cli.js:140749:22) at Request.emit (events.js:315:20) @@ -36,8 +36,10 @@ npm manifest: "devDependencies": { "@tauri-apps/cli": "^1.0.0-beta.6", "@types/babel-core": "^6.25.7", + "@types/byte-size": "^8.1.0", "@types/react": "^17.0.18", "@types/react-dom": "^17.0.9", + "@types/react-router-dom": "^5.3.1", "@types/tailwindcss": "^2.2.1", "concurrently": "^6.2.1", "prettier": "^2.3.2", @@ -52,22 +54,28 @@ npm manifest: "dependencies": { "@apollo/client": "^3.4.7", "@headlessui/react": "^1.4.0", - "@tailwindcss/forms": "^0.3.3", + "@heroicons/react": "^1.0.4", "@tauri-apps/api": "^1.0.0-beta.5", + "@types/pretty-bytes": "^5.2.0", + "@types/react-table": "^7.7.6", "@vitejs/plugin-react-refresh": "^1.3.6", "autoprefixer": "^9", + "byte-size": "^8.1.0", "clsx": "^1.1.1", - "heroicons": "^1.0.4", - "mobx": "^6.3.3", - "mobx-state-tree": "^5.0.3", + "immer": "^9.0.6", "phosphor-react": "^1.3.1", + "pretty-bytes": "^5.6.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-dropzone": "^11.3.4", "react-router-dom": "^5.2.0", + "react-spline": "^1.2.1", + "react-virtualized": "^9.22.3", + "rooks": "^5.7.1", "tailwindcss": "^2.2.16", "vite": "^2.4.4", - "vite-tsconfig-paths": "^3.3.13" + "vite-tsconfig-paths": "^3.3.13", + "zustand": "^3.5.13" } } @@ -290,6 +298,13 @@ Lockfile: dependencies: regenerator-runtime "^0.13.4" + "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" @@ -337,6 +352,11 @@ Lockfile: resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.4.0.tgz#c6d424d8ab10ac925e4423d7f3cbab02c30d736a" integrity sha512-C+FmBVF6YGvqcEI5fa2dfVbEaXr2RGR6Kw1E5HXIISIZEfsrH/yuCgsjWw5nlRF9vbCxmQ/EKs64GAdKeb8gCw== + "@heroicons/react@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.4.tgz#11847eb2ea5510419d7ada9ff150a33af0ad0863" + integrity sha512-3kOrTmo8+Z8o6AL0rzN82MOf8J5CuxhRLFhpI8mrn+3OqekA6d5eb1GYO3EYYo1Vn6mYQSMNTzCWbEwUInb0cQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -395,13 +415,6 @@ Lockfile: dependencies: defer-to-connect "^2.0.0" - "@tailwindcss/forms@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.3.3.tgz#a29d22668804f3dae293dcadbef1aa6315c45b64" - integrity sha512-U8Fi/gq4mSuaLyLtFISwuDYzPB73YzgozjxOIHsK6NXgg/IWD1FLaHbFlWmurAMyy98O+ao74ksdQefsquBV1Q== - dependencies: - mini-svg-data-uri "^1.2.3" - "@tauri-apps/api@^1.0.0-beta.5": version "1.0.0-beta.5" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.0.0-beta.5.tgz#32727b3b478f67330a79409ceaf16a4a51410fce" @@ -491,6 +504,11 @@ Lockfile: dependencies: "@types/babel-types" "*" + "@types/byte-size@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/byte-size/-/byte-size-8.1.0.tgz#013a3995d1ff2d85ad27da0801029f13328bd91b" + integrity sha512-LCIlZh8vyx+I2fgRycE1D34c33QDppYY6quBYYoaOpQ1nGhJ/avSP2VlrAefVotjJxgSk6WkKo0rTcCJwGG7vA== + "@types/cacheable-request@^6.0.1": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" @@ -501,6 +519,11 @@ Lockfile: "@types/node" "*" "@types/responselike" "*" + "@types/history@*": + version "4.7.9" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" + integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== + "@types/http-cache-semantics@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" @@ -528,6 +551,13 @@ Lockfile: resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/pretty-bytes@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/pretty-bytes/-/pretty-bytes-5.2.0.tgz#857dcf4a21839e5bfb1c188dda62f986fdfa2348" + integrity sha512-dJhMFphDp6CE+OAZVyqzha9KsmgeqRMbZN4dIbMSrfObiuzfjucwKdn6zu+ttrjMwmz+Vz71/xXgHx5pO0axhA== + dependencies: + pretty-bytes "*" + "@types/prop-types@*": version "15.7.4" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" @@ -540,6 +570,30 @@ Lockfile: dependencies: "@types/react" "*" + "@types/react-router-dom@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.1.tgz#76700ccce6529413ec723024b71f01fc77a4a980" + integrity sha512-UvyRy73318QI83haXlaMwmklHHzV9hjl3u71MmM6wYNu0hOVk9NLTa0vGukf8zXUqnwz4O06ig876YSPpeK28A== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + + "@types/react-router@*": + version "5.1.17" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.17.tgz#087091006213b11042f39570e5cd414863693968" + integrity sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ== + dependencies: + "@types/history" "*" + "@types/react" "*" + + "@types/react-table@^7.7.6": + version "7.7.6" + resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.6.tgz#4899ccc46b4a1de08cc1daf120842e37e112e51e" + integrity sha512-ZMFHh1sG5AGDmhVRpz9mgGByGmBFAqnZ7QnyqGa5iAlKtcSC3vb/gul47lM0kJ1uvlawc+qN5k+++pe+GBdJ+g== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^17.0.18": version "17.0.18" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.18.tgz#4109cbbd901be9582e5e39e3d77acd7b66bb7fbe" @@ -892,6 +946,11 @@ Lockfile: base64-js "^1.3.1" ieee754 "^1.1.13" + byte-size@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.0.tgz#6353d0bc14ab7a69abcefbf11f8db0145a862cb5" + integrity sha512-FkgMTAg44I0JtEaUAvuZTtU2a2YDmBRbQxdsQNSMtLCjhG0hMcF5b1IMN9UjSCJaU4nvlj/GER7B9sI4nKdCgA== + bytes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" @@ -1093,7 +1152,7 @@ Lockfile: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - clsx@^1.1.1: + clsx@^1.0.4, clsx@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== @@ -1473,6 +1532,14 @@ Lockfile: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + dom-helpers@^5.1.3: + 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" + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -2065,11 +2132,6 @@ Lockfile: dependencies: function-bind "^1.1.1" - heroicons@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/heroicons/-/heroicons-1.0.4.tgz#58a9c5fafae7185fca79f8b47251484903e4dc0a" - integrity sha512-dn1OvwZruCNEmNDr+TRvG5MejL9kW4VtVQO2Y1yfp7rz0+yWqpkjwwFRTQ8VHBF26oNMMUofQYA+Jl363Y7JdA== - hex-color-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" @@ -2179,6 +2241,11 @@ Lockfile: p-pipe "^4.0.0" replace-ext "^2.0.0" + immer@^9.0.6: + version "9.0.6" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" + integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== + import-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" @@ -2564,6 +2631,11 @@ Lockfile: pinkie-promise "^2.0.0" strip-bom "^2.0.0" + lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.topath@^4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" @@ -2731,11 +2803,6 @@ Lockfile: "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" - mini-svg-data-uri@^1.2.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.3.3.tgz#91d2c09f45e056e5e1043340b8b37ba7b50f4fac" - integrity sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA== - minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2753,16 +2820,6 @@ Lockfile: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - mobx-state-tree@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/mobx-state-tree/-/mobx-state-tree-5.0.3.tgz#f026a26be39ba4ef71e4256b9f27d6176a3b2072" - integrity sha512-68VKZb30bLWN6MFyYvpvwM93VMEqyJLJsbjTDrYmbRAK594n5LJqQXa7N3N00L/WjcujzMtqkT7CcbM0zqTIcA== - - mobx@^6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.3.3.tgz#a3006c56243b1c7ea4ee671a66f963b9f43cf1af" - integrity sha512-JoNU50rO6d1wHwKPJqKq4rmUMbYnI9CsJmBo+Cu4exBYenFvIN77LWrZENpzW6reZPADtXMmB1DicbDSfy8Clw== - modern-normalize@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" @@ -3141,6 +3198,11 @@ Lockfile: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + phosphor-react@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/phosphor-react/-/phosphor-react-1.3.1.tgz#96e33f44370d83cda15b60cccc17087ad0060684" @@ -3291,6 +3353,11 @@ Lockfile: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== + pretty-bytes@*, pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -3364,6 +3431,13 @@ Lockfile: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -3397,6 +3471,11 @@ Lockfile: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + 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-refresh@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3" @@ -3431,6 +3510,25 @@ Lockfile: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" + react-spline@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-spline/-/react-spline-1.2.1.tgz#c074178cf752b1f582fb62af0c330d9a3f5e0099" + integrity sha512-d17gOvoKjWfHmsXm7H1YbK715dDEVuIc72eNcrrpNp7T/H8zH2yfNvk1NSJQSuGchTXaa90hbiGRC3FGpJHMZA== + dependencies: + three "0.123.0" + + react-virtualized@^9.22.3: + version "9.22.3" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" + integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== + dependencies: + "@babel/runtime" "^7.7.2" + clsx "^1.0.4" + dom-helpers "^5.1.3" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.4" + react@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -3656,6 +3754,14 @@ Lockfile: optionalDependencies: fsevents "~2.3.2" + rooks@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/rooks/-/rooks-5.7.1.tgz#a9c91e94e760e21a9df5afc1de4ba07d09a6156d" + integrity sha512-Gztycgm+e+bS0vqLMSGlGe8f7rkXMxjfPj3FucM06/xu1CEFQx1pZ0zMVdWVxDeMXRePaQ2/g1K7ArIlGKyHbQ== + dependencies: + lodash.debounce "^4.0.8" + raf "^3.4.1" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -4147,6 +4253,11 @@ Lockfile: temp-dir "^1.0.0" uuid "^3.0.1" + three@0.123.0: + version "0.123.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.123.0.tgz#3bb6d8f908a432eb7cd450f7eab6dd40fde53085" + integrity sha512-KNnx/IbilvoHRkxOtL0ouozoDoElyuvAXhFB21RK7F5IPWSmqyFelICK6x3hJerLNSlAdHxR0hkuvMMhH9pqXg== + through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4537,3 +4648,8 @@ Lockfile: bin-build "^3.0.0" bin-wrapper "^4.0.1" logalot "^2.1.0" + + zustand@^3.5.13: + version "3.5.13" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.5.13.tgz#fd1af8c14a23ec7efdeb9ab167b8e69a8fc0980a" + integrity sha512-orO/XcYwSWffsrPVTdCtuKM/zkUaOIyKDasOk/lecsD3R0euELsj+cB65uKZ1KyinrK2STHIuUhRoLpH8QprQg== diff --git a/yarn.lock b/yarn.lock index 96d4ecf18..4781cde78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3425,6 +3425,13 @@ react-router@5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" +react-spline@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-spline/-/react-spline-1.2.1.tgz#c074178cf752b1f582fb62af0c330d9a3f5e0099" + integrity sha512-d17gOvoKjWfHmsXm7H1YbK715dDEVuIc72eNcrrpNp7T/H8zH2yfNvk1NSJQSuGchTXaa90hbiGRC3FGpJHMZA== + dependencies: + three "0.123.0" + react-virtualized@^9.22.3: version "9.22.3" resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" @@ -4161,6 +4168,11 @@ tempfile@^2.0.0: temp-dir "^1.0.0" uuid "^3.0.1" +three@0.123.0: + version "0.123.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.123.0.tgz#3bb6d8f908a432eb7cd450f7eab6dd40fde53085" + integrity sha512-KNnx/IbilvoHRkxOtL0ouozoDoElyuvAXhFB21RK7F5IPWSmqyFelICK6x3hJerLNSlAdHxR0hkuvMMhH9pqXg== + through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"