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})

- {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/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 @@