From 3c6a31f86b0aa000b5bcc9ba7b38d049db4afda2 Mon Sep 17 00:00:00 2001 From: lew Date: Mon, 23 Mar 2026 18:36:31 +0000 Subject: [PATCH] feat(fend): skeleton implementation of the form from XML --- src/app.css | 30 +++++++++++ src/lib/components/CharacterSwitcher.svelte | 38 +++++++++++++ src/lib/components/Header.svelte | 41 ++++++++++++++ .../components/fields/CheckboxField.svelte | 29 ++++++++++ .../components/fields/CitizenshipField.svelte | 21 ++++++++ src/lib/components/fields/DateField.svelte | 17 ++++++ src/lib/components/fields/DynamicField.svelte | 53 +++++++++++++++++++ src/lib/components/fields/HeightField.svelte | 25 +++++++++ .../components/fields/LanguagesField.svelte | 34 ++++++++++++ src/lib/components/fields/ListField.svelte | 17 ++++++ src/lib/components/fields/NumberField.svelte | 23 ++++++++ src/lib/components/fields/SelectField.svelte | 20 +++++++ src/lib/components/fields/SpeciesField.svelte | 28 ++++++++++ .../components/fields/SubspeciesField.svelte | 39 ++++++++++++++ src/lib/components/fields/TextField.svelte | 17 ++++++ .../components/fields/TextareaField.svelte | 17 ++++++ src/lib/components/fields/WeightField.svelte | 25 +++++++++ src/lib/theme.svelte.ts | 25 +++++++++ src/routes/+layout.svelte | 15 +++++- src/routes/+page.svelte | 51 +++++++++++++++++- 20 files changed, 563 insertions(+), 2 deletions(-) create mode 100644 src/lib/components/CharacterSwitcher.svelte create mode 100644 src/lib/components/Header.svelte create mode 100644 src/lib/components/fields/CheckboxField.svelte create mode 100644 src/lib/components/fields/CitizenshipField.svelte create mode 100644 src/lib/components/fields/DateField.svelte create mode 100644 src/lib/components/fields/DynamicField.svelte create mode 100644 src/lib/components/fields/HeightField.svelte create mode 100644 src/lib/components/fields/LanguagesField.svelte create mode 100644 src/lib/components/fields/ListField.svelte create mode 100644 src/lib/components/fields/NumberField.svelte create mode 100644 src/lib/components/fields/SelectField.svelte create mode 100644 src/lib/components/fields/SpeciesField.svelte create mode 100644 src/lib/components/fields/SubspeciesField.svelte create mode 100644 src/lib/components/fields/TextField.svelte create mode 100644 src/lib/components/fields/TextareaField.svelte create mode 100644 src/lib/components/fields/WeightField.svelte create mode 100644 src/lib/theme.svelte.ts 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 @@ + + +
+

Aurora Records

+ + {#if roster.characters.length > 0} + + {/if} + +
+ + {#if roster.saveStatus === 'saving'}Saving...{:else if roster.saveStatus === 'saved'}Saved{/if} + + + + + +
+
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 @@ + + +
+ {field.label} +
+ {#each field.options as opt} + + {/each} +
+
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 @@ + + +
+ {field.label} +
+ {#each languages as lang} + + {/each} +
+
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} +
+