diff --git a/app/package.json b/app/package.json index a40a4ea..cf6099a 100644 --- a/app/package.json +++ b/app/package.json @@ -28,7 +28,7 @@ "devDependencies": { "@iconify-json/tabler": "^1.2.26", "@iconify/tailwind4": "^1.2.1", - "@nodarium/types": "link:../packages/types", + "@nodarium/types": "workspace:", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@tsconfig/svelte": "^5.0.6", diff --git a/app/src/lib/graph-interface/components/AddMenu.svelte b/app/src/lib/graph-interface/components/AddMenu.svelte index 5346410..732becc 100644 --- a/app/src/lib/graph-interface/components/AddMenu.svelte +++ b/app/src/lib/graph-interface/components/AddMenu.svelte @@ -1,8 +1,8 @@ @@ -89,7 +100,7 @@ position.z={graphState.addMenuPosition?.[1]} transform={false} > -
+
{ - if (event.key === "Enter") { + if (event.key === 'Enter') { handleNodeCreation(node.id); } }} @@ -125,7 +136,7 @@ activeNodeId = node.id; }} > - {node.id.split("/").at(-1)} + {node.id.split('/').at(-1)}
{/each}
@@ -167,6 +178,8 @@ min-height: none; width: 100%; color: var(--text-color); + max-height: 300px; + overflow-y: auto; } .result { diff --git a/app/src/lib/graph-interface/graph-state.svelte.ts b/app/src/lib/graph-interface/graph-state.svelte.ts index a67d7f8..37931fa 100644 --- a/app/src/lib/graph-interface/graph-state.svelte.ts +++ b/app/src/lib/graph-interface/graph-state.svelte.ts @@ -192,13 +192,13 @@ export class GraphState { } const height = 5 + 10 - * Object.keys(node.inputs).filter( - (p) => - p !== 'seed' - && node?.inputs - && !('setting' in node?.inputs?.[p]) - && node.inputs[p].hidden !== true - ).length; + * Object.keys(node.inputs).filter( + (p) => + p !== 'seed' + && node?.inputs + && !('setting' in node?.inputs?.[p]) + && node.inputs[p].hidden !== true + ).length; this.nodeHeightCache[nodeTypeId] = height; return height; } @@ -338,4 +338,8 @@ export class GraphState { && node.position[1] < this.cameraBounds[3] ); } + + openNodePalette() { + this.addMenuPosition = [this.mousePosition[0], this.mousePosition[1]]; + } } diff --git a/app/src/lib/graph-interface/graph/Graph.svelte b/app/src/lib/graph-interface/graph/Graph.svelte index f615676..84ddaea 100644 --- a/app/src/lib/graph-interface/graph/Graph.svelte +++ b/app/src/lib/graph-interface/graph/Graph.svelte @@ -1,18 +1,18 @@ mouseEvents.handleMouseMove(ev)} - onmouseup={(ev) => mouseEvents.handleMouseUp(ev)} + onmousemove={(ev) => mouseEvents.handleWindowMouseMove(ev)} + onmouseup={(ev) => mouseEvents.handleWindowMouseUp(ev)} />
mouseEvents.handleMouseScroll(ev)} bind:this={graphState.wrapper} class="graph-wrapper" - style="height: 100%;" + style="height: 100%" class:is-panning={graphState.isPanning} class:is-hovering={graphState.hoveredNodeId !== -1} aria-label="Graph" @@ -115,6 +115,7 @@ bind:clientHeight={graphState.height} onkeydown={(ev) => keymap.handleKeyboardEvent(ev)} onmousedown={(ev) => mouseEvents.handleMouseDown(ev)} + oncontextmenu={(ev) => mouseEvents.handleContextMenu(ev)} {...fileDropEvents.getEventListenerProps()} > { - graphState.addMenuPosition = [graphState.mousePosition[0], graphState.mousePosition[1]]; - } + callback: () => graphState.openNodePalette() }); keymap.addShortcut({ diff --git a/app/src/lib/sidebar/panels/BenchmarkPanel.svelte b/app/src/lib/sidebar/panels/BenchmarkPanel.svelte index 06e9123..cd1cdb4 100644 --- a/app/src/lib/sidebar/panels/BenchmarkPanel.svelte +++ b/app/src/lib/sidebar/panels/BenchmarkPanel.svelte @@ -1,147 +1,148 @@ {status}
- {#if result} -

Finished ({humanizeDuration(result.duration)})

-
- -
- - - ev.key === "Enter" && copyContent(result?.avg)} - onclick={() => copyContent(result?.avg)}>(click to copy) - - - ev.key === "Enter" && copyContent(result?.avg)} - onclick={() => copyContent(result?.stdev + "")}>(click to copy) -
- -
- {:else if isRunning} -

WarmUp ({$warmUp}/{warmUpAmount})

- {Math.floor(($warmUp / warmUpAmount) * 100)}% -

Progress ({samples}/{amount.value})

- {Math.floor((samples / amount.value) * 100)}% - {:else} - - - - {/if} + {#if result} +

Finished ({humanizeDuration(result.duration)})

+
+ +
+ + + ev.key === 'Enter' && copyContent(result?.avg)} + onclick={() => copyContent(result?.avg)} + >(click to copy) + + + ev.key === 'Enter' && copyContent(result?.avg)} + onclick={() => copyContent(result?.stdev + '')} + >(click to copy) +
+ +
+ {:else if isRunning} +

