diff --git a/frontend/src/lib/components/BlindStructureEditor.svelte b/frontend/src/lib/components/BlindStructureEditor.svelte
new file mode 100644
index 0000000..f362768
--- /dev/null
+++ b/frontend/src/lib/components/BlindStructureEditor.svelte
@@ -0,0 +1,564 @@
+
+
+
+
Blind Structure Editor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if oncancel}
+
+ {/if}
+
+
+
+
diff --git a/frontend/src/lib/components/StructureWizard.svelte b/frontend/src/lib/components/StructureWizard.svelte
new file mode 100644
index 0000000..2e41942
--- /dev/null
+++ b/frontend/src/lib/components/StructureWizard.svelte
@@ -0,0 +1,580 @@
+
+
+
+
Structure Wizard
+
Generate a blind structure from tournament parameters.
+
+
+
+
+
+
+
+
+ {#if hasGenerated}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if onusetemplate}
+
+ {/if}
+
+
+ {/if}
+
+ {#if oncancel}
+
+ {/if}
+
+
+
diff --git a/frontend/src/lib/components/TemplateManager.svelte b/frontend/src/lib/components/TemplateManager.svelte
new file mode 100644
index 0000000..a8cdb6c
--- /dev/null
+++ b/frontend/src/lib/components/TemplateManager.svelte
@@ -0,0 +1,514 @@
+
+
+
+
{isNew ? 'Create Template' : 'Edit Template'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Building Blocks
+
+
+
+
+
+ {#if form.chip_set_id}
+
{getBlockSummary(chipSets, form.chip_set_id)}
+ {/if}
+
+
+
+
+
+
+ {#if form.blind_structure_id}
+
{getBlockSummary(blindStructures, form.blind_structure_id)}
+ {/if}
+
+
+
+
+
+
+ {#if form.payout_structure_id}
+
{getBlockSummary(payoutStructures, form.payout_structure_id)}
+ {/if}
+
+
+
+
+
+
+ {#if form.buyin_config_id}
+
{getBlockSummary(buyinConfigs, form.buyin_config_id)}
+ {/if}
+
+
+
+
+
+
+ {#if form.points_formula_id}
+
{getBlockSummary(pointsFormulas, form.points_formula_id)}
+ {/if}
+
+
+
+
+
+
Tournament Options
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if oncancel}
+
+ {/if}
+
+
+
+
diff --git a/frontend/src/routes/more/+page.svelte b/frontend/src/routes/more/+page.svelte
index b9c8506..4380e31 100644
--- a/frontend/src/routes/more/+page.svelte
+++ b/frontend/src/routes/more/+page.svelte
@@ -1,7 +1,39 @@
+
+
+
Audit Log
+
Action history with undo capability.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
[]}
+ sortable={true}
+ searchable={true}
+ loading={false}
+ emptyMessage="No audit entries match your filters."
+ rowKey={(item) => String(item['id'])}
+ onrowclick={handleRowClick}
+ />
+
+
+ {#if selectedEntry}
+
+
+
+
+
+
+
+
Details
+
{JSON.stringify(JSON.parse(selectedEntry.details), null, 2)}
+
+
+ {#if selectedEntry.undoable && !selectedEntry.undone}
+
+ {:else if selectedEntry.undone}
+
This action has been undone.
+ {/if}
+
+
+ {/if}
+
+
+
diff --git a/frontend/src/routes/more/settings/+page.svelte b/frontend/src/routes/more/settings/+page.svelte
new file mode 100644
index 0000000..76f5352
--- /dev/null
+++ b/frontend/src/routes/more/settings/+page.svelte
@@ -0,0 +1,395 @@
+
+
+
+
Venue Settings
+
Configure your poker room.
+
+
+
+
+ {#if auth.isAdmin}
+
+
Operators
+
Manage floor staff (admin only).
+
+
+
+
+ {auth.operator?.name ?? 'Admin'}
+ admin
+
+
You
+
+
+
+ Floor Manager
+ floor
+
+
+
+
+
+ {/if}
+
+
+
diff --git a/frontend/src/routes/more/structures/+page.svelte b/frontend/src/routes/more/structures/+page.svelte
new file mode 100644
index 0000000..af5f70a
--- /dev/null
+++ b/frontend/src/routes/more/structures/+page.svelte
@@ -0,0 +1,189 @@
+
+
+
+ {#if mode === 'list'}
+
+
+ []}
+ sortable={true}
+ searchable={true}
+ loading={false}
+ emptyMessage="No blind structures. Create one or use the wizard."
+ rowKey={(item) => String(item['id'])}
+ onrowclick={handleEdit}
+ swipeActions={[
+ { id: 'delete', label: 'Delete', color: 'var(--color-error)', handler: handleDelete }
+ ]}
+ />
+ {:else if mode === 'edit'}
+
+ {:else if mode === 'wizard'}
+
+ {/if}
+
+
+
diff --git a/frontend/src/routes/more/templates/+page.svelte b/frontend/src/routes/more/templates/+page.svelte
new file mode 100644
index 0000000..d489efe
--- /dev/null
+++ b/frontend/src/routes/more/templates/+page.svelte
@@ -0,0 +1,165 @@
+
+
+
+ {#if mode === 'list'}
+
+
+ []}
+ sortable={true}
+ searchable={true}
+ loading={false}
+ emptyMessage="No templates yet. Create one to get started."
+ rowKey={(item) => String(item['id'])}
+ onrowclick={handleEdit}
+ swipeActions={[
+ { id: 'duplicate', label: 'Duplicate', color: 'var(--color-primary)', handler: handleDuplicate },
+ { id: 'delete', label: 'Delete', color: 'var(--color-error)', handler: handleDelete }
+ ]}
+ />
+ {:else}
+
+ {/if}
+
+
+