{entity === "category"
- ? "A clear home for every transaction. Parent categories roll up their children."
+ ? "Organize spending and income into a tree. Use Add child on any category to create a nested category."
: entity === "tag"
? "Flexible labels that work across your accounts and categories."
: entity === "instrument"
@@ -549,15 +576,18 @@ function RegistryEditor({
-
+
diff --git a/web/src/Transactions.tsx b/web/src/Transactions.tsx
index 612ce9b..5b0e5f6 100644
--- a/web/src/Transactions.tsx
+++ b/web/src/Transactions.tsx
@@ -496,13 +496,17 @@ function TransactionEditor({
)}
{value.kind !== "transfer" && value.kind !== "investment" && (
-
+
setValue((v) => ({ ...v, category_id }))
diff --git a/web/src/styles.css b/web/src/styles.css
index d704a17..ef3ff4a 100644
--- a/web/src/styles.css
+++ b/web/src/styles.css
@@ -903,6 +903,11 @@ tbody tr:hover {
gap: 5px;
align-items: center;
}
+.category-child-action {
+ min-height: 32px;
+ padding: 6px 9px;
+ font-size: 11px;
+}
.modal {
border: 1px solid #dce5eb;
border-radius: 12px;
diff --git a/web/src/ui.tsx b/web/src/ui.tsx
index 9e02156..0edde76 100644
--- a/web/src/ui.tsx
+++ b/web/src/ui.tsx
@@ -730,9 +730,9 @@ export function CategoryOptions({
}
// CategoryCombobox is the one category picker: options are full paths, and
// with a mutate handle an unmatched name can be created in place. A bare name
-// lands under the kind's root; "Parent / Name" creates under that parent.
-// leavesOnly matches the server rule that assigned categories must be leaves;
-// a freshly created category is always a leaf.
+// is offered under each matching root; "Parent / Name" creates under that
+// existing parent. leavesOnly matches the server rule that assigned categories
+// must be leaves; a freshly created category is always a leaf.
export function CategoryCombobox({
data,
value,
@@ -782,7 +782,7 @@ export function CategoryCombobox({
const name = segments[segments.length - 1];
const row = (parent: Category): ComboCreate => ({
key: parent.id,
- label: `Create "${name}" in ${categoryPath(data, parent.id)}`,
+ label: `Create category "${name}" in ${categoryPath(data, parent.id)}`,
run: async () =>
onChange(
await createCategory(mutate, data, {
@@ -813,7 +813,7 @@ export function CategoryCombobox({
placeholder={placeholder}
emptyText={
mutate
- ? "No matching category. Type a name to create it."
+ ? "No match. Type a category name and choose Create category."
: "No matching category."
}
create={create}