WarmUp ({$warmUp}/{warmUpAmount})

+ + {Math.floor(($warmUp / warmUpAmount) * 100)}% + +

Progress ({samples}/{amount.value})

+ + {Math.floor((samples / amount.value) * 100)}% + + {:else} + + + + {/if}
diff --git a/packages/registry/package.json b/packages/registry/package.json index ae89205..d81f6bd 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -10,8 +10,8 @@ "author": "", "license": "ISC", "dependencies": { - "@nodarium/types": "link:../types", - "@nodarium/utils": "link:../utils", + "@nodarium/types": "workspace:", + "@nodarium/utils": "workspace:", "idb": "^8.0.3" } } diff --git a/packages/ui/package.json b/packages/ui/package.json index 75ec7b2..ee8bf3e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -30,7 +30,7 @@ "svelte": "^4.0.0" }, "devDependencies": { - "@nodarium/types": "link:../types", + "@nodarium/types": "workspace:", "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.50.0", "@sveltejs/package": "^2.5.7", diff --git a/packages/ui/src/lib/Input.svelte b/packages/ui/src/lib/Input.svelte index f916dd1..aa91cba 100644 --- a/packages/ui/src/lib/Input.svelte +++ b/packages/ui/src/lib/Input.svelte @@ -1,10 +1,7 @@ {#if input.type === 'float'} - + {:else if input.type === 'integer'} {:else if input.type === 'boolean'} diff --git a/packages/ui/src/lib/index.ts b/packages/ui/src/lib/index.ts index d0eb412..a827062 100644 --- a/packages/ui/src/lib/index.ts +++ b/packages/ui/src/lib/index.ts @@ -1,8 +1,7 @@ export { default as Input } from './Input.svelte'; export { default as Checkbox } from './inputs/Checkbox.svelte'; -export { default as Float } from './inputs/Float.svelte'; +export { default as Float, default as Number } from './inputs/Float.svelte'; export { default as Integer } from './inputs/Integer.svelte'; -export { default as Number } from './inputs/Number.svelte'; export { default as Select } from './inputs/Select.svelte'; export { default as Vec3 } from './inputs/Vec3.svelte'; diff --git a/packages/ui/src/lib/inputs/Float.svelte b/packages/ui/src/lib/inputs/Float.svelte index e3352ee..013afc9 100644 --- a/packages/ui/src/lib/inputs/Float.svelte +++ b/packages/ui/src/lib/inputs/Float.svelte @@ -9,7 +9,7 @@ let { value = $bindable(0.5), - step = 0.01, + step, min = $bindable(0), max = $bindable(1), id @@ -22,8 +22,11 @@ max = value; } + // svelte-ignore state_referenced_locally only use initial values + const precision = ((step || value).toString().split('.')[1] || '').length; + function strip(input: number) { - return +parseFloat(input + '').toPrecision(2); + return +parseFloat(input + '').toFixed(precision); } let inputEl: HTMLInputElement | undefined = $state(); @@ -94,14 +97,22 @@ } else { value = Math.max(Math.min(min + (max - min) * vx, max), min); } - (ev.target as HTMLElement)?.blur(); + + value = strip(value); + + // With ctrl + outside of input ev.target becomes HTMLDocument + if (ev.target instanceof HTMLElement) { + ev.target?.blur(); + } } + $effect(() => { - if ((value || 0).toString().length > 5) { - value = strip(value || 0); + if (value.toString().length > 5) { + value = strip(value); } value !== undefined && handleChange(); }); + let width = $derived( Number.isFinite(value) ? Math.max((value?.toString().length ?? 1) * 8, 50) + 'px' : '20px' ); @@ -137,12 +148,12 @@ border-radius: var(--border-radius, 2px); } - input[type='number']::-webkit-inner-spin-button, - input[type='number']::-webkit-outer-spin-button { + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; } - input[type='number'] { + input[type="number"] { box-sizing: border-box; -webkit-appearance: textfield; -moz-appearance: textfield; diff --git a/packages/ui/src/lib/inputs/Integer.svelte b/packages/ui/src/lib/inputs/Integer.svelte index e7d0f2a..0437667 100644 --- a/packages/ui/src/lib/inputs/Integer.svelte +++ b/packages/ui/src/lib/inputs/Integer.svelte @@ -1,210 +1,215 @@ + +
- - + + - - {#if typeof min !== 'undefined' && typeof max !== 'undefined'} - - {/if} + + {#if typeof min !== 'undefined' && typeof max !== 'undefined'} + + {/if}
diff --git a/packages/ui/src/lib/inputs/Number.svelte b/packages/ui/src/lib/inputs/Number.svelte deleted file mode 100644 index a7b2bca..0000000 --- a/packages/ui/src/lib/inputs/Number.svelte +++ /dev/null @@ -1,177 +0,0 @@ - - -
-
- - - -
-
- -
-
- - diff --git a/packages/ui/src/lib/inputs/Vec3.svelte b/packages/ui/src/lib/inputs/Vec3.svelte index 690bc7d..96bcea9 100644 --- a/packages/ui/src/lib/inputs/Vec3.svelte +++ b/packages/ui/src/lib/inputs/Vec3.svelte @@ -1,5 +1,5 @@