diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index aeb040d..a35b0d2 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -6,13 +6,19 @@ import { encodeCharacterURL } from '$lib/sharing'; import { slugify } from '$lib/utils/slugify'; import CharacterSwitcher from './CharacterSwitcher.svelte'; + import TemplatePicker from './TemplatePicker.svelte'; import Modal from './Modal.svelte'; let shared = $state(false); let confirmDelete = $state(false); + let showPicker = $state(false); - async function createCharacter() { - await roster.create(presets[0]); + function createCharacter() { + if (presets.length === 1) { + roster.create(presets[0]); + } else { + showPicker = true; + } } async function share() { @@ -82,6 +88,10 @@ +{#if showPicker} + { showPicker = false; }} /> +{/if} + {#if confirmDelete && roster.active} { confirmDelete = false; }}>

Delete Character

diff --git a/src/lib/components/SchemaForm.svelte b/src/lib/components/SchemaForm.svelte index 544aa61..5e959c9 100644 --- a/src/lib/components/SchemaForm.svelte +++ b/src/lib/components/SchemaForm.svelte @@ -1,12 +1,88 @@
+ {#if suggestion} +
+

+ {suggestion.reason} + Switching will keep your existing data. +

+
+ + +
+
+ {/if} + {#each character.template.records as record} + import type { Template } from '$lib/types'; + import { presets } from '$lib/presets'; + import { roster } from '$lib/state.svelte'; + import Modal from './Modal.svelte'; + + let { onClose }: { onClose: () => void } = $props(); + + async function pick(template: Template) { + await roster.create(template); + onClose(); + } + + + +

New Character

+
+ {#each presets as preset} + + {/each} +
+
diff --git a/src/lib/data/parse.ts b/src/lib/data/parse.ts index b16377a..b8011ba 100644 --- a/src/lib/data/parse.ts +++ b/src/lib/data/parse.ts @@ -107,11 +107,13 @@ export function parseTemplate(xml: string, id: string): Template { fields: r.field.map(parseField) })); + const speciesAttr = root['@_species']; return { id, name: root['@_name'], description: root.description ?? '', schemaVersion: Number(root['@_schemaVersion'] ?? 1), + ...(speciesAttr && { species: speciesAttr.split(',').map((s: string) => s.trim()) }), records }; } diff --git a/src/lib/types.ts b/src/lib/types.ts index 1873ce1..7af977d 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -101,6 +101,7 @@ export interface Template { name: string; description: string; schemaVersion: number; + species?: string[]; records: RecordDef[]; } diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 7d4f34e..8ae07f9 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -6,9 +6,11 @@ import ImportModal from '$lib/components/ImportModal.svelte'; import { roster } from '$lib/state.svelte'; import { presets } from '$lib/presets'; + import TemplatePicker from '$lib/components/TemplatePicker.svelte'; let importData = $state(null); let mobileView = $state<'edit' | 'preview' | 'split'>('split'); + let showPicker = $state(false); onMount(() => { const hash = window.location.hash.slice(1); @@ -86,12 +88,18 @@

No characters yet.

+ {#if showPicker} + { showPicker = false; }} /> + {/if} {/if}