From 5570d975f599c14f3cf857faa8a1633ea9b7c899 Mon Sep 17 00:00:00 2001
From: Felix Hungenberg <30648730+shiftgeist@users.noreply.github.com>
Date: Thu, 22 Jan 2026 23:57:56 +0100
Subject: [PATCH] feat: unmigrate number into universal float, inherit step if
unset
---
.../lib/sidebar/panels/BenchmarkPanel.svelte | 251 ++++++------
packages/ui/src/lib/Input.svelte | 7 +-
packages/ui/src/lib/index.ts | 3 +-
packages/ui/src/lib/inputs/Float.svelte | 27 +-
packages/ui/src/lib/inputs/Integer.svelte | 359 +++++++++---------
packages/ui/src/lib/inputs/Number.svelte | 177 ---------
packages/ui/src/lib/inputs/Vec3.svelte | 2 +-
packages/ui/src/routes/+page.svelte | 26 +-
8 files changed, 345 insertions(+), 507 deletions(-)
delete mode 100644 packages/ui/src/lib/inputs/Number.svelte
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})
-
-
Progress ({samples}/{amount.value})
-
- {: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})
+
+
Progress ({samples}/{amount.value})
+
+ {:else}
+
+
+
+ {/if}
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 @@