diff --git a/src/app.css b/src/app.css
index d4b5078..1da4f67 100644
--- a/src/app.css
+++ b/src/app.css
@@ -1 +1,31 @@
@import 'tailwindcss';
+
+@custom-variant dark (&:where(.dark, .dark *));
+
+:root {
+ --bg: #fafafa;
+ --bg-card: #ffffff;
+ --bg-input: #ffffff;
+ --border: #d4d4d4;
+ --text: #171717;
+ --text-muted: #737373;
+ --accent: #0066cc;
+ --accent-hover: #0052a3;
+}
+
+.dark {
+ --bg: #0a0a0a;
+ --bg-card: #171717;
+ --bg-input: #0a0a0a;
+ --border: #2e2e2e;
+ --text: #e5e5e5;
+ --text-muted: #a3a3a3;
+ --accent: #4da6ff;
+ --accent-hover: #80bfff;
+}
+
+body {
+ background-color: var(--bg);
+ color: var(--text);
+ font-family: system-ui, -apple-system, sans-serif;
+}
diff --git a/src/lib/components/CharacterSwitcher.svelte b/src/lib/components/CharacterSwitcher.svelte
new file mode 100644
index 0000000..c1da745
--- /dev/null
+++ b/src/lib/components/CharacterSwitcher.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+ {#if roster.active}
+
+ {/if}
+
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte
new file mode 100644
index 0000000..9ce267a
--- /dev/null
+++ b/src/lib/components/Header.svelte
@@ -0,0 +1,41 @@
+
+
+
diff --git a/src/lib/components/fields/CheckboxField.svelte b/src/lib/components/fields/CheckboxField.svelte
new file mode 100644
index 0000000..064707b
--- /dev/null
+++ b/src/lib/components/fields/CheckboxField.svelte
@@ -0,0 +1,29 @@
+
+
+
diff --git a/src/lib/components/fields/CitizenshipField.svelte b/src/lib/components/fields/CitizenshipField.svelte
new file mode 100644
index 0000000..56c817d
--- /dev/null
+++ b/src/lib/components/fields/CitizenshipField.svelte
@@ -0,0 +1,21 @@
+
+
+
diff --git a/src/lib/components/fields/DateField.svelte b/src/lib/components/fields/DateField.svelte
new file mode 100644
index 0000000..ac159f6
--- /dev/null
+++ b/src/lib/components/fields/DateField.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/fields/DynamicField.svelte b/src/lib/components/fields/DynamicField.svelte
new file mode 100644
index 0000000..79ba58b
--- /dev/null
+++ b/src/lib/components/fields/DynamicField.svelte
@@ -0,0 +1,53 @@
+
+
+{#if field.type === 'text'}
+
+{:else if field.type === 'textarea'}
+
+{:else if field.type === 'list'}
+
+{:else if field.type === 'number'}
+
+{:else if field.type === 'select'}
+
+{:else if field.type === 'multi-select'}
+
+{:else if field.type === 'checkbox'}
+
+{:else if field.type === 'date'}
+
+{:else if field.type === 'height'}
+
+{:else if field.type === 'weight'}
+
+{:else if field.type === 'species'}
+
+{:else if field.type === 'subspecies'}
+
+{:else if field.type === 'citizenship'}
+
+{:else if field.type === 'languages'}
+
+{/if}
diff --git a/src/lib/components/fields/HeightField.svelte b/src/lib/components/fields/HeightField.svelte
new file mode 100644
index 0000000..77fc2e2
--- /dev/null
+++ b/src/lib/components/fields/HeightField.svelte
@@ -0,0 +1,25 @@
+
+
+
diff --git a/src/lib/components/fields/LanguagesField.svelte b/src/lib/components/fields/LanguagesField.svelte
new file mode 100644
index 0000000..5c652f3
--- /dev/null
+++ b/src/lib/components/fields/LanguagesField.svelte
@@ -0,0 +1,34 @@
+
+
+
diff --git a/src/lib/components/fields/ListField.svelte b/src/lib/components/fields/ListField.svelte
new file mode 100644
index 0000000..2df87c6
--- /dev/null
+++ b/src/lib/components/fields/ListField.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/fields/NumberField.svelte b/src/lib/components/fields/NumberField.svelte
new file mode 100644
index 0000000..099eb1d
--- /dev/null
+++ b/src/lib/components/fields/NumberField.svelte
@@ -0,0 +1,23 @@
+
+
+
diff --git a/src/lib/components/fields/SelectField.svelte b/src/lib/components/fields/SelectField.svelte
new file mode 100644
index 0000000..29597dd
--- /dev/null
+++ b/src/lib/components/fields/SelectField.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/lib/components/fields/SpeciesField.svelte b/src/lib/components/fields/SpeciesField.svelte
new file mode 100644
index 0000000..71ad060
--- /dev/null
+++ b/src/lib/components/fields/SpeciesField.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+ {#if selected?.description}
+
{selected.description}
+ {/if}
+
diff --git a/src/lib/components/fields/SubspeciesField.svelte b/src/lib/components/fields/SubspeciesField.svelte
new file mode 100644
index 0000000..1ef69ee
--- /dev/null
+++ b/src/lib/components/fields/SubspeciesField.svelte
@@ -0,0 +1,39 @@
+
+
+{#if subs.length > 0}
+
+
+ {#if selected?.description}
+
{selected.description}
+ {/if}
+
+{/if}
diff --git a/src/lib/components/fields/TextField.svelte b/src/lib/components/fields/TextField.svelte
new file mode 100644
index 0000000..20abf12
--- /dev/null
+++ b/src/lib/components/fields/TextField.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/fields/TextareaField.svelte b/src/lib/components/fields/TextareaField.svelte
new file mode 100644
index 0000000..d149ff5
--- /dev/null
+++ b/src/lib/components/fields/TextareaField.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/fields/WeightField.svelte b/src/lib/components/fields/WeightField.svelte
new file mode 100644
index 0000000..134f6c5
--- /dev/null
+++ b/src/lib/components/fields/WeightField.svelte
@@ -0,0 +1,25 @@
+
+
+
diff --git a/src/lib/theme.svelte.ts b/src/lib/theme.svelte.ts
new file mode 100644
index 0000000..e177190
--- /dev/null
+++ b/src/lib/theme.svelte.ts
@@ -0,0 +1,25 @@
+let dark = $state(false);
+
+export const theme = {
+ get dark() { return dark; },
+
+ init() {
+ const stored = localStorage.getItem('theme');
+ if (stored) {
+ dark = stored === 'dark';
+ } else {
+ dark = window.matchMedia('(prefers-color-scheme: dark)').matches;
+ }
+ apply();
+ },
+
+ toggle() {
+ dark = !dark;
+ localStorage.setItem('theme', dark ? 'dark' : 'light');
+ apply();
+ }
+};
+
+function apply() {
+ document.documentElement.classList.toggle('dark', dark);
+}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 726b46c..75bdeca 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,6 +1,19 @@
-{@render children()}
+{#if ready}
+ {@render children()}
+{/if}
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index b460dbd..c2d3713 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1 +1,50 @@
-Aurora Character Records Generator
+
+
+
+
+
+
+ {#if roster.active}
+ {@const char = roster.active}
+
+ {#each char.template.records as record}
+
+
+ {record.type}
+
+
+ {#each record.fields as field}
+ {
+ char.data[slugify(field.label)] = v;
+ roster.scheduleSave(char);
+ }}
+ />
+ {/each}
+
+
+ {/each}
+
+ {:else}
+
+
No characters yet.
+
+
+ {/if}
+
+