From 36faeae886d73179077f398666b4fda0cf02f6e9 Mon Sep 17 00:00:00 2001 From: Max Richter Date: Thu, 18 Apr 2024 18:39:24 +0200 Subject: [PATCH] feat: implement settings --- app/package.json | 4 + app/src/lib/graph-interface/graph-manager.ts | 40 +- .../lib/graph-interface/graph/Wrapper.svelte | 45 +- app/src/lib/node-registry.ts | 2 +- app/src/lib/runtime-executor.ts | 15 +- app/src/lib/settings/Panel.svelte | 38 + app/src/lib/settings/Settings.svelte | 120 +++ app/src/lib/settings/app-settings.ts | 37 + app/src/lib/stores/settings.ts | 5 - app/src/lib/viewer/Scene.svelte | 9 +- app/src/lib/viewer/Viewer.svelte | 4 - app/src/routes/+layout.svelte | 6 + app/src/routes/+page.svelte | 75 +- app/uno.config.ts | 11 + app/vite.config.ts | 2 + nodes/max/plantarium/array/package.json | 2 +- nodes/max/plantarium/box/package.json | 2 +- nodes/max/plantarium/float/package.json | 2 +- nodes/max/plantarium/math/package.json | 2 +- nodes/max/plantarium/math/src/input.json | 7 +- nodes/max/plantarium/output/package.json | 2 +- nodes/max/plantarium/output/src/inputs.json | 7 + nodes/max/plantarium/output/src/lib.rs | 13 +- nodes/max/plantarium/random/package.json | 2 +- nodes/max/plantarium/stem/package.json | 2 +- nodes/max/plantarium/stem/src/input.json | 6 +- nodes/max/plantarium/stem/src/lib.rs | 17 +- nodes/max/plantarium/sum/package.json | 2 +- packages/types/src/index.ts | 2 +- packages/types/src/inputs.ts | 2 +- packages/types/src/lib.rs | 3 +- packages/ui/src/lib/Input.svelte | 6 +- packages/ui/src/lib/app.css | 2 + packages/ui/src/lib/elements/Checkbox.svelte | 59 +- packages/ui/src/lib/elements/Integer.svelte | 169 +++- packages/ui/src/lib/elements/Select.svelte | 4 +- packages/utils/src/geometry/extrude_path.rs | 6 +- packages/utils/src/lib.rs | 9 + pnpm-lock.yaml | 853 +++++++++++++++++- 39 files changed, 1398 insertions(+), 196 deletions(-) create mode 100644 app/src/lib/settings/Panel.svelte create mode 100644 app/src/lib/settings/Settings.svelte create mode 100644 app/src/lib/settings/app-settings.ts delete mode 100644 app/src/lib/stores/settings.ts create mode 100644 app/uno.config.ts diff --git a/app/package.json b/app/package.json index 48c913d..3eb6395 100644 --- a/app/package.json +++ b/app/package.json @@ -23,17 +23,20 @@ "@threlte/extras": "^8.11.2", "@threlte/flex": "^1.0.2", "@types/three": "^0.163.0", + "@unocss/reset": "^0.59.4", "comlink": "^4.4.1", "jsondiffpatch": "^0.6.0", "three": "^0.163.0" }, "devDependencies": { "@histoire/plugin-svelte": "^0.17.17", + "@iconify-json/tabler": "^1.1.110", "@nodes/types": "link:../packages/types", "@sveltejs/adapter-static": "^3.0.1", "@sveltejs/vite-plugin-svelte": "^3.1.0", "@tauri-apps/cli": "2.0.0-beta.3", "@tsconfig/svelte": "^5.0.4", + "@unocss/preset-icons": "^0.59.4", "@zerodevx/svelte-json-view": "^1.0.9", "histoire": "^0.17.17", "internal-ip": "^8.0.0", @@ -41,6 +44,7 @@ "svelte-check": "^3.6.9", "tslib": "^2.6.2", "typescript": "^5.4.5", + "unocss": "^0.59.4", "vite": "^5.2.9", "vite-plugin-comlink": "^4.0.3", "vite-plugin-glsl": "^1.3.0", diff --git a/app/src/lib/graph-interface/graph-manager.ts b/app/src/lib/graph-interface/graph-manager.ts index 0bde9a4..348d5a5 100644 --- a/app/src/lib/graph-interface/graph-manager.ts +++ b/app/src/lib/graph-interface/graph-manager.ts @@ -1,4 +1,4 @@ -import { get, writable, type Writable } from "svelte/store"; +import { writable, type Writable } from "svelte/store"; import type { Graph, Node, Edge, Socket, NodeRegistry, } from "@nodes/types"; import { HistoryManager } from "./history-manager.js" import EventEmitter from "./helpers/EventEmitter.js"; @@ -15,7 +15,7 @@ function areSocketsCompatible(output: string | undefined, inputs: string | strin return inputs === output; } -export class GraphManager extends EventEmitter<{ "save": Graph, "result": any }> { +export class GraphManager extends EventEmitter<{ "save": Graph, "result": any, "settings": { types: Record, values: Record } }> { status: Writable<"loading" | "idle" | "error"> = writable("loading"); loaded = false; @@ -25,8 +25,8 @@ export class GraphManager extends EventEmitter<{ "save": Graph, "result": any }> private _nodes: Map = new Map(); nodes: Writable> = writable(new Map()); - settingTypes: NodeInput[] = []; - settings: Writable> = writable({}); + settingTypes: Record = {}; + settings: Record = {}; private _edges: Edge[] = []; edges: Writable = writable([]); @@ -61,14 +61,20 @@ export class GraphManager extends EventEmitter<{ "save": Graph, "result": any }> props: node.props, })) as Node[]; const edges = this._edges.map(edge => [edge[0].id, edge[1], edge[2].id, edge[3]]) as Graph["edges"]; - const settings = get(this.settings); - const serialized = { id: this.graph.id, settings, nodes, edges }; - console.log(serialized); + const serialized = { id: this.graph.id, settings: this.settings, nodes, edges }; logger.groupEnd(); return serialized; } + + setSettings(settings: Record) { + this.settings = settings; + this.save(); + this.execute(); + } + + execute() { } _execute() { if (this.loaded === false) return; @@ -157,12 +163,6 @@ export class GraphManager extends EventEmitter<{ "save": Graph, "result": any }> this.status.set("loading"); this.id.set(graph.id); - if (graph.settings) { - this.settings.set(graph.settings); - } else { - this.settings.set({}); - } - const nodeIds = Array.from(new Set([...graph.nodes.map(n => n.type)])); await this.nodeRegistry.load(nodeIds); @@ -178,19 +178,28 @@ export class GraphManager extends EventEmitter<{ "save": Graph, "result": any }> node.tmp.type = nodeType; } - let settings: Record = {}; + + // load settings + const settingTypes: Record = {}; + const settingValues = graph.settings || {}; const types = this.getNodeTypes(); for (const type of types) { if (type.inputs) { for (const key in type.inputs) { let settingId = type.inputs[key].setting; if (settingId) { - settings[settingId] = type.inputs[key]; + settingTypes[settingId] = type.inputs[key]; + if (settingValues[settingId] === undefined && "value" in type.inputs[key]) { + settingValues[settingId] = type.inputs[key].value; + } } } } } + this.settings = settingValues; + this.emit("settings", { types: settingTypes, values: settingValues }); + this.history.reset(); this._init(this.graph); @@ -426,6 +435,7 @@ export class GraphManager extends EventEmitter<{ "save": Graph, "result": any }> save() { if (this.currentUndoGroup) return; const state = this.serialize(); + console.log(state); this.history.save(state); this.emit("save", state); logger.log("saving graphs", state); diff --git a/app/src/lib/graph-interface/graph/Wrapper.svelte b/app/src/lib/graph-interface/graph/Wrapper.svelte index 5c72b3b..0a19e56 100644 --- a/app/src/lib/graph-interface/graph/Wrapper.svelte +++ b/app/src/lib/graph-interface/graph/Wrapper.svelte @@ -1,25 +1,40 @@ diff --git a/app/src/lib/node-registry.ts b/app/src/lib/node-registry.ts index 45d14cb..24b9dc8 100644 --- a/app/src/lib/node-registry.ts +++ b/app/src/lib/node-registry.ts @@ -15,7 +15,7 @@ const nodeTypes: NodeType[] = [ { id: "max/plantarium/math", inputs: { - "op_type": { label: "type", type: "select", labels: ["add", "subtract", "multiply", "divide"], value: 0 }, + "op_type": { label: "type", type: "select", options: ["add", "subtract", "multiply", "divide"], value: 0 }, "a": { type: "float" }, "b": { type: "float" }, }, diff --git a/app/src/lib/runtime-executor.ts b/app/src/lib/runtime-executor.ts index 74f13a4..284d676 100644 --- a/app/src/lib/runtime-executor.ts +++ b/app/src/lib/runtime-executor.ts @@ -89,7 +89,7 @@ export class MemoryRuntimeExecutor implements RuntimeExecutor { return [outputNode, nodes] as const; } - execute(graph: Graph) { + execute(graph: Graph, settings: Record) { // Then we add some metadata to the graph const [outputNode, nodes] = this.addMetaData(graph); @@ -124,6 +124,19 @@ export class MemoryRuntimeExecutor implements RuntimeExecutor { continue; } + if (input.setting) { + if (settings[input.setting] === undefined) { + if (input.value !== undefined) { + inputs[key] = input.value; + } else { + console.warn(`Setting ${input.setting} is not defined`); + } + } else { + inputs[key] = settings[input.setting] as number; + } + continue; + } + // check if the input is connected to another node const inputNode = node.tmp.inputNodes?.[key]; if (inputNode) { diff --git a/app/src/lib/settings/Panel.svelte b/app/src/lib/settings/Panel.svelte new file mode 100644 index 0000000..3935552 --- /dev/null +++ b/app/src/lib/settings/Panel.svelte @@ -0,0 +1,38 @@ + + +
+

{setting.id}

+ {#each keys as key} +
+ {#if setting.definition && key in setting.definition} + + {/if} + +
+ {/each} +
diff --git a/app/src/lib/settings/Settings.svelte b/app/src/lib/settings/Settings.svelte new file mode 100644 index 0000000..53e3732 --- /dev/null +++ b/app/src/lib/settings/Settings.svelte @@ -0,0 +1,120 @@ + + +
+
+ + {#each keys as panel (settings[panel].id)} + + {/each} +
+
+ {#if $activePanel && settings[$activePanel]} + {#key $activePanel} + + {/key} + {/if} +
+
+ + diff --git a/app/src/lib/settings/app-settings.ts b/app/src/lib/settings/app-settings.ts new file mode 100644 index 0000000..8266cc5 --- /dev/null +++ b/app/src/lib/settings/app-settings.ts @@ -0,0 +1,37 @@ +import localStore from "$lib/helpers/localStore"; + +export const AppSettings = localStore("node-settings", { + theme: 0, + showGrid: true, + wireframes: false, + showIndices: false, +}); + +AppSettings.subscribe((value) => { + if (value.theme === 0) { + document.body.classList.remove("theme-catppuccin"); + } else { + document.body.classList.add("theme-catppuccin"); + } +}); + +export const AppSettingTypes = { + theme: { + type: "select", + options: ["dark", "cat"], + value: "dark", + }, + showGrid: { + type: "boolean", + value: true, + }, + wireframe: { + type: "boolean", + value: false, + }, + showIndices: { + type: "boolean", + value: false, + }, +} + diff --git a/app/src/lib/stores/settings.ts b/app/src/lib/stores/settings.ts deleted file mode 100644 index 4d2e99f..0000000 --- a/app/src/lib/stores/settings.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { writable } from "svelte/store"; - -export const settings = writable({ - useHtml: false -}); diff --git a/app/src/lib/viewer/Scene.svelte b/app/src/lib/viewer/Scene.svelte index 2e81e0d..d210b6e 100644 --- a/app/src/lib/viewer/Scene.svelte +++ b/app/src/lib/viewer/Scene.svelte @@ -3,6 +3,7 @@ import { Text } from "@threlte/extras"; import type { BufferGeometry } from "three"; import { OrbitControls } from "@threlte/extras"; + import { AppSettings } from "../settings/app-settings"; export let geometry: BufferGeometry[]; @@ -16,7 +17,9 @@ } - +{#if $AppSettings.showGrid} + +{/if} @@ -26,7 +29,7 @@ {#each geometry as geo} - {#if false} + {#if $AppSettings.showIndices} {#each geo.attributes.position.array as _, i} {#if i % 3 === 0} @@ -39,6 +42,6 @@ {/if} - + {/each} diff --git a/app/src/lib/viewer/Viewer.svelte b/app/src/lib/viewer/Viewer.svelte index 5eddfdc..a844966 100644 --- a/app/src/lib/viewer/Viewer.svelte +++ b/app/src/lib/viewer/Viewer.svelte @@ -38,8 +38,6 @@ ); index = index + vertexCount * 3; - console.log({ vertices, normals, indices }); - // Add data to geometry geometry.setIndex([...indices]); geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); @@ -95,8 +93,6 @@ $: if (result) { const inputs = parse_args(result); - console.log({ inputs }); - geometries = inputs .map((input) => { if (input[0] === 1) { diff --git a/app/src/routes/+layout.svelte b/app/src/routes/+layout.svelte index 343fca9..d92b1e7 100644 --- a/app/src/routes/+layout.svelte +++ b/app/src/routes/+layout.svelte @@ -1,5 +1,11 @@ + +{#if false} + +{/if} diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte index 4a1d69d..b880e08 100644 --- a/app/src/routes/+page.svelte +++ b/app/src/routes/+page.svelte @@ -5,48 +5,10 @@ import { RemoteNodeRegistry } from "$lib/node-registry"; import * as templates from "$lib/graph-templates"; import type { Graph } from "@nodes/types"; - import { decode, encode, decodeFloat, encodeFloat } from "@nodes/utils"; import Viewer from "$lib/viewer/Viewer.svelte"; - - globalThis.decode = decode; - globalThis.encode = encode; - globalThis.df = decodeFloat; - globalThis.en = encodeFloat; - - globalThis.ci = function createIndeces(resX: number, stemLength = 1) { - const index = new Uint16Array(resX * (Math.max(stemLength, 1) - 1) * 6); - - for (let i = 0; i < stemLength; i++) { - const indexOffset = i * resX * 6; - const positionOffset = i * resX; - for (let j = 0; j < resX; j++) { - const _indexOffset = indexOffset + j * 6; - const _positionOffset = positionOffset + j; - - console.log(`iio: ${_indexOffset} pio: ${_positionOffset} j: ${j}`); - - if (j === resX - 1) { - index[_indexOffset + 0] = _positionOffset + 1; - index[_indexOffset + 1] = _positionOffset - resX + 1; - index[_indexOffset + 2] = _positionOffset; - - index[_indexOffset + 3] = _positionOffset; - index[_indexOffset + 4] = _positionOffset + resX; - index[_indexOffset + 5] = _positionOffset + 1; - } else { - index[_indexOffset + 0] = _positionOffset + resX + 1; - index[_indexOffset + 1] = _positionOffset + 1; - index[_indexOffset + 2] = _positionOffset; - - index[_indexOffset + 3] = _positionOffset; - index[_indexOffset + 4] = _positionOffset + resX; - index[_indexOffset + 5] = _positionOffset + resX + 1; - } - } - } - - return index; - }; + import Settings from "$lib/settings/Settings.svelte"; + import { AppSettings, AppSettingTypes } from "$lib/settings/app-settings"; + import { get, writable } from "svelte/store"; const nodeRegistry = new RemoteNodeRegistry("http://localhost:3001"); const runtimeExecutor = new MemoryRuntimeExecutor(nodeRegistry); @@ -60,7 +22,7 @@ function handleResult(event: CustomEvent) { let a = performance.now(); - res = runtimeExecutor.execute(event.detail); + res = runtimeExecutor.execute(event.detail, get(settings?.graph?.settings)); time = performance.now() - a; console.log({ res, time }); } @@ -68,6 +30,32 @@ function handleSave(event: CustomEvent) { localStorage.setItem("graph", JSON.stringify(event.detail)); } + + let settings: Record = { + general: { + id: "general", + icon: "i-tabler-settings", + settings: AppSettings, + definition: AppSettingTypes, + }, + }; + + function handleSettings( + ev: CustomEvent<{ + values: Record; + types: Record; + }>, + ) { + settings = { + ...settings, + graph: { + icon: "i-tabler-chart-bar", + id: "graph", + settings: writable(ev.detail.values), + definition: ev.detail.types, + }, + }; + }
@@ -88,9 +76,12 @@ + {/key} diff --git a/app/uno.config.ts b/app/uno.config.ts new file mode 100644 index 0000000..0dd1a89 --- /dev/null +++ b/app/uno.config.ts @@ -0,0 +1,11 @@ +// uno.config.ts +import { defineConfig } from 'unocss' +import presetIcons from '@unocss/preset-icons' +import { presetUno } from 'unocss' + +export default defineConfig({ + presets: [ + presetUno(), + presetIcons(), + ] +}) diff --git a/app/vite.config.ts b/app/vite.config.ts index 3835e20..b75357e 100644 --- a/app/vite.config.ts +++ b/app/vite.config.ts @@ -3,10 +3,12 @@ import { defineConfig } from 'vite' import glsl from "vite-plugin-glsl"; import wasm from "vite-plugin-wasm"; import comlink from 'vite-plugin-comlink'; +import UnoCSS from 'unocss/vite' export default defineConfig({ plugins: [ comlink(), + UnoCSS(), sveltekit(), glsl(), wasm() diff --git a/nodes/max/plantarium/array/package.json b/nodes/max/plantarium/array/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/array/package.json +++ b/nodes/max/plantarium/array/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/box/package.json b/nodes/max/plantarium/box/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/box/package.json +++ b/nodes/max/plantarium/box/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/float/package.json b/nodes/max/plantarium/float/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/float/package.json +++ b/nodes/max/plantarium/float/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/math/package.json b/nodes/max/plantarium/math/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/math/package.json +++ b/nodes/max/plantarium/math/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/math/src/input.json b/nodes/max/plantarium/math/src/input.json index 48d9a2d..c96b601 100644 --- a/nodes/max/plantarium/math/src/input.json +++ b/nodes/max/plantarium/math/src/input.json @@ -6,7 +6,7 @@ "op_type": { "label": "type", "type": "select", - "labels": [ + "options": [ "add", "subtract", "multiply", @@ -22,11 +22,6 @@ "b": { "type": "float", "value": 2 - }, - "clip": { - "type": "boolean", - "value": 0, - "setting": "math.clipping" } } } diff --git a/nodes/max/plantarium/output/package.json b/nodes/max/plantarium/output/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/output/package.json +++ b/nodes/max/plantarium/output/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/output/src/inputs.json b/nodes/max/plantarium/output/src/inputs.json index 8afab95..5b4f74c 100644 --- a/nodes/max/plantarium/output/src/inputs.json +++ b/nodes/max/plantarium/output/src/inputs.json @@ -7,6 +7,13 @@ "model" ], "external": true + }, + "resolution_circle": { + "type": "integer", + "value": 32, + "min": 3, + "max": 64, + "setting": "resolution.circle" } } } diff --git a/nodes/max/plantarium/output/src/lib.rs b/nodes/max/plantarium/output/src/lib.rs index 43f96e4..b80dd6d 100644 --- a/nodes/max/plantarium/output/src/lib.rs +++ b/nodes/max/plantarium/output/src/lib.rs @@ -1,9 +1,9 @@ use glam::{Mat4, Vec3}; use macros::include_definition_file; use utils::{ - concat_args, + concat_args, evaluate_arg, geometry::{extrude_path, transform_geometry}, - get_args, + get_args, log, }; use wasm_bindgen::prelude::*; @@ -15,15 +15,20 @@ pub fn execute(input: Vec) -> Vec { let args = get_args(input.as_slice()); + let inputs = get_args(args[0]); + let resolution = evaluate_arg(args[1]) as usize; + + log!("inputs: {}, resolution: {}", inputs.len(), resolution); + let mut output: Vec> = Vec::new(); - for arg in args { + for arg in inputs { if arg.len() < 3 { continue; } if arg[2] == 0 { let _arg = &arg[3..]; - let mut geometry = extrude_path(_arg, 4); + let mut geometry = extrude_path(_arg, resolution); let matrix = Mat4::from_translation(Vec3::new(0.0, 0.0, 0.0)); geometry = transform_geometry(geometry, matrix); output.push(geometry); diff --git a/nodes/max/plantarium/random/package.json b/nodes/max/plantarium/random/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/random/package.json +++ b/nodes/max/plantarium/random/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/stem/package.json b/nodes/max/plantarium/stem/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/stem/package.json +++ b/nodes/max/plantarium/stem/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/nodes/max/plantarium/stem/src/input.json b/nodes/max/plantarium/stem/src/input.json index a94039d..ab67a7b 100644 --- a/nodes/max/plantarium/stem/src/input.json +++ b/nodes/max/plantarium/stem/src/input.json @@ -21,10 +21,12 @@ "element": "slider", "value": 2 }, - "resolution": { + "resolution_curve": { "type": "integer", "value": 32, - "setting": "resolution.stem" + "min": 3, + "max": 64, + "setting": "resolution.curve" } } } diff --git a/nodes/max/plantarium/stem/src/lib.rs b/nodes/max/plantarium/stem/src/lib.rs index 0b5e367..e608e67 100644 --- a/nodes/max/plantarium/stem/src/lib.rs +++ b/nodes/max/plantarium/stem/src/lib.rs @@ -1,5 +1,5 @@ use macros::include_definition_file; -use utils::{evaluate_float, evaluate_vec3, get_args, log, set_panic_hook, wrap_arg}; +use utils::{evaluate_arg, evaluate_float, evaluate_vec3, get_args, set_panic_hook, wrap_arg}; use wasm_bindgen::prelude::*; include_definition_file!("src/input.json"); @@ -10,18 +10,13 @@ pub fn execute(input: &[i32]) -> Vec { let args = get_args(input); - log!("Args: {:?}", args); - let origin = evaluate_vec3(args[0]); - log!("Origin: {:?}", origin); let length = evaluate_float(args[1]); let thickness = evaluate_float(args[2]); - let resolution = 16; + let res_curve = evaluate_arg(args[3]) as usize; - let mut path: Vec = vec![0; resolution * 4 + 1]; - path.resize(resolution * 4 + 1, 0); - - path[0] = 0; + let mut path: Vec = vec![0; res_curve * 4 + 1]; + path.resize(res_curve * 4 + 1, 0); let slice = &mut path[1..]; @@ -34,8 +29,8 @@ pub fn execute(input: &[i32]) -> Vec { std::slice::from_raw_parts_mut(slice.as_ptr() as *mut f32, slice.len()) }; - for i in 0..resolution { - let a = i as f32 / resolution as f32; + for i in 0..res_curve { + let a = i as f32 / (res_curve - 1) as f32; path_p[i * 4] = origin[0] + (a * 8.0).sin() * 0.2; path_p[i * 4 + 1] = origin[1] + a * length; path_p[i * 4 + 2] = origin[2] + 0.0; diff --git a/nodes/max/plantarium/sum/package.json b/nodes/max/plantarium/sum/package.json index a601fc9..86916c9 100644 --- a/nodes/max/plantarium/sum/package.json +++ b/nodes/max/plantarium/sum/package.json @@ -1,6 +1,6 @@ { "scripts": { "build": "wasm-pack build --release --out-name index --no-default-features", - "dev": "cargo watch -s 'pnpm build'" + "dev": "cargo watch -s 'wasm-pack build --dev --out-name index --no-default-features'" } } diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 7674de8..2c6b6f6 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -78,7 +78,7 @@ export interface RuntimeExecutor { * @param graph - The graph to execute * @returns The result of the execution */ - execute: (graph: Graph) => unknown; + execute: (graph: Graph, settings: Record) => unknown; } diff --git a/packages/types/src/inputs.ts b/packages/types/src/inputs.ts index bd89a1e..eebc24c 100644 --- a/packages/types/src/inputs.ts +++ b/packages/types/src/inputs.ts @@ -22,7 +22,7 @@ type NodeInputBoolean = { type NodeInputSelect = { type: "select"; - labels: string[]; + options: string[]; value?: number; } diff --git a/packages/types/src/lib.rs b/packages/types/src/lib.rs index 8922cc9..a187f12 100644 --- a/packages/types/src/lib.rs +++ b/packages/types/src/lib.rs @@ -54,7 +54,7 @@ pub struct NodeInputBoolean { #[derive(Serialize, Deserialize, Debug)] pub struct NodeInputSelect { - pub labels: Vec, + pub options: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub value: Option, } @@ -130,4 +130,3 @@ pub struct NodeType { #[serde(skip_serializing_if = "Option::is_none")] pub outputs: Option>, } - diff --git a/packages/ui/src/lib/Input.svelte b/packages/ui/src/lib/Input.svelte index 27788c2..572933d 100644 --- a/packages/ui/src/lib/Input.svelte +++ b/packages/ui/src/lib/Input.svelte @@ -12,11 +12,11 @@ {#if input.type === "float"} - + {:else if input.type === "integer"} - + {:else if input.type === "boolean"} {:else if input.type === "select"} - {/if} diff --git a/packages/ui/src/lib/app.css b/packages/ui/src/lib/app.css index 8db7309..a2798a2 100644 --- a/packages/ui/src/lib/app.css +++ b/packages/ui/src/lib/app.css @@ -49,6 +49,8 @@ body { --background-color-darker: #101010; --text-color: #aeaeae; + color: var(--text-color); + background-color: var(--background-color-darker); } diff --git a/packages/ui/src/lib/elements/Checkbox.svelte b/packages/ui/src/lib/elements/Checkbox.svelte index bb5cdec..b1097fa 100644 --- a/packages/ui/src/lib/elements/Checkbox.svelte +++ b/packages/ui/src/lib/elements/Checkbox.svelte @@ -1,60 +1,13 @@ - - diff --git a/packages/ui/src/lib/elements/Integer.svelte b/packages/ui/src/lib/elements/Integer.svelte index ca2d78b..4845630 100644 --- a/packages/ui/src/lib/elements/Integer.svelte +++ b/packages/ui/src/lib/elements/Integer.svelte @@ -1,20 +1,169 @@ + + - +
+ {#if typeof min !== "undefined" && typeof max !== "undefined"} + + {/if} + + + + +
+ diff --git a/packages/ui/src/lib/elements/Select.svelte b/packages/ui/src/lib/elements/Select.svelte index 0c7d339..5ac482c 100644 --- a/packages/ui/src/lib/elements/Select.svelte +++ b/packages/ui/src/lib/elements/Select.svelte @@ -1,11 +1,11 @@ diff --git a/packages/utils/src/geometry/extrude_path.rs b/packages/utils/src/geometry/extrude_path.rs index 19830dc..89184e3 100644 --- a/packages/utils/src/geometry/extrude_path.rs +++ b/packages/utils/src/geometry/extrude_path.rs @@ -1,3 +1,5 @@ +use crate::log; + use super::{create_geometry_data, wrap_geometry_data}; use glam::{Mat4, Quat, Vec3}; @@ -65,9 +67,11 @@ pub fn extrude_path(input_path: &[i32], res_x: usize) -> Vec { let i_index_offset = index_offset + j * 6; let i_position_offset = position_offset + j; + log!("i: {}, j: {}, i_index_offset: {}, i_position_offset: {} res_x: {}", i, j, i_index_offset, i_position_offset,res_x); + if j == res_x - 1 { indices[i_index_offset ] = (i_position_offset + 1) as i32; - indices[i_index_offset + 1] = (i_position_offset - res_x + 1) as i32; + indices[i_index_offset + 1] = (i_position_offset + 1 - res_x) as i32; indices[i_index_offset + 2] = (i_position_offset) as i32; indices[i_index_offset + 3] = (i_position_offset) as i32; indices[i_index_offset + 4] = (i_position_offset + res_x) as i32; diff --git a/packages/utils/src/lib.rs b/packages/utils/src/lib.rs index e100a7e..a01de3b 100644 --- a/packages/utils/src/lib.rs +++ b/packages/utils/src/lib.rs @@ -7,6 +7,7 @@ pub use helpers::*; pub use tree::*; pub mod geometry; +#[cfg(debug_assertions)] #[macro_export] macro_rules! log { ($($arg:tt)*) => {{ @@ -15,6 +16,14 @@ macro_rules! log { }} } +#[cfg(not(debug_assertions))] +#[macro_export] +macro_rules! log { + ($($arg:tt)*) => {{ + // This will expand to nothing in release builds + }}; +} + pub fn set_panic_hook() { // When the `console_error_panic_hook` feature is enabled, we can call the // `set_panic_hook` function at least once during initialization, and then diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7be976b..31fbf2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,6 +37,9 @@ importers: '@types/three': specifier: ^0.163.0 version: 0.163.0 + '@unocss/reset': + specifier: ^0.59.4 + version: 0.59.4 comlink: specifier: ^4.4.1 version: 4.4.1 @@ -50,6 +53,9 @@ importers: '@histoire/plugin-svelte': specifier: ^0.17.17 version: 0.17.17(histoire@0.17.17)(svelte@4.2.15)(vite@5.2.9) + '@iconify-json/tabler': + specifier: ^1.1.110 + version: 1.1.110 '@nodes/types': specifier: link:../packages/types version: link:../packages/types @@ -65,6 +71,9 @@ importers: '@tsconfig/svelte': specifier: ^5.0.4 version: 5.0.4 + '@unocss/preset-icons': + specifier: ^0.59.4 + version: 0.59.4 '@zerodevx/svelte-json-view': specifier: ^1.0.9 version: 1.0.9(svelte@4.2.15) @@ -79,13 +88,16 @@ importers: version: 4.2.15 svelte-check: specifier: ^3.6.9 - version: 3.6.9(postcss@8.4.38)(svelte@4.2.15) + version: 3.6.9(@babel/core@7.24.4)(postcss@8.4.38)(svelte@4.2.15) tslib: specifier: ^2.6.2 version: 2.6.2 typescript: specifier: ^5.4.5 version: 5.4.5 + unocss: + specifier: ^0.59.4 + version: 0.59.4(postcss@8.4.38)(vite@5.2.9) vite: specifier: ^5.2.9 version: 5.2.9 @@ -189,7 +201,7 @@ importers: version: 4.2.15 svelte-check: specifier: ^3.6.9 - version: 3.6.9(postcss@8.4.38)(svelte@4.2.15) + version: 3.6.9(@babel/core@7.24.4)(postcss@8.4.38)(svelte@4.2.15) tslib: specifier: ^2.6.2 version: 2.6.2 @@ -249,7 +261,7 @@ importers: version: 4.2.15 svelte-check: specifier: ^3.6.9 - version: 3.6.9(postcss@8.4.38)(svelte@4.2.15) + version: 3.6.9(@babel/core@7.24.4)(postcss@8.4.38)(svelte@4.2.15) tslib: specifier: ^2.6.2 version: 2.6.2 @@ -295,6 +307,331 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + /@antfu/install-pkg@0.1.1: + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + dev: true + + /@antfu/utils@0.7.7: + resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} + dev: true + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: true + + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + dev: true + + /@babel/preset-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + dev: true + + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + dev: true + + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@codemirror/commands@6.4.0: resolution: {integrity: sha512-HB3utD5GxCvEhSyj5EuG9KpuQQhFpxalh3lwrspyL/GeSNDe4c6JDxVzL12SJ+7gUknHjZzmq7OPCb9QPgiRmQ==} dependencies: @@ -658,6 +995,30 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true + /@iconify-json/tabler@1.1.110: + resolution: {integrity: sha512-+0TbyNeQpFI2r+bjtbazGrpGskI3c9NTii/6HhWTS+/d5+PiLs6+wWJW0M9AU2ykew7zdMKB2WtyczFyjYzZIQ==} + dependencies: + '@iconify/types': 2.0.0 + dev: true + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: true + + /@iconify/utils@2.1.23: + resolution: {integrity: sha512-YGNbHKM5tyDvdWZ92y2mIkrfvm5Fvhe6WJSkWu7vvOFhMtYDP0casZpoRz0XEHZCrYsR4stdGT3cZ52yp5qZdQ==} + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.7 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.6.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1362,6 +1723,219 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@unocss/astro@0.59.4(vite@5.2.9): + resolution: {integrity: sha512-DU3OR5MMR1Uvvec4/wB9EetDASHRg19Moy6z/MiIhn8JWJ0QzWYgSeJcfUX8exomMYv6WUEQJL+CyLI34Wmn8w==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@unocss/core': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/vite': 0.59.4(vite@5.2.9) + vite: 5.2.9 + transitivePeerDependencies: + - rollup + dev: true + + /@unocss/cli@0.59.4: + resolution: {integrity: sha512-TT+WKedSifhsRqnpoYD2LfyYipVzEbzIU4DDGIaDNeDxGXYOGpb876zzkPDcvZSpI37IJ/efkkV7PGYpPBcQBQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0 + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/preset-uno': 0.59.4 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.2.3 + fast-glob: 3.3.2 + magic-string: 0.30.10 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + transitivePeerDependencies: + - rollup + dev: true + + /@unocss/config@0.59.4: + resolution: {integrity: sha512-h3yhj+D5Ygn5R7gbK4wMrtXZX6FF5DF6YD517sSSb0XB3lxHD9PhhT4HaV1hpHknvu0cMFU3460M45+TN1TI0Q==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.59.4 + unconfig: 0.3.13 + dev: true + + /@unocss/core@0.59.4: + resolution: {integrity: sha512-bBZ1sgcAtezQVZ1BST9IS3jqcsTLyqKNjiIf7FTnX3DHpfpYuMDFzSOtmkZDzBleOLO/CtcRWjT0HwTSQAmV0A==} + dev: true + + /@unocss/extractor-arbitrary-variants@0.59.4: + resolution: {integrity: sha512-RDe4FgMGJQ+tp9GLvhPHni7Cc2O0lHBRMElVlN8LoXJAdODMICdbrEPGJlEfrc+7x/QgVFoR895KpYJh3hIgGA==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/inspector@0.59.4: + resolution: {integrity: sha512-QczJFNDiggmekkJyNcbcZIUVwlhvxz7ZwjnSf0w7K4znxfjKkZ1hNUbqLviM1HumkTKOdT27VISW7saN/ysO4w==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + gzip-size: 6.0.0 + sirv: 2.0.4 + dev: true + + /@unocss/postcss@0.59.4(postcss@8.4.38): + resolution: {integrity: sha512-KVz+AD7McHKp7VEWHbFahhyyVEo0oP/e1vnuNSuPlHthe+1V2zfH6lps+iJcvfL2072r5J+0PvD/1kOp5ryUSg==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + dependencies: + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + css-tree: 2.3.1 + fast-glob: 3.3.2 + magic-string: 0.30.10 + postcss: 8.4.38 + dev: true + + /@unocss/preset-attributify@0.59.4: + resolution: {integrity: sha512-BeogWuYaIakC1gmOZFFCjFVWmu/m3AqEX8UYQS6tY6lAaK2L4Qf4AstYBlT2zAMxy9LNxPDxFQrvfSfFk5Klsg==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/preset-icons@0.59.4: + resolution: {integrity: sha512-Afjwh5oC4KRE8TNZDUkRK6hvvV1wKLrS1e5trniE0B0AM9HK3PBolQaIU7QmzPv6WQrog+MZgIwafg1eqsPUCA==} + dependencies: + '@iconify/utils': 2.1.23 + '@unocss/core': 0.59.4 + ofetch: 1.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/preset-mini@0.59.4: + resolution: {integrity: sha512-ZLywGrXi1OCr4My5vX2rLUb5Xgx6ufR9WTQOvpQJGBdIV/jnZn/pyE5avCs476SnOq2K172lnd8mFmTK7/zArA==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/rule-utils': 0.59.4 + dev: true + + /@unocss/preset-tagify@0.59.4: + resolution: {integrity: sha512-vWMdTUoghOSmTbdmZtERssffmdUdOuhh4vUdl0R8Kv6KxB0PkvEFCu2FItn97nRJdSPlZSFxxDkaOIg9w+STNQ==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/preset-typography@0.59.4: + resolution: {integrity: sha512-ZX9bxZUqlXK1qEDzO5lkK96ICt9itR/oNyn/7mMc1JPqwj263LumQMn5silocgzoLSUXEeq//L6GylqYjkL8GA==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + dev: true + + /@unocss/preset-uno@0.59.4: + resolution: {integrity: sha512-G1f8ZluplvXZ3bERj+sM/8zzY//XD++nNOlAQNKOANSVht3qEoJebrfEiMClNpA5qW5VWOZhEhPkh0M7GsXtnA==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/preset-wind': 0.59.4 + '@unocss/rule-utils': 0.59.4 + dev: true + + /@unocss/preset-web-fonts@0.59.4: + resolution: {integrity: sha512-ehutTjKHnf2KPmdatN42N9a8+y+glKSU3UlcBRNsVIIXVIlaBQuPVGZSPhnMtrKD17IgWylXq2K6RJK+ab0hZA==} + dependencies: + '@unocss/core': 0.59.4 + ofetch: 1.3.4 + dev: true + + /@unocss/preset-wind@0.59.4: + resolution: {integrity: sha512-CNX6w0ZpSQg/i1oF0/WKWzto8PtLqoknC5h8JmmcGb7VsyBQeV0oNnhbURxpbuMEhbv1MWVIGvk8a+P6y0rFkQ==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/rule-utils': 0.59.4 + dev: true + + /@unocss/reset@0.59.4: + resolution: {integrity: sha512-Upy4xzdWl4RChbLAXBq1BoR4WqxXMoIfjvtcwSZcZK2sylXCFAseSWnyzJFdSiXPqNfmMuNgPXgiSxiQB+cmNA==} + + /@unocss/rule-utils@0.59.4: + resolution: {integrity: sha512-1qoLJlBWAkS4D4sg73990S1MT7E8E5md/YhopKjTQuEC9SyeVmEg+5pR/Xd8xhPKMqbcuBPl/DS8b6l/GQO56A==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.59.4 + magic-string: 0.30.10 + dev: true + + /@unocss/scope@0.59.4: + resolution: {integrity: sha512-wBQJ39kw4Tfj4km7AoGvSIobPKVnRZVsgc0bema5Y0PL3g1NeVQ/LopBI2zEJWdpxGXUWxSDsXm7BZo6qVlD/A==} + dev: true + + /@unocss/transformer-attributify-jsx-babel@0.59.4: + resolution: {integrity: sha512-xtCRSgeTaDBiNJLVX7oOSFe63JiFB5nrdK23PHn3IlZM9O7Bxx4ZxI3MQJtFZFQNE+INFko+DVyY1WiFEm1p/Q==} + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@unocss/core': 0.59.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/transformer-attributify-jsx@0.59.4: + resolution: {integrity: sha512-m4b83utzKMfUQH/45V2QkjJoXd8Tu2pRP1nic91Xf7QRceyKDD+BxoTneo2JNC2K274cQu7HqqotnCm2aFfEGw==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/transformer-compile-class@0.59.4: + resolution: {integrity: sha512-Vgk2OCLPW0pU+Uzr1IgDtHVspSBb+gPrQFkV+5gxHk9ZdKi3oYKxLuufVWYDSwv7o9yfQGbYrMH9YLsjRsnA7Q==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/transformer-directives@0.59.4: + resolution: {integrity: sha512-nXUTEclUbs0vQ4KfLhKt4J/5SLSEq1az2FNlJmiXMmqmn75X89OrtCu2OJu9sGXhn+YyBApxgcSSdxmtpqMi1Q==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + css-tree: 2.3.1 + dev: true + + /@unocss/transformer-variant-group@0.59.4: + resolution: {integrity: sha512-9XLixxn1NRgP62Kj4R/NC/rpqhql5F2s6ulJ8CAMTEbd/NylVhEANluPGDVUGcLJ4cj6E02hFa8C1PLGSm7/xw==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/vite@0.59.4(vite@5.2.9): + resolution: {integrity: sha512-q7GN7vkQYn79n7vYIUlaa7gXGwc7pk0Qo3z3ZFwWGE43/DtZnn2Hwl5UjgBAgi9McA+xqHJEHRsJnI7HJPHUYA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0 + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/inspector': 0.59.4 + '@unocss/scope': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + chokidar: 3.6.0 + fast-glob: 3.3.2 + magic-string: 0.30.10 + vite: 5.2.9 + transitivePeerDependencies: + - rollup + dev: true + /@vitest/expect@1.5.0: resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} dependencies: @@ -1462,6 +2036,13 @@ packages: engines: {node: '>=8'} dev: true + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1554,6 +2135,17 @@ packages: fill-range: 7.0.1 dev: true + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001611 + electron-to-chromium: 1.4.741 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true @@ -1575,6 +2167,10 @@ packages: tslib: 2.6.2 dev: true + /caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + dev: true + /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: @@ -1596,6 +2192,15 @@ packages: type-detect: 4.0.8 dev: true + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1680,6 +2285,12 @@ packages: estree-walker: 3.0.3 periscopic: 3.1.0 + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1687,10 +2298,18 @@ packages: color-name: 1.1.4 dev: true + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -1721,6 +2340,11 @@ packages: - supports-color dev: true + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + /constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: @@ -1734,6 +2358,10 @@ packages: engines: {node: '>=12'} dev: true + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -1853,6 +2481,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + dev: true + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1900,6 +2532,10 @@ packages: tslib: 2.6.2 dev: true + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + /earcut@2.2.4: resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} dev: false @@ -1908,6 +2544,10 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true + /electron-to-chromium@1.4.741: + resolution: {integrity: sha512-AyTBZqDoS7/mvQK22gOQpjxbeV8iPeUBTvYlEh/1S9dKAHgQdxuF49g9rLbj0cRKtqH8PzLJzqT3nAdl+qoZTA==} + dev: true + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -1956,10 +2596,20 @@ packages: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2154,6 +2804,21 @@ packages: engines: {node: '>=0.10.0'} dev: true + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa@7.2.0: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} @@ -2311,6 +2976,11 @@ packages: engines: {node: '>=14.16'} dev: true + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true @@ -2361,6 +3031,11 @@ packages: once: 1.4.0 dev: true + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + /globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2413,6 +3088,18 @@ packages: strip-bom-string: 1.0.0 dev: true + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2505,6 +3192,11 @@ packages: - supports-color dev: true + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} @@ -2637,6 +3329,11 @@ packages: engines: {node: '>=12'} dev: true + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2651,6 +3348,10 @@ packages: hasBin: true dev: true + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + /js-tokens@9.0.0: resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} dev: true @@ -2711,6 +3412,12 @@ packages: - utf-8-validate dev: true + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true @@ -2766,6 +3473,10 @@ packages: resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} dev: true + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + /launch-editor@2.6.1: resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} dependencies: @@ -2826,6 +3537,12 @@ packages: tslib: 2.6.2 dev: true + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2929,6 +3646,11 @@ packages: mime-db: 1.52.0 dev: true + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -3019,6 +3741,14 @@ packages: tslib: 2.6.2 dev: true + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3047,6 +3777,13 @@ packages: npm-normalize-package-bin: 2.0.0 dev: true + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + /npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3058,6 +3795,14 @@ packages: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} dev: true + /ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.3 + dev: true + /on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -3071,6 +3816,13 @@ packages: wrappy: 1.0.2 dev: true + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -3195,6 +3947,10 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + dev: true + /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: @@ -3428,6 +4184,11 @@ packages: kind-of: 6.0.3 dev: true + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + /semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} @@ -3565,6 +4326,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -3601,6 +4367,13 @@ packages: time-span: 5.1.0 dev: true + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3608,7 +4381,7 @@ packages: has-flag: 4.0.0 dev: true - /svelte-check@3.6.9(postcss@8.4.38)(svelte@4.2.15): + /svelte-check@3.6.9(@babel/core@7.24.4)(postcss@8.4.38)(svelte@4.2.15): resolution: {integrity: sha512-hDQrk3L0osX07djQyMiXocKysTLfusqi8AriNcCiQxhQR49/LonYolcUGMtZ0fbUR8HTR198Prrgf52WWU9wEg==} hasBin: true peerDependencies: @@ -3621,7 +4394,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 4.2.15 - svelte-preprocess: 5.1.4(postcss@8.4.38)(svelte@4.2.15)(typescript@5.4.5) + svelte-preprocess: 5.1.4(@babel/core@7.24.4)(postcss@8.4.38)(svelte@4.2.15)(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: - '@babel/core' @@ -3660,7 +4433,7 @@ packages: dependencies: svelte: 4.2.15 - /svelte-preprocess@5.1.4(postcss@8.4.38)(svelte@4.2.15)(typescript@5.4.5): + /svelte-preprocess@5.1.4(@babel/core@7.24.4)(postcss@8.4.38)(svelte@4.2.15)(typescript@5.4.5): resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} requiresBuild: true @@ -3698,6 +4471,7 @@ packages: typescript: optional: true dependencies: + '@babel/core': 7.24.4 '@types/pug': 2.0.10 detect-indent: 6.1.0 magic-string: 0.30.10 @@ -3805,6 +4579,11 @@ packages: engines: {node: '>=14.0.0'} dev: true + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3924,6 +4703,14 @@ packages: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true + /unconfig@0.3.13: + resolution: {integrity: sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==} + dependencies: + '@antfu/utils': 0.7.7 + defu: 6.1.4 + jiti: 1.21.0 + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true @@ -3938,11 +4725,61 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unocss@0.59.4(postcss@8.4.38)(vite@5.2.9): + resolution: {integrity: sha512-QmCVjRObvVu/gsGrJGVt0NnrdhFFn314BUZn2WQyXV9rIvHLRmG5bIu0j5vibJkj7ZhFchTrnTM1pTFXP1xt5g==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.59.4 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + dependencies: + '@unocss/astro': 0.59.4(vite@5.2.9) + '@unocss/cli': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/postcss': 0.59.4(postcss@8.4.38) + '@unocss/preset-attributify': 0.59.4 + '@unocss/preset-icons': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/preset-tagify': 0.59.4 + '@unocss/preset-typography': 0.59.4 + '@unocss/preset-uno': 0.59.4 + '@unocss/preset-web-fonts': 0.59.4 + '@unocss/preset-wind': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/transformer-attributify-jsx': 0.59.4 + '@unocss/transformer-attributify-jsx-babel': 0.59.4 + '@unocss/transformer-compile-class': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + '@unocss/transformer-variant-group': 0.59.4 + '@unocss/vite': 0.59.4(vite@5.2.9) + vite: 5.2.9 + transitivePeerDependencies: + - postcss + - rollup + - supports-color + dev: true + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: true + /upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: @@ -4235,6 +5072,10 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true