From 5534fd7d889c68b4a1d4e0d78eac48885c131e36 Mon Sep 17 00:00:00 2001 From: Jakob Schnitzer Date: Wed, 17 Dec 2025 22:26:00 +0100 Subject: [PATCH] frontend: use flex gap, adjust add entry components - Use flex with a gap instead of margins on the children. - Adjust input sizes on entry form - bigger metadata and bigger metadata value field - more space for narration compared to payee - refactor AutocompleteInput component to be more modifiable via CSS variables --- frontend/css/base.css | 10 +- frontend/css/grid.css | 50 ++++++---- frontend/src/AutocompleteInput.svelte | 14 +-- frontend/src/charts/Chart.svelte | 4 + frontend/src/charts/ChartSwitcher.svelte | 3 +- frontend/src/editor/SliceEditor.svelte | 7 +- frontend/src/entry-forms/AccountInput.svelte | 11 +-- frontend/src/entry-forms/Balance.svelte | 12 +-- frontend/src/entry-forms/EntryMetadata.svelte | 8 +- frontend/src/entry-forms/Note.svelte | 11 +-- frontend/src/entry-forms/Posting.svelte | 26 +++-- frontend/src/entry-forms/Transaction.svelte | 27 ++---- frontend/src/modals/AddEntry.svelte | 6 +- frontend/src/reports/import/Extract.svelte | 6 +- frontend/src/reports/import/FileList.svelte | 97 ++++++++++--------- frontend/src/reports/import/Import.svelte | 31 +++--- .../src/reports/journal/JournalHeaders.svelte | 2 +- frontend/src/sidebar/AccountSelector.svelte | 8 +- frontend/src/sidebar/FilterForm.svelte | 11 +-- 19 files changed, 156 insertions(+), 188 deletions(-) diff --git a/frontend/css/base.css b/frontend/css/base.css index 4ab0c26d4..15a9f1354 100644 --- a/frontend/css/base.css +++ b/frontend/css/base.css @@ -20,8 +20,7 @@ ol, ul, dl, table, -pre, -hr { +pre { padding: 0; margin: 0 0 1rem; list-style-type: none; @@ -122,11 +121,14 @@ h3 { h4, h5 { + margin: 0; font-size: 1em; font-weight: 500; } hr { + padding: 0; + margin: 0; border: 1px solid var(--border); } @@ -169,9 +171,9 @@ textarea { input, textarea { - padding: 6px 10px; + padding: var(--input-padding, 6px 10px); background: var(--placeholder-background); - border: 1px solid var(--border-darker); + border: var(--input-border, 1px solid var(--border-darker)); } label { diff --git a/frontend/css/grid.css b/frontend/css/grid.css index 5bd192cbf..112a399af 100644 --- a/frontend/css/grid.css +++ b/frontend/css/grid.css @@ -1,30 +1,38 @@ -.flex-row { - display: flex; - flex-wrap: wrap; - align-items: center; - margin: 0 -0.25rem; +:root { + --flex-gap: 0.5rem; } -.flex-row > * { - margin: 0.25rem; -} +.flex-column { + display: flex; + flex-direction: column; + gap: var(--flex-gap); -.flex-row > label { - display: contents; + > h3 { + margin: 0; + } } -.flex-row > label > * { - margin: 0.25rem; -} +.flex-row { + display: flex; + flex-wrap: wrap; + gap: var(--flex-gap); + align-items: center; -.flex-row .grow { - flex-grow: 1; -} + > h3 { + margin: 0; + } -.remove-row { - opacity: 0; -} + > label { + display: contents; + } + + @media (hover: hover) and (width > 767px) { + .remove-row { + opacity: 0; + } + } -.flex-row:hover .remove-row { - opacity: 1; + &:hover .remove-row { + opacity: 1; + } } diff --git a/frontend/src/AutocompleteInput.svelte b/frontend/src/AutocompleteInput.svelte index b96b78f76..5af1e507b 100644 --- a/frontend/src/AutocompleteInput.svelte +++ b/frontend/src/AutocompleteInput.svelte @@ -33,8 +33,6 @@ valueSelector?: (val: string, input: HTMLInputElement) => string; /** Automatically adjust the size of the input element. */ setSize?: boolean; - /** An optional class name to assign to the input element. */ - className?: string | undefined; /** A key binding to add for this input. */ key?: KeySpec; /** A function that checks the entered value for validity. */ @@ -58,7 +56,6 @@ valueExtractor, valueSelector, setSize = false, - className, key, checkValidity, clearButton = false, @@ -152,7 +149,7 @@ } - + diff --git a/frontend/src/entry-forms/AccountInput.svelte b/frontend/src/entry-forms/AccountInput.svelte index a8e52df46..8d333a3a2 100644 --- a/frontend/src/entry-forms/AccountInput.svelte +++ b/frontend/src/entry-forms/AccountInput.svelte @@ -12,19 +12,11 @@ suggestions?: string[] | undefined; /** The date to enter this account for to exclude closed accounts. */ date?: string | undefined; - /** An optional class name to assign to the input element. */ - className?: string; /** Whether to mark the input as required. */ required?: boolean; } - let { - value = $bindable(), - suggestions, - date, - className, - required, - }: Props = $props(); + let { value = $bindable(), suggestions, date, required }: Props = $props(); let checkValidity = $derived((val: string) => !$accounts_set.size || $accounts_set.has(val) || (required !== true && !val) @@ -46,7 +38,6 @@ -
+

{_("Balance")}

entry.account, (account: string) => { @@ -37,6 +36,7 @@ } date={entry.date} required + --autocomplete-wrapper-flex="1" />
- - diff --git a/frontend/src/entry-forms/EntryMetadata.svelte b/frontend/src/entry-forms/EntryMetadata.svelte index f118e8730..b697e1dd3 100644 --- a/frontend/src/entry-forms/EntryMetadata.svelte +++ b/frontend/src/entry-forms/EntryMetadata.svelte @@ -33,6 +33,7 @@ }} required /> + : { meta = meta.add(); }} + aria-label={_("Add metadata")} title={_("Add metadata")} > + @@ -59,17 +61,15 @@ diff --git a/frontend/src/entry-forms/Posting.svelte b/frontend/src/entry-forms/Posting.svelte index b5ec16bf8..315153b14 100644 --- a/frontend/src/entry-forms/Posting.svelte +++ b/frontend/src/entry-forms/Posting.svelte @@ -86,7 +86,6 @@ × posting.account, (account: string) => { @@ -95,9 +94,9 @@ } {suggestions} {date} + --autocomplete-wrapper-flex="2" /> - posting.meta, - (meta: EntryMetadata) => { - posting = posting.set("meta", meta); - } - } - />
+ posting.meta, + (meta: EntryMetadata) => { + posting = posting.set("meta", meta); + } + } +/> diff --git a/frontend/src/reports/import/FileList.svelte b/frontend/src/reports/import/FileList.svelte index a2e2ef3eb..b770d962c 100644 --- a/frontend/src/reports/import/FileList.svelte +++ b/frontend/src/reports/import/FileList.svelte @@ -50,69 +50,70 @@ ×
- {#each file.importers as info (info.importer_name)} - {@const file_importer_key = `${file.name}:${info.importer_name}`} - {@const account = file_accounts.get(file_importer_key) ?? info.account} - {@const new_name = file_names.get(file_importer_key) ?? info.newName} -
{ - event.preventDefault(); - move(file.name, account, new_name); - }} - > - account, - (value: string) => { - file_accounts.set(file_importer_key, value); +
+ {#each file.importers as info (info.importer_name)} + {@const file_importer_key = `${file.name}:${info.importer_name}`} + {@const account = file_accounts.get(file_importer_key) ?? info.account} + {@const new_name = file_names.get(file_importer_key) ?? info.newName} + { + event.preventDefault(); + move(file.name, account, new_name); + }} + > + account, + (value: string) => { + file_accounts.set(file_importer_key, value); + } } - } - required - /> - new_name, - (value: string) => { - file_names.set(file_importer_key, value); + required + /> + new_name, + (value: string) => { + file_names.set(file_importer_key, value); + } } - } - /> - - {#if info.importer_name} - {@const is_cached = extract_cache.has(file_importer_key)} - - {#if is_cached} + {#if info.importer_name} + {@const is_cached = extract_cache.has(file_importer_key)} + {#if is_cached} + + {/if} + {info.importer_name} {/if} - {info.importer_name} - {/if} - - {/each} + + {/each} +
{/each} diff --git a/frontend/src/reports/journal/JournalHeaders.svelte b/frontend/src/reports/journal/JournalHeaders.svelte index 18fe05d98..710d53248 100644 --- a/frontend/src/reports/journal/JournalHeaders.svelte +++ b/frontend/src/reports/journal/JournalHeaders.svelte @@ -64,7 +64,7 @@ diff --git a/frontend/src/sidebar/FilterForm.svelte b/frontend/src/sidebar/FilterForm.svelte index be2a2445c..343bf76a3 100644 --- a/frontend/src/sidebar/FilterForm.svelte +++ b/frontend/src/sidebar/FilterForm.svelte @@ -76,6 +76,7 @@
{ ev.preventDefault(); submit(); @@ -122,14 +123,11 @@