feat: improve theme color consistency
This commit is contained in:
parent
415d773610
commit
f1e537d596
@ -42,6 +42,7 @@
|
|||||||
"internal-ip": "^8.0.0",
|
"internal-ip": "^8.0.0",
|
||||||
"svelte": "^4.2.15",
|
"svelte": "^4.2.15",
|
||||||
"svelte-check": "^3.6.9",
|
"svelte-check": "^3.6.9",
|
||||||
|
"three-inspect": "^0.4.5",
|
||||||
"tslib": "^2.6.2",
|
"tslib": "^2.6.2",
|
||||||
"typescript": "^5.4.5",
|
"typescript": "^5.4.5",
|
||||||
"unocss": "^0.59.4",
|
"unocss": "^0.59.4",
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
bw = width / cameraPosition[2];
|
bw = width / cameraPosition[2];
|
||||||
bh = height / cameraPosition[2];
|
bh = height / cameraPosition[2];
|
||||||
}
|
}
|
||||||
|
$: backgroundColor = $colors["layer-0"];
|
||||||
|
$: lineColor = $colors["outline"];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<T.Group
|
<T.Group
|
||||||
@ -52,8 +54,8 @@
|
|||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
uniforms.camPos.value={cameraPosition}
|
uniforms.camPos.value={cameraPosition}
|
||||||
uniforms.backgroundColor.value={$colors.layer0}
|
uniforms.backgroundColor.value={backgroundColor}
|
||||||
uniforms.lineColor.value={$colors.outline}
|
uniforms.lineColor.value={lineColor}
|
||||||
uniforms.zoomLimits.value={[minZoom, maxZoom]}
|
uniforms.zoomLimits.value={[minZoom, maxZoom]}
|
||||||
uniforms.dimensions.value={[width, height]}
|
uniforms.dimensions.value={[width, height]}
|
||||||
/>
|
/>
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
<script context="module" lang="ts">
|
<script context="module" lang="ts">
|
||||||
import { colors } from "../graph/stores";
|
import { colors } from "../graph/stores";
|
||||||
import { get } from "svelte/store";
|
|
||||||
|
|
||||||
const circleMaterial = new MeshBasicMaterial({
|
const circleMaterial = new MeshBasicMaterial({
|
||||||
color: get(colors).outline,
|
color: get(colors).edge,
|
||||||
toneMapped: false,
|
toneMapped: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
colors.subscribe((c) => {
|
||||||
|
circleMaterial.color.copy(c.edge.clone().convertSRGBToLinear());
|
||||||
|
});
|
||||||
|
|
||||||
const lineCache = new Map<number, BufferGeometry>();
|
const lineCache = new Map<number, BufferGeometry>();
|
||||||
|
|
||||||
const curve = new CubicBezierCurve(
|
const curve = new CubicBezierCurve(
|
||||||
@ -20,10 +23,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { T } from "@threlte/core";
|
import { T } from "@threlte/core";
|
||||||
import { MeshLineMaterial } from "@threlte/extras";
|
import { MeshLineMaterial } from "@threlte/extras";
|
||||||
import { BufferGeometry, Color, MeshBasicMaterial, Vector3 } from "three";
|
import { BufferGeometry, MeshBasicMaterial, Vector3 } from "three";
|
||||||
import { CubicBezierCurve } from "three/src/extras/curves/CubicBezierCurve.js";
|
import { CubicBezierCurve } from "three/src/extras/curves/CubicBezierCurve.js";
|
||||||
import { Vector2 } from "three/src/math/Vector2.js";
|
import { Vector2 } from "three/src/math/Vector2.js";
|
||||||
import { createEdgeGeometry } from "./createEdgeGeometry.js";
|
import { createEdgeGeometry } from "./createEdgeGeometry.js";
|
||||||
|
import { get } from "svelte/store";
|
||||||
|
|
||||||
export let from: { x: number; y: number };
|
export let from: { x: number; y: number };
|
||||||
export let to: { x: number; y: number };
|
export let to: { x: number; y: number };
|
||||||
@ -75,11 +79,7 @@
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
const lineColor = new Color($colors.outline);
|
$: lineColor = $colors["edge"].clone().convertSRGBToLinear();
|
||||||
|
|
||||||
$: if ($colors.outline) {
|
|
||||||
lineColor.copyLinearToSRGB($colors.outline);
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<T.Mesh
|
<T.Mesh
|
||||||
@ -104,11 +104,6 @@
|
|||||||
|
|
||||||
{#if geometry}
|
{#if geometry}
|
||||||
<T.Mesh position.x={from.x} position.z={from.y} position.y={0.1} {geometry}>
|
<T.Mesh position.x={from.x} position.z={from.y} position.y={0.1} {geometry}>
|
||||||
<MeshLineMaterial
|
<MeshLineMaterial width={3} attenuate={false} color={lineColor} />
|
||||||
width={3}
|
|
||||||
attenuate={false}
|
|
||||||
color={lineColor}
|
|
||||||
toneMapped={false}
|
|
||||||
/>
|
|
||||||
</T.Mesh>
|
</T.Mesh>
|
||||||
{/if}
|
{/if}
|
||||||
|
45
app/src/lib/graph-interface/graph/colors.ts
Normal file
45
app/src/lib/graph-interface/graph/colors.ts
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import { readable } from "svelte/store";
|
||||||
|
import { Color } from "three";
|
||||||
|
|
||||||
|
const variables = [
|
||||||
|
"layer-0",
|
||||||
|
"layer-1",
|
||||||
|
"layer-2",
|
||||||
|
"layer-3",
|
||||||
|
"outline",
|
||||||
|
"active",
|
||||||
|
"selected",
|
||||||
|
"edge",
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
const store = Object.fromEntries(variables.map(v => [v, new Color()])) as Record<typeof variables[number], Color>;
|
||||||
|
|
||||||
|
let lastStyle = "";
|
||||||
|
|
||||||
|
function updateColors() {
|
||||||
|
if (!("getComputedStyle" in globalThis)) return;
|
||||||
|
const style = getComputedStyle(document.body);
|
||||||
|
let hash = "";
|
||||||
|
for (const v of variables) {
|
||||||
|
let color = style.getPropertyValue(`--${v}`);
|
||||||
|
hash += color;
|
||||||
|
store[v].setStyle(color);
|
||||||
|
}
|
||||||
|
if (hash === lastStyle) return;
|
||||||
|
lastStyle = hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateColors();
|
||||||
|
|
||||||
|
export const colors = readable(store, set => {
|
||||||
|
|
||||||
|
updateColors();
|
||||||
|
set(store);
|
||||||
|
|
||||||
|
window.onload = function () { updateColors(); set(store) };
|
||||||
|
|
||||||
|
document.body.addEventListener("transitionstart", () => {
|
||||||
|
updateColors();
|
||||||
|
set(store);
|
||||||
|
})
|
||||||
|
});
|
@ -10,63 +10,4 @@ export const hoveredSocket: Writable<Socket | null> = writable(null);
|
|||||||
export const possibleSockets: Writable<Socket[]> = writable([]);
|
export const possibleSockets: Writable<Socket[]> = writable([]);
|
||||||
export const possibleSocketIds: Writable<Set<string> | null> = writable(null);
|
export const possibleSocketIds: Writable<Set<string> | null> = writable(null);
|
||||||
|
|
||||||
export const colors = writable({
|
export { colors } from "./colors";
|
||||||
layer0: new Color().setStyle("#060606"),
|
|
||||||
layer1: new Color().setStyle("#171717"),
|
|
||||||
layer2: new Color().setStyle("#2D2D2D"),
|
|
||||||
layer3: new Color().setStyle("#A6A6A6"),
|
|
||||||
outline: new Color().setStyle("#000000"),
|
|
||||||
active: new Color().setStyle("#c65a19"),
|
|
||||||
selected: new Color().setStyle("#ffffff"),
|
|
||||||
});
|
|
||||||
|
|
||||||
if ("getComputedStyle" in globalThis) {
|
|
||||||
|
|
||||||
const body = document.body;
|
|
||||||
|
|
||||||
let lastStyle = "";
|
|
||||||
|
|
||||||
function updateColors() {
|
|
||||||
|
|
||||||
const style = getComputedStyle(body);
|
|
||||||
const layer0 = style.getPropertyValue("--layer-0");
|
|
||||||
const layer1 = style.getPropertyValue("--layer-1");
|
|
||||||
const layer2 = style.getPropertyValue("--layer-2");
|
|
||||||
const layer3 = style.getPropertyValue("--layer-3");
|
|
||||||
const outline = style.getPropertyValue("--outline");
|
|
||||||
const active = style.getPropertyValue("--active");
|
|
||||||
const selected = style.getPropertyValue("--selected");
|
|
||||||
|
|
||||||
const newStyle = `${layer0}${layer1}${layer2}${layer3}${outline}${active}${selected}`;
|
|
||||||
|
|
||||||
if (newStyle === lastStyle) return;
|
|
||||||
lastStyle = newStyle;
|
|
||||||
|
|
||||||
colors.update(col => {
|
|
||||||
col.layer0.setStyle(layer0);
|
|
||||||
col.layer0.convertLinearToSRGB();
|
|
||||||
col.layer1.setStyle(layer1);
|
|
||||||
col.layer1.convertLinearToSRGB();
|
|
||||||
col.layer2.setStyle(layer2);
|
|
||||||
col.layer2.convertLinearToSRGB();
|
|
||||||
col.layer3.setStyle(layer3);
|
|
||||||
col.layer3.convertLinearToSRGB();
|
|
||||||
col.outline.setStyle(outline);
|
|
||||||
col.outline.convertLinearToSRGB();
|
|
||||||
col.active.setStyle(active);
|
|
||||||
col.active.convertLinearToSRGB();
|
|
||||||
col.selected.setStyle(selected);
|
|
||||||
col.selected.convertLinearToSRGB();
|
|
||||||
return col;
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
updateColors();
|
|
||||||
|
|
||||||
window.onload = updateColors;
|
|
||||||
|
|
||||||
body.addEventListener("transitionstart", () => {
|
|
||||||
updateColors();
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { Node } from "@nodes/types";
|
import type { Node } from "@nodes/types";
|
||||||
import { getContext, onMount } from "svelte";
|
import { getContext, onMount } from "svelte";
|
||||||
import NodeHeader from "./NodeHeader.svelte";
|
|
||||||
import NodeParameter from "./NodeParameter.svelte";
|
|
||||||
import { activeNodeId, selectedNodes } from "../graph/stores.js";
|
import { activeNodeId, selectedNodes } from "../graph/stores.js";
|
||||||
import { colors } from "../graph/stores";
|
import { colors } from "../graph/stores";
|
||||||
import { T } from "@threlte/core";
|
import { T } from "@threlte/core";
|
||||||
@ -33,6 +31,9 @@
|
|||||||
updateNodePosition?.(node);
|
updateNodePosition?.(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$: colorBright = $colors["layer-2"];
|
||||||
|
$: colorDark = $colors["layer-1"];
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
node.tmp = node.tmp || {};
|
node.tmp = node.tmp || {};
|
||||||
node.tmp.mesh = meshRef;
|
node.tmp.mesh = meshRef;
|
||||||
@ -61,8 +62,8 @@
|
|||||||
uWidth: { value: 20 },
|
uWidth: { value: 20 },
|
||||||
uHeight: { value: height },
|
uHeight: { value: height },
|
||||||
}}
|
}}
|
||||||
uniforms.uColorBright.value={$colors.layer2}
|
uniforms.uColorBright.value={colorBright}
|
||||||
uniforms.uColorDark.value={$colors.layer1}
|
uniforms.uColorDark.value={colorDark}
|
||||||
uniforms.uStrokeColor.value={isSelected
|
uniforms.uStrokeColor.value={isSelected
|
||||||
? $colors.selected
|
? $colors.selected
|
||||||
: isActive
|
: isActive
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
import { OrbitControls } from "@threlte/extras";
|
import { OrbitControls } from "@threlte/extras";
|
||||||
import { AppSettings } from "../settings/app-settings";
|
import { AppSettings } from "../settings/app-settings";
|
||||||
import localStore from "$lib/helpers/localStore";
|
import localStore from "$lib/helpers/localStore";
|
||||||
|
import { Inspector } from "three-inspect";
|
||||||
|
|
||||||
export let geometries: BufferGeometry[];
|
export let geometries: BufferGeometry[];
|
||||||
export let lines: Vector3[][];
|
export let lines: Vector3[][];
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Canvas } from "@threlte/core";
|
import { Canvas } from "@threlte/core";
|
||||||
import Scene from "./Scene.svelte";
|
import Scene from "./Scene.svelte";
|
||||||
|
import { Inspector } from "three-inspect";
|
||||||
import {
|
import {
|
||||||
BufferGeometry,
|
BufferGeometry,
|
||||||
Float32BufferAttribute,
|
Float32BufferAttribute,
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
import NestedSettings from "./NestedSettings.svelte";
|
import NestedSettings from "./NestedSettings.svelte";
|
||||||
import { writable } from "svelte/store";
|
import { writable } from "svelte/store";
|
||||||
import type { GraphManager } from "$lib/graph-interface/graph-manager";
|
import type { GraphManager } from "$lib/graph-interface/graph-manager";
|
||||||
|
import { encodeFloat } from "@nodes/utils";
|
||||||
|
|
||||||
function filterInputs(inputs: Record<string, NodeInput>) {
|
function filterInputs(inputs: Record<string, NodeInput>) {
|
||||||
return Object.fromEntries(
|
return Object.fromEntries(
|
||||||
@ -41,11 +42,17 @@
|
|||||||
Object.keys($store).forEach((_key: string) => {
|
Object.keys($store).forEach((_key: string) => {
|
||||||
node.props = node.props || {};
|
node.props = node.props || {};
|
||||||
const key = _key as keyof typeof $store;
|
const key = _key as keyof typeof $store;
|
||||||
if (node && $store && node.props[key] !== $store[key]) {
|
if (node && $store) {
|
||||||
|
if (Array.isArray($store[key])) {
|
||||||
|
node.props[key] = [...$store[key]].map((v) => encodeFloat(v));
|
||||||
|
needsUpdate = true;
|
||||||
|
} else if (node.props[key] !== $store[key]) {
|
||||||
needsUpdate = true;
|
needsUpdate = true;
|
||||||
node.props[key] = $store[key];
|
node.props[key] = $store[key];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
console.log(needsUpdate, node.props, $store);
|
||||||
if (needsUpdate) {
|
if (needsUpdate) {
|
||||||
manager.execute();
|
manager.execute();
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,15 @@
|
|||||||
},
|
},
|
||||||
"seed": {
|
"seed": {
|
||||||
"type": "seed"
|
"type": "seed"
|
||||||
|
},
|
||||||
|
"directionalStrength": {
|
||||||
|
"type": "vec3",
|
||||||
|
"hidden": true,
|
||||||
|
"value": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,8 @@ use glam::Vec3;
|
|||||||
use macros::include_definition_file;
|
use macros::include_definition_file;
|
||||||
use noise::{core::open_simplex::open_simplex_2d, permutationtable::PermutationTable, Vector2};
|
use noise::{core::open_simplex::open_simplex_2d, permutationtable::PermutationTable, Vector2};
|
||||||
use utils::{
|
use utils::{
|
||||||
concat_args, decode_float, encode_float, evaluate_float, get_args, log, set_panic_hook,
|
concat_args, decode_float, encode_float, evaluate_float, evaluate_vec3, get_args, log,
|
||||||
|
set_panic_hook,
|
||||||
};
|
};
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
|
|
||||||
@ -30,13 +31,16 @@ pub fn execute(input: &[i32]) -> Vec<i32> {
|
|||||||
|
|
||||||
let seed = args[4][0];
|
let seed = args[4][0];
|
||||||
|
|
||||||
|
let directional_strength = evaluate_vec3(args[5]);
|
||||||
|
|
||||||
let hasher = PermutationTable::new(seed as u32);
|
let hasher = PermutationTable::new(seed as u32);
|
||||||
log!(
|
log!(
|
||||||
"scale: {}, strength: {}, fix_bottom: {}, seed: {}",
|
"scale: {}, strength: {}, fix_bottom: {}, seed: {}, directional: {:?}",
|
||||||
scale,
|
scale,
|
||||||
strength,
|
strength,
|
||||||
fix_bottom,
|
fix_bottom,
|
||||||
seed
|
seed,
|
||||||
|
directional_strength
|
||||||
);
|
);
|
||||||
|
|
||||||
let output: Vec<Vec<i32>> = plants
|
let output: Vec<Vec<i32>> = plants
|
||||||
@ -77,16 +81,19 @@ pub fn execute(input: &[i32]) -> Vec<i32> {
|
|||||||
let nx = open_simplex_2d(px, &hasher) as f32
|
let nx = open_simplex_2d(px, &hasher) as f32
|
||||||
* strength
|
* strength
|
||||||
* 0.1
|
* 0.1
|
||||||
|
* directional_strength[0]
|
||||||
* lerp(1.0, a as f32, fix_bottom);
|
* lerp(1.0, a as f32, fix_bottom);
|
||||||
|
|
||||||
let ny = open_simplex_2d(py, &hasher) as f32
|
let ny = open_simplex_2d(py, &hasher) as f32
|
||||||
* strength
|
* strength
|
||||||
* 0.1
|
* 0.1
|
||||||
|
* directional_strength[1]
|
||||||
* lerp(1.0, a as f32, fix_bottom);
|
* lerp(1.0, a as f32, fix_bottom);
|
||||||
|
|
||||||
let nz = open_simplex_2d(pz, &hasher) as f32
|
let nz = open_simplex_2d(pz, &hasher) as f32
|
||||||
* strength
|
* strength
|
||||||
* 0.1
|
* 0.1
|
||||||
|
* directional_strength[2]
|
||||||
* lerp(1.0, a as f32, fix_bottom);
|
* lerp(1.0, a as f32, fix_bottom);
|
||||||
|
|
||||||
plant[3 + i * 4] = encode_float(decode_float(plant[3 + i * 4]) + nx);
|
plant[3 + i * 4] = encode_float(decode_float(plant[3 + i * 4]) + nx);
|
||||||
|
@ -21,11 +21,11 @@
|
|||||||
},
|
},
|
||||||
"length": {
|
"length": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"value": 2
|
"value": 5
|
||||||
},
|
},
|
||||||
"thickness": {
|
"thickness": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"value": 2
|
"value": 0.2
|
||||||
},
|
},
|
||||||
"resolution_curve": {
|
"resolution_curve": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
import Select from "./elements/Select.svelte";
|
import Select from "./elements/Select.svelte";
|
||||||
|
|
||||||
import type { NodeInput } from "@nodes/types";
|
import type { NodeInput } from "@nodes/types";
|
||||||
|
import Vec3 from "./elements/Vec3.svelte";
|
||||||
|
|
||||||
export let input: NodeInput;
|
export let input: NodeInput;
|
||||||
export let value: any;
|
export let value: any;
|
||||||
@ -19,4 +20,6 @@
|
|||||||
<Checkbox {id} bind:value />
|
<Checkbox {id} bind:value />
|
||||||
{:else if input.type === "select"}
|
{:else if input.type === "select"}
|
||||||
<Select {id} bind:value options={input.options} />
|
<Select {id} bind:value options={input.options} />
|
||||||
|
{:else if input.type === "vec3"}
|
||||||
|
<Vec3 {id} bind:value />
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -61,6 +61,8 @@ body {
|
|||||||
--selected: #c65a19;
|
--selected: #c65a19;
|
||||||
|
|
||||||
--outline: var(--neutral-400);
|
--outline: var(--neutral-400);
|
||||||
|
--connection: #333333;
|
||||||
|
--edge: var(--connection, var(--outline));
|
||||||
|
|
||||||
--text-color: var(--neutral-200);
|
--text-color: var(--neutral-200);
|
||||||
|
|
||||||
@ -81,6 +83,7 @@ body.theme-light {
|
|||||||
--layer-3: var(--neutral-500);
|
--layer-3: var(--neutral-500);
|
||||||
--active: #000000;
|
--active: #000000;
|
||||||
--selected: #c65a19;
|
--selected: #c65a19;
|
||||||
|
--connection: #888;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.theme-solarized {
|
body.theme-solarized {
|
||||||
@ -92,6 +95,7 @@ body.theme-solarized {
|
|||||||
--layer-3: #586e75;
|
--layer-3: #586e75;
|
||||||
--active: #000000;
|
--active: #000000;
|
||||||
--selected: #268bd2;
|
--selected: #268bd2;
|
||||||
|
--connection: #839496;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.theme-catppuccin {
|
body.theme-catppuccin {
|
||||||
@ -101,6 +105,7 @@ body.theme-catppuccin {
|
|||||||
--layer-2: #313244;
|
--layer-2: #313244;
|
||||||
--layer-1: #1E1E2E;
|
--layer-1: #1E1E2E;
|
||||||
--layer-0: #11111b;
|
--layer-0: #11111b;
|
||||||
|
--connection: #444459;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.theme-high-contrast {
|
body.theme-high-contrast {
|
||||||
@ -110,6 +115,7 @@ body.theme-high-contrast {
|
|||||||
--layer-1: black;
|
--layer-1: black;
|
||||||
--layer-2: #222222;
|
--layer-2: #222222;
|
||||||
--layer-3: #FFFFFF;
|
--layer-3: #FFFFFF;
|
||||||
|
--connection: #FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.theme-nord {
|
body.theme-nord {
|
||||||
@ -120,7 +126,8 @@ body.theme-nord {
|
|||||||
--layer-2: #434C5E;
|
--layer-2: #434C5E;
|
||||||
--layer-3: #5E81AC;
|
--layer-3: #5E81AC;
|
||||||
--active: #8999bd;
|
--active: #8999bd;
|
||||||
--selected: #b76c3f
|
--selected: #b76c3f;
|
||||||
|
--connection: #232731;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.theme-dracula {
|
body.theme-dracula {
|
||||||
|
10
packages/ui/src/lib/elements/Vec3.svelte
Normal file
10
packages/ui/src/lib/elements/Vec3.svelte
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Float from "./Float.svelte";
|
||||||
|
|
||||||
|
export let value = [0, 0, 0];
|
||||||
|
export let id = "";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Float id={`${id}-x`} bind:value={value[0]} />
|
||||||
|
<Float id={`${id}-y`} bind:value={value[1]} />
|
||||||
|
<Float id={`${id}-z`} bind:value={value[2]} />
|
1766
pnpm-lock.yaml
1766
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user