diff --git a/src/client/components/CollectionView.tsx b/src/client/components/CollectionView.tsx
index b337d23..f3f4d51 100644
--- a/src/client/components/CollectionView.tsx
+++ b/src/client/components/CollectionView.tsx
@@ -224,6 +224,7 @@ export function CollectionView() {
name={item.name}
weightGrams={item.weightGrams}
priceCents={item.priceCents}
+ quantity={item.quantity}
categoryName={item.categoryName}
categoryIcon={item.categoryIcon}
imageFilename={item.imageFilename}
@@ -257,6 +258,7 @@ export function CollectionView() {
name={item.name}
weightGrams={item.weightGrams}
priceCents={item.priceCents}
+ quantity={item.quantity}
categoryName={categoryName}
categoryIcon={categoryIcon}
imageFilename={item.imageFilename}
diff --git a/src/client/components/ItemCard.tsx b/src/client/components/ItemCard.tsx
index 03f4b49..e6383ee 100644
--- a/src/client/components/ItemCard.tsx
+++ b/src/client/components/ItemCard.tsx
@@ -8,6 +8,7 @@ interface ItemCardProps {
name: string;
weightGrams: number | null;
priceCents: number | null;
+ quantity?: number;
categoryName: string;
categoryIcon: string;
imageFilename: string | null;
@@ -22,6 +23,7 @@ export function ItemCard({
name,
weightGrams,
priceCents,
+ quantity,
categoryName,
categoryIcon,
imageFilename,
@@ -122,9 +124,16 @@ export function ItemCard({
)}
-
- {name}
-
+
+
+ {name}
+
+ {quantity != null && quantity > 1 && (
+
+ ×{quantity}
+
+ )}
+
{weightGrams != null && (
diff --git a/src/client/components/ItemForm.tsx b/src/client/components/ItemForm.tsx
index fbb2ec2..dc2d127 100644
--- a/src/client/components/ItemForm.tsx
+++ b/src/client/components/ItemForm.tsx
@@ -13,6 +13,7 @@ interface FormData {
name: string;
weightGrams: string;
priceDollars: string;
+ quantity: number;
categoryId: number;
notes: string;
productUrl: string;
@@ -23,6 +24,7 @@ const INITIAL_FORM: FormData = {
name: "",
weightGrams: "",
priceDollars: "",
+ quantity: 1,
categoryId: 1,
notes: "",
productUrl: "",
@@ -49,6 +51,7 @@ export function ItemForm({ mode, itemId }: ItemFormProps) {
weightGrams: item.weightGrams != null ? String(item.weightGrams) : "",
priceDollars:
item.priceCents != null ? (item.priceCents / 100).toFixed(2) : "",
+ quantity: item.quantity ?? 1,
categoryId: item.categoryId,
notes: item.notes ?? "",
productUrl: item.productUrl ?? "",
@@ -98,6 +101,7 @@ export function ItemForm({ mode, itemId }: ItemFormProps) {
priceCents: form.priceDollars
? Math.round(Number(form.priceDollars) * 100)
: undefined,
+ quantity: form.quantity,
categoryId: form.categoryId,
notes: form.notes.trim() || undefined,
productUrl: form.productUrl.trim() || undefined,
@@ -202,6 +206,30 @@ export function ItemForm({ mode, itemId }: ItemFormProps) {
)}
+ {/* Quantity */}
+
+
+
+ setForm((f) => ({
+ ...f,
+ quantity: Math.max(1, Number(e.target.value) || 1),
+ }))
+ }
+ className="w-full px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-gray-400 focus:border-transparent"
+ />
+
+
{/* Category */}