Household inventory at a glance.
+
+
SolidHaus
+
Household inventory at a glance
+
+
+
+
+ {#each stats as stat}
+
+
{stat.value}
+
{stat.label}
+
+ {/each}
+
+
+
+ {#if inventory.checkedOutItems.length > 0}
+
+ Checked Out
+
+ {#each inventory.checkedOutItems.slice(0, 5) as item}
+ goto(`/items/${item.shortId}`)} />
+ {/each}
+
+
+ {/if}
+
+
+ {#if inventory.lowStockItems.length > 0}
+
+ Low Stock
+
+ {#each inventory.lowStockItems.slice(0, 5) as item}
+ goto(`/items/${item.shortId}`)} />
+ {/each}
+
+
+ {/if}
+
+
+ {#if recentItems.length > 0}
+
+ Recently Updated
+
+ {#each recentItems as item}
+ goto(`/items/${item.shortId}`)} />
+ {/each}
+
+
+ {:else}
+
+
No items yet. Start by scanning or adding an item.
+
+ Add First Item
+
+
+ {/if}
diff --git a/src/routes/items/+page.svelte b/src/routes/items/+page.svelte
index 0e63e9c..7c7d283 100644
--- a/src/routes/items/+page.svelte
+++ b/src/routes/items/+page.svelte
@@ -1,7 +1,143 @@
-
-
Items
-
Browse and manage your inventory.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each filteredItems() as item (item.shortId)}
+
goto(`/items/${item.shortId}`)} />
+ {:else}
+
+ {search || categoryFilter || typeFilter || custodyFilter
+ ? 'No items match your filters'
+ : 'No items yet'}
+
+ {/each}
+
+
+
+ {filteredItems().length} of {inventory.items.length} items
+
diff --git a/src/routes/items/[id]/+page.svelte b/src/routes/items/[id]/+page.svelte
index c7b6856..88c242a 100644
--- a/src/routes/items/[id]/+page.svelte
+++ b/src/routes/items/[id]/+page.svelte
@@ -1,8 +1,239 @@
-
-
Item Detail
-
{$page.params.id}
-
+{#if !item}
+
+
Item not found
+
Back to items
+
+{:else if editing}
+
+
Edit Item
+ (editing = false)} />
+
+{:else}
+
+
+
+
+
← Back
+
{item.name}
+ {#if item.category}
+
{item.category}
+ {/if}
+
+
{item.shortId}
+
+
+
+
+
+
+
+
+
+
+ {#if item.description}
+
+
Description
+
{item.description}
+
+ {/if}
+
+ Location
+ {locationName}
+
+ {#if item.lastSeenTimestamp}
+
+ Last Seen
+
+ {formatDistanceToNow(new Date(item.lastSeenTimestamp), { addSuffix: true })}
+
+
+ {/if}
+
+ Type
+ {item.itemType}
+
+
+ Storage Tier
+ {item.storageTier}
+
+ {#if item.brand}
+
+ Brand
+ {item.brand}
+
+ {/if}
+ {#if item.serialNumber}
+
+ Serial
+ {item.serialNumber}
+
+ {/if}
+ {#if item.color}
+
+ Color
+ {item.color}
+
+ {/if}
+
+
+
+ {#if item.currentQuantity != null && item.originalQuantity}
+ {@const percent = Math.round((item.currentQuantity / item.originalQuantity) * 100)}
+
+
+ Quantity
+
+ {item.currentQuantity}{item.quantityUnit ? ` ${item.quantityUnit}` : ''} / {item.originalQuantity}
+
+
+
+
+ {/if}
+
+
+ {#if item.custodyState === 'checked-in'}
+ {#if showCheckOut}
+
+
Check Out
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {:else}
+
+ {/if}
+ {:else}
+
+
Check In
+
+
+
+
+
+
+ {/if}
+
+
+
+
+ {#if !confirmDelete}
+
+ {:else}
+
+ {/if}
+
+
+
+
+
+{/if}
diff --git a/src/routes/items/new/+page.svelte b/src/routes/items/new/+page.svelte
index 9764867..26da338 100644
--- a/src/routes/items/new/+page.svelte
+++ b/src/routes/items/new/+page.svelte
@@ -1,7 +1,50 @@
New Item
-
Add a new item to your inventory.
+
goto('/items')} />
diff --git a/src/routes/labels/+page.svelte b/src/routes/labels/+page.svelte
index aef585f..e0752c6 100644
--- a/src/routes/labels/+page.svelte
+++ b/src/routes/labels/+page.svelte
@@ -1,7 +1,134 @@
-
-
Labels
-
Generate and print barcode label sheets.
+
+
Labels
+
+ {#if error}
+
+ {error}
+
+ {/if}
+
+
+
+
+
{unassigned.length}
+
Available IDs
+
+
+
{inventory.items.length}
+
Assigned Items
+
+
+
+
+
+
Generate ID Batch
+
+ Pre-generate IDs for label printing. IDs can be assigned to items later when scanned.
+
+
+
+
+
+
+
+
+
+
+
+
+
Print Label Sheet
+
+ Generate a PDF with QR code stickers for all unassigned IDs ({unassigned.length} labels).
+
+
+
+
+
+ {#if unassigned.length > 0}
+
+
Unassigned IDs
+
+ {#each unassigned as entry}
+ {entry.id}
+ {/each}
+
+
+ {/if}
diff --git a/src/routes/locations/+page.svelte b/src/routes/locations/+page.svelte
index 2f60ed3..d00662f 100644
--- a/src/routes/locations/+page.svelte
+++ b/src/routes/locations/+page.svelte
@@ -1,7 +1,54 @@
-
-
Places
-
Manage your locations and rooms.
+
+
Places
+
+
+
+
+
+
+
+
+ {#if selectedLocation}
+
+
+
{selectedLocation.name}
+ {itemsAtLocation.length} items
+
+
+ {#if selectedLocation.description}
+
{selectedLocation.description}
+ {/if}
+
+
+ {#each itemsAtLocation as item}
+
goto(`/items/${item.shortId}`)} />
+ {:else}
+ No items here
+ {/each}
+
+
+ {:else}
+
+ Select a location to view items
+
+ {/if}
+
diff --git a/src/routes/scan/+page.svelte b/src/routes/scan/+page.svelte
index 90f3016..ed84c99 100644
--- a/src/routes/scan/+page.svelte
+++ b/src/routes/scan/+page.svelte
@@ -1,7 +1,192 @@
-
-
Scan
-
Scan a barcode to look up or check in/out an item.
+
+
Scan
+
+ {#if !scannedItem}
+
+
+ {#if scanError}
+
+ {/if}
+ {:else}
+
+
+
goto(`/items/${scannedItem!.shortId}`)} />
+
+ {#if scannedItem.custodyState === 'checked-in'}
+
+ {#if !showCheckOut}
+
+
+
+
+ {:else}
+
+
Check Out
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/if}
+ {:else}
+
+
+
Check In
+
+ Currently {scannedItem.checkedOutReason ?? 'out'}
+ {#if scannedItem.checkedOutFrom}
+ from {inventory.locations.find((l) => l.id === scannedItem!.checkedOutFrom)?.name ?? scannedItem.checkedOutFrom}
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+
+ {/if}
+
+ {/if}
diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte
index 51a0e87..a3033ab 100644
--- a/src/routes/settings/+page.svelte
+++ b/src/routes/settings/+page.svelte
@@ -1,7 +1,42 @@
-
-
Settings
-
App configuration and sync settings.
+
+
Settings
+
+
+
+
Database
+
+ Items
+ {itemCount}
+
+
+ Locations
+ {locationCount}
+
+
+
+
+
+
Sync
+
+ Automerge CRDT sync and Solid Pod integration will be available in a future update.
+
+
+
+
+
+
About
+
+ SolidHaus v0.1.0 — Local-first household inventory
+
+
+ Data is stored locally in IndexedDB. No data leaves your device.
+
+