Better looking left border for the settings UI

This commit is contained in:
Arnaud_Cayrol 2026-02-15 19:30:17 +01:00
parent 1126b2525f
commit 9bb2d4d828

View file

@ -188,21 +188,23 @@
</div> </div>
{#if config.processing.face_resolution.enabled} {#if config.processing.face_resolution.enabled}
<div class="setting-row sub-setting"> <div class="sub-settings-group">
<label for="min-face-size"> <div class="setting-row">
<span class="setting-label">Min Face Size</span> <label for="min-face-size">
<span class="setting-hint">Minimum face resolution in pixels</span> <span class="setting-label">Min Face Size</span>
</label> <span class="setting-hint">Minimum face resolution in pixels</span>
<div class="setting-control"> </label>
<input <div class="setting-control">
id="min-face-size" <input
type="range" id="min-face-size"
bind:value={config.processing.face_resolution.min_size} type="range"
min="20" bind:value={config.processing.face_resolution.min_size}
max="200" min="20"
step="10" max="200"
/> step="10"
<span class="value">{config.processing.face_resolution.min_size}px</span> />
<span class="value">{config.processing.face_resolution.min_size}px</span>
</div>
</div> </div>
</div> </div>
{/if} {/if}
@ -220,25 +222,27 @@
<div class="section-hint">Padding happens when a face is at the border of a photo. It is required to move the subject to the center of the frame.</div> <div class="section-hint">Padding happens when a face is at the border of a photo. It is required to move the subject to the center of the frame.</div>
{#if config.processing.crop.enabled} {#if config.processing.crop.enabled}
<div class="setting-row sub-setting no-border"> <div class="sub-settings-group">
<label for="max-padding"> <div class="setting-row no-border">
<span class="setting-label">Max Padding</span> <label for="max-padding">
<span class="setting-hint">Maximum allowed padding</span> <span class="setting-label">Max Padding</span>
</label> <span class="setting-hint">Maximum allowed padding</span>
<div class="setting-control"> </label>
<input <div class="setting-control">
id="max-padding" <input
type="range" id="max-padding"
bind:value={config.processing.crop.max_padding_percent} type="range"
min="5" bind:value={config.processing.crop.max_padding_percent}
max="80" min="5"
step="5" max="80"
/> step="5"
<span class="value">{config.processing.crop.max_padding_percent}%</span> />
<span class="value">{config.processing.crop.max_padding_percent}%</span>
</div>
</div>
<div class="padding-indicator-container">
<PaddingIndicator maxPaddingPercent={config.processing.crop.max_padding_percent} />
</div> </div>
</div>
<div class="padding-indicator-container">
<PaddingIndicator maxPaddingPercent={config.processing.crop.max_padding_percent} />
</div> </div>
{/if} {/if}
</div> </div>
@ -254,7 +258,7 @@
</div> </div>
{#if config.processing.brightness.enabled} {#if config.processing.brightness.enabled}
<div class="brightness-visual-control sub-setting"> <div class="brightness-visual-control sub-settings-group">
<div class="brightness-hint"> <div class="brightness-hint">
Discard photos if the face is under/over exposed Discard photos if the face is under/over exposed
</div> </div>
@ -279,21 +283,23 @@
</div> </div>
{#if config.processing.blur.enabled} {#if config.processing.blur.enabled}
<div class="setting-row sub-setting"> <div class="sub-settings-group">
<label for="min-sharpness"> <div class="setting-row">
<span class="setting-label">Min Sharpness</span> <label for="min-sharpness">
<span class="setting-hint">Discard blurry faces</span> <span class="setting-label">Min Sharpness</span>
</label> <span class="setting-hint">Discard blurry faces</span>
<div class="setting-control"> </label>
<input <div class="setting-control">
id="min-sharpness" <input
type="range" id="min-sharpness"
bind:value={config.processing.blur.min_sharpness} type="range"
min="10" bind:value={config.processing.blur.min_sharpness}
max="50" min="10"
step="1" max="50"
/> step="1"
<span class="value">{Number(config.processing.blur.min_sharpness).toFixed(0)}</span> />
<span class="value">{Number(config.processing.blur.min_sharpness).toFixed(0)}</span>
</div>
</div> </div>
</div> </div>
{/if} {/if}
@ -310,42 +316,43 @@
</div> </div>
{#if config.processing.head_pose.enabled} {#if config.processing.head_pose.enabled}
<div class="setting-row sub-setting"> <div class="sub-settings-group">
<label for="max-yaw"> <div class="setting-row">
<span class="setting-label">Max Yaw</span> <label for="max-yaw">
<span class="setting-hint">Maximum left/right turn angle</span> <span class="setting-label">Max Yaw</span>
</label> <span class="setting-hint">Maximum left/right turn angle</span>
<div class="setting-control"> </label>
<input <div class="setting-control">
id="max-yaw" <input
type="range" id="max-yaw"
bind:value={config.processing.head_pose.max_yaw} type="range"
min="5" bind:value={config.processing.head_pose.max_yaw}
max="90" min="5"
step="5" max="90"
/> step="5"
<span class="value">{config.processing.head_pose.max_yaw.toFixed(0)}°</span> />
<span class="value">{config.processing.head_pose.max_yaw.toFixed(0)}°</span>
</div>
</div>
<div class="setting-row">
<label for="max-pitch">
<span class="setting-label">Max Pitch</span>
<span class="setting-hint">Maximum up/down tilt angle</span>
</label>
<div class="setting-control">
<input
id="max-pitch"
type="range"
bind:value={config.processing.head_pose.max_pitch}
min="5"
max="90"
step="5"
/>
<span class="value">{config.processing.head_pose.max_pitch.toFixed(0)}°</span>
</div>
</div> </div>
</div> </div>
<div class="setting-row sub-setting">
<label for="max-pitch">
<span class="setting-label">Max Pitch</span>
<span class="setting-hint">Maximum up/down tilt angle</span>
</label>
<div class="setting-control">
<input
id="max-pitch"
type="range"
bind:value={config.processing.head_pose.max_pitch}
min="5"
max="90"
step="5"
/>
<span class="value">{config.processing.head_pose.max_pitch.toFixed(0)}°</span>
</div>
</div>
{/if} {/if}
</div> </div>
@ -360,23 +367,25 @@
</div> </div>
{#if config.processing.eye_filter.enabled} {#if config.processing.eye_filter.enabled}
<div class="setting-row sub-setting"> <div class="sub-settings-group">
<label for="min-ear"> <div class="setting-row">
<span class="setting-label">Minimum eye opening</span> <label for="min-ear">
<span class="setting-hint">Discard image if Eye Aspect Ratio is below this value</span> <span class="setting-label">Minimum eye opening</span>
</label> <span class="setting-hint">Discard image if Eye Aspect Ratio is below this value</span>
<div class="setting-control-with-visual"> </label>
<input <div class="setting-control-with-visual">
id="min-ear" <input
type="range" id="min-ear"
bind:value={config.processing.eye_filter.min_ear} type="range"
min="0.1" bind:value={config.processing.eye_filter.min_ear}
max="0.4" min="0.1"
step="0.02" max="0.4"
/> step="0.02"
<span class="value">{config.processing.eye_filter.min_ear.toFixed(2)}</span> />
<div class="inline-visual-indicator"> <span class="value">{config.processing.eye_filter.min_ear.toFixed(2)}</span>
<EyeIndicator ear={config.processing.eye_filter.min_ear} /> <div class="inline-visual-indicator">
<EyeIndicator ear={config.processing.eye_filter.min_ear} />
</div>
</div> </div>
</div> </div>
</div> </div>
@ -451,27 +460,29 @@
</div> </div>
{#if config.processing.time_interval.enabled} {#if config.processing.time_interval.enabled}
<div class="setting-row sub-setting"> <div class="sub-settings-group">
<span class="setting-label">Keep at most</span> <div class="setting-row">
<div class="setting-control"> <span class="setting-label">Keep at most</span>
<input <div class="setting-control">
id="max-photos" <input
type="number" id="max-photos"
class="inline-number" type="number"
bind:value={config.processing.time_interval.max_photos} class="inline-number"
min="1" bind:value={config.processing.time_interval.max_photos}
max="10" min="1"
/> max="10"
<span class="setting-label">photos per</span> />
<div class="toggle-group"> <span class="setting-label">photos per</span>
{#each [['day', 'day'], ['week', 'week'], ['month', 'month']] as [value, label]} <div class="toggle-group">
<button {#each [['day', 'day'], ['week', 'week'], ['month', 'month']] as [value, label]}
type="button" <button
class="toggle-btn-option" type="button"
class:active={config.processing.time_interval.time_range === value} class="toggle-btn-option"
onclick={() => config.processing.time_interval.time_range = value} class:active={config.processing.time_interval.time_range === value}
>{label}</button> onclick={() => config.processing.time_interval.time_range = value}
{/each} >{label}</button>
{/each}
</div>
</div> </div>
</div> </div>
</div> </div>
@ -489,40 +500,42 @@
</div> </div>
{#if config.processing.timestamp.enabled} {#if config.processing.timestamp.enabled}
<div class="setting-row sub-setting"> <div class="sub-settings-group">
<label for="timestamp-position"> <div class="setting-row">
<span class="setting-label">Position</span> <label for="timestamp-position">
<span class="setting-hint">Where to place the timestamp</span> <span class="setting-label">Position</span>
</label> <span class="setting-hint">Where to place the timestamp</span>
<select id="timestamp-position" bind:value={config.processing.timestamp.position}> </label>
<option value="top_left">Top Left</option> <select id="timestamp-position" bind:value={config.processing.timestamp.position}>
<option value="top_right">Top Right</option> <option value="top_left">Top Left</option>
<option value="bottom_left">Bottom Left</option> <option value="top_right">Top Right</option>
<option value="bottom_right">Bottom Right</option> <option value="bottom_left">Bottom Left</option>
</select> <option value="bottom_right">Bottom Right</option>
</div> </select>
</div>
<div class="setting-row sub-setting"> <div class="setting-row">
<span class="setting-label">Date Components</span> <span class="setting-label">Date Components</span>
<div class="toggle-group"> <div class="toggle-group">
<button <button
type="button" type="button"
class="toggle-btn-option" class="toggle-btn-option"
class:active={config.processing.timestamp.year} class:active={config.processing.timestamp.year}
onclick={() => config.processing.timestamp.year = !config.processing.timestamp.year} onclick={() => config.processing.timestamp.year = !config.processing.timestamp.year}
>Year</button> >Year</button>
<button <button
type="button" type="button"
class="toggle-btn-option" class="toggle-btn-option"
class:active={config.processing.timestamp.month} class:active={config.processing.timestamp.month}
onclick={() => config.processing.timestamp.month = !config.processing.timestamp.month} onclick={() => config.processing.timestamp.month = !config.processing.timestamp.month}
>Month</button> >Month</button>
<button <button
type="button" type="button"
class="toggle-btn-option" class="toggle-btn-option"
class:active={config.processing.timestamp.day} class:active={config.processing.timestamp.day}
onclick={() => config.processing.timestamp.day = !config.processing.timestamp.day} onclick={() => config.processing.timestamp.day = !config.processing.timestamp.day}
>Day</button> >Day</button>
</div>
</div> </div>
</div> </div>
{/if} {/if}
@ -533,23 +546,25 @@
<div class="section-header"> <div class="section-header">
<span class="section-title">Final Image Composition</span> <span class="section-title">Final Image Composition</span>
</div> </div>
<div class="setting-row sub-setting"> <div class="sub-settings-group">
<label for="eye-distance"> <div class="setting-row">
<span class="setting-label">Eye Distance</span> <label for="eye-distance">
<span class="setting-hint">Distance between eyes as % of image width (larger = zoom in)</span> <span class="setting-label">Eye Distance</span>
</label> <span class="setting-hint">Distance between eyes as % of image width (larger = zoom in)</span>
<div class="setting-control-with-visual"> </label>
<input <div class="setting-control-with-visual">
id="eye-distance" <input
type="range" id="eye-distance"
bind:value={config.processing.alignment.eye_distance} type="range"
min="0.05" bind:value={config.processing.alignment.eye_distance}
max="0.4" min="0.05"
step="0.01" max="0.4"
/> step="0.01"
<span class="value">{(config.processing.alignment.eye_distance * 100).toFixed(0)}%</span> />
<div class="inline-visual-indicator"> <span class="value">{(config.processing.alignment.eye_distance * 100).toFixed(0)}%</span>
<AlignmentIndicator eyeDistance={config.processing.alignment.eye_distance} /> <div class="inline-visual-indicator">
<AlignmentIndicator eyeDistance={config.processing.alignment.eye_distance} />
</div>
</div> </div>
</div> </div>
</div> </div>
@ -847,7 +862,7 @@
cursor: pointer; cursor: pointer;
} }
.sub-setting { .sub-settings-group {
padding-left: 1.5rem; padding-left: 1.5rem;
border-left: 2px solid #333; border-left: 2px solid #333;
margin-left: 0.75rem; margin-left: 0.75rem;
@ -936,6 +951,7 @@
font-size: 0.875rem; font-size: 0.875rem;
text-align: center; text-align: center;
-moz-appearance: textfield; -moz-appearance: textfield;
appearance: textfield;
} }
.inline-number::-webkit-inner-spin-button, .inline-number::-webkit-inner-spin-button,