@@ -192,9 +193,9 @@ export function CurrencySection() {
0}
title={
used.length > 0
@@ -217,7 +218,7 @@ export function CurrencySection() {
tryEdit(() => mutate((draft) => addCurrency(draft, def)))} />
-
+
-
+
{"{base}"} and {"{targets}"} are substituted. Fetching is optional — the app
works offline with the rates you type in above, and a currency the service
does not know can always be maintained by hand.
-
void refresh()}>
+ void refresh()}>
Fetch rates now
- {status && {status}
}
+ {status && (
+
+ {status}
+
+ )}
);
@@ -277,7 +282,7 @@ function AddCurrency({ onAdd }: { onAdd: (def: { code: Currency; digits: number;
}
return (
-
+
-
-
- Decimals
-
- {
- const next = event.target.value;
- setDigits(next);
- }}
- />
-
+ {/* No visible label. Its three siblings are labelled by placeholder, and
+ the DECIMALS column heading sits directly above this field in the
+ table — a fourth label here read as a heading for the whole row. */}
+
{
+ const next = event.target.value;
+ setDigits(next);
+ }}
+ />
Add currency
diff --git a/src/ui/routes/settings/DataSection.tsx b/src/ui/routes/settings/DataSection.tsx
index df63ba0..e8134f1 100644
--- a/src/ui/routes/settings/DataSection.tsx
+++ b/src/ui/routes/settings/DataSection.tsx
@@ -122,7 +122,6 @@ export function DataSection() {
title="Your data"
hint="Everything lives in this browser. Export regularly — it is both your backup and how you move your budget to another device."
>
-
Export JSON
@@ -135,7 +134,7 @@ export function DataSection() {
{
setError(null);
setPending(null);
@@ -160,7 +159,7 @@ export function DataSection() {
{error && {error}
}
{confirmingReset && (
-
+
This deletes everything in this browser.
Now: {counts.posts} posts, {counts.months} months, {counts.purchases} purchases,{" "}
@@ -186,7 +185,7 @@ export function DataSection() {
)}
{pending && (
-
+
This replaces everything currently stored.
Now: {counts.posts} posts, {counts.months} months, {counts.purchases} purchases.
diff --git a/src/ui/routes/settings/PostsSection.tsx b/src/ui/routes/settings/PostsSection.tsx
index f74dbeb..9d06856 100644
--- a/src/ui/routes/settings/PostsSection.tsx
+++ b/src/ui/routes/settings/PostsSection.tsx
@@ -1,6 +1,7 @@
import { Fragment, useState } from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
+import { NativeSelect } from "@/components/ui/native-select";
import { useDataset } from "../../hooks/useDataset.ts";
import { useMutate } from "../../hooks/useMutate.ts";
import { addPost, movePost, setPostArchived, updatePost } from "../../../store/actions.ts";
@@ -39,7 +40,6 @@ export function PostsSection() {
title="Posts"
hint="A post's allocation is a dated series: each rule applies from its own month onward until the next one takes over, so changing it never rewrites what earlier months got. Click a rule to see and edit that history. A single month can still override its own allocation from the month view, and percentages may total more than 100%."
>
-
@@ -64,8 +64,9 @@ export function PostsSection() {
/>
- {
const currency = event.target.value as Currency;
@@ -77,33 +78,45 @@ export function PostsSection() {
{currency}
))}
-
+
-
setOpenHistory((id) => (id === post.id ? null : post.id))
}
>
{ruleSummary(post)}
-
+
-
- mutate((draft) => movePost(draft, post.id, -1))}>
- up
-
- mutate((draft) => movePost(draft, post.id, 1))}>
- down
-
- mutate((draft) => setPostArchived(draft, post.id, !post.archived))}>
- {post.archived ? "restore" : "archive"}
-
+
+ {/* Three inline-flex siblings with nothing between them: the
+ hover backgrounds touched, so the row read as one wide
+ slab rather than three actions. */}
+
+ mutate((draft) => movePost(draft, post.id, -1))}>
+ up
+
+ mutate((draft) => movePost(draft, post.id, 1))}>
+ down
+
+ mutate((draft) => setPostArchived(draft, post.id, !post.archived))}>
+ {post.archived ? "restore" : "archive"}
+
+
{openHistory === post.id && (
@@ -117,12 +130,12 @@ export function PostsSection() {
))}
-
+
Archiving hides a post from new purchases while keeping its history. Posts
are never deleted, because purchases reference them.
-