···11-export { default as DropdownMenuContent } from './DropdownMenuContent.svelte'
22-export { default as DropdownMenuItem } from './DropdownMenuItem.svelte'
33-export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.svelte'
···11<script lang="ts">
22import { getElementName, getElementColor, type Element } from '@starlight/types/hsr'
33import type { SvelteHTMLElements } from 'svelte/elements'
44-import Text from '$ui/Text/Text.svelte'
55-import type { TextProps } from '$ui/Text/Text'
44+import Text from '$ui/text/Text.svelte'
55+import type { TextProps } from '$ui/text/Text'
6677type ElementTextRootElement = SvelteHTMLElements['span']
88type ElementTextProps = ElementTextRootElement & TextProps & {
···11import { type SQL, sql } from 'drizzle-orm'
22import { mysqlTable, serial, int, text, type AnyMySqlColumn } from 'drizzle-orm/mysql-core'
3344-export const task = mysqlTable('task', {
55- id: serial('id').primaryKey(),
66- title: text('title').notNull(),
77- priority: int('priority').notNull().default(1),
88-})
99-1010-export function sqlLower(email: AnyMySqlColumn): SQL {
1111- return sql`lower(${email})`
44+export function sqlLower(email: AnyMySqlColumn): SQL<string> {
55+ return sql<string>`lower(${email})`
126}
137148export function sqlBool(bool: boolean): SQL<boolean> {
···1610}
17111812export * from './schema.auth'
1313+export * from './schema.dnd'
+3
app/src/lib/ui-components/menu/exports.ts
···11+export { default as Content } from './MenuContent.svelte'
22+export { default as Item } from './MenuItem.svelte'
33+export { default as Trigger } from './MenuTrigger.svelte'
···11-import type { ParamMatcher } from '@sveltejs/kit'
22-import { SpeciesSchema, type Species } from '@starlight/types/hsr'
33-44-export const match: ParamMatcher = (p): p is Species => SpeciesSchema.safeParse(p).success
+1-1
app/src/routes/(auth)/AuthFooter.svelte
···22import GoogleIcon from '@starlight/icons/google'
33import type { ComponentProps } from 'svelte'
44import type { SvelteHTMLElements } from 'svelte/elements'
55-import { Button } from '$ui/Button'
55+import { Button } from '$ui/button'
6677type AuthFooterRootElement = SvelteHTMLElements['button']
88type AuthFooterProps = AuthFooterRootElement & {
+1-1
app/src/routes/(auth)/AuthHeader.svelte
···11<script lang="ts">
22import type { SvelteHTMLElements } from 'svelte/elements'
33-import { FormHeader } from '$form/Form'
33+import { FormHeader } from '$ui/form'
4455type AuthHeaderRootElement = SvelteHTMLElements['header']
66type AuthHeaderProps = AuthHeaderRootElement & {
+2-2
app/src/routes/(auth)/AuthPageLayout.svelte
···11<script lang="ts">
22import type { WithChildren } from 'bits-ui'
33-import type { SvelteHTMLElements } from 'svelte/elements';
44-import { PageLayout } from '$ui/Site'
33+import type { SvelteHTMLElements } from 'svelte/elements'
44+import { PageLayout } from '$ui/site'
5566type AuthPageRootElement = SvelteHTMLElements['div']
77type AuthPageLayoutProps = WithChildren<AuthPageRootElement>
+4-4
app/src/routes/(auth)/reset-password/+page.svelte
···22import type { WithChildren } from 'bits-ui'
33import { untrack } from 'svelte'
44import { superForm } from 'sveltekit-superforms'
55-import { Field, FieldLabel } from '$form/Field'
66-import { FormHeader } from '$form/Form'
77-import { TextInput } from '$form/TextInput'
88-import { Button, LinkButton } from '$ui/Button'
55+import { Button, LinkButton } from '$ui/button'
66+import { Field, FieldLabel } from '$ui/field'
77+import { FormHeader } from '$ui/form'
88+import { TextInput } from '$ui/text-input'
99import type { PageProps } from './$types'
1010import { AuthPageLayout } from '../components'
1111
+5-5
app/src/routes/(auth)/signin/+page.svelte
···55import { superForm } from 'sveltekit-superforms'
66import { goto } from '$app/navigation'
77import { resolve } from '$app/paths'
88-import { Field, FieldContent, FieldError, FieldLabel } from '$form/Field'
99-import { TextInput, PasswordInput } from '$form/TextInput'
1010-import { Button } from '$ui/Button'
1111-import { Callout } from '$ui/Callout'
1212-import { Link } from '$ui/Link'
88+import { Button } from '$ui/button'
99+import { Callout } from '$ui/callout'
1010+import { Field, FieldContent, FieldError, FieldLabel } from '$ui/field'
1111+import { Link } from '$ui/link'
1212+import { TextInput, PasswordInput } from '$ui/text-input'
1313import type { PageProps } from './$types'
1414import { AuthHeader, AuthFooter, AuthPageLayout } from '../components'
1515
+5-5
app/src/routes/(auth)/signup/+page.svelte
···66import type { PageProps } from './$types'
77import { goto } from '$app/navigation'
88import { resolve } from '$app/paths'
99-import { Field, FieldDescription, FieldError, FieldLabel } from '$form/Field'
1010-import { TextInput, PasswordInput } from '$form/TextInput'
1111-import { Button } from '$ui/Button'
1212-import { Callout } from '$ui/Callout'
1313-import { Link } from '$ui/Link'
99+import { Button } from '$ui/button'
1010+import { Callout } from '$ui/callout'
1111+import { Field, FieldDescription, FieldError, FieldLabel } from '$ui/field'
1212+import { Link } from '$ui/link'
1313+import { TextInput, PasswordInput } from '$ui/text-input'
1414import { AuthHeader, AuthFooter, AuthPageLayout } from '../components'
15151616type SignUpProps = WithChildren<PageProps>
···11<script lang="ts">
22-import { SkillScores } from '$patterns/SkillScores'
33-import type { SkillScoresMap } from '$patterns/SkillScores/types'
44- import { PageLayout } from '$ui/Site';
22+import { SkillScores } from '$patterns/skill-scores'
33+import type { SkillScoresMap } from '$patterns/skill-scores/types'
44+import { PageLayout } from '$ui/site'
5566const skillScores: SkillScoresMap = {
77 acrobatics: { value: 2, proficiency: 'halfProficient' },
-59
app/src/routes/characters/new/+page.svelte
···11-<script lang="ts">
22-import { PageLayout } from '$ui/Site'
33-import { SpeciesCard } from '$patterns/SpeciesCard'
44-import { Step, type StepProps } from '$ui/Stepper'
55-import { LoremIpsumText } from '$ui/Text'
66-77-const steps: StepProps[] = [
88- {
99- text: 'Class',
1010- desc: 'Vocation, special talents, and favored tactics',
1111- isActive: false,
1212- },
1313- {
1414- text: 'Species',
1515- desc: 'Biological origins, size, speed, traits',
1616- isActive: false,
1717- },
1818- {
1919- text: 'Skills',
2020- desc: 'What are they capable of?',
2121- isActive: false,
2222- },
2323- {
2424- text: 'Background',
2525- desc: 'Who are they? What principles lead their life?',
2626- isActive: true,
2727- },
2828-]
2929-</script>
3030-3131-<PageLayout direction="col" class="gap-36">
3232- <div class="grid grid-cols-4 mt-12 w-full gap-4">
3333- {#each steps as step, index}
3434- <Step {...step} number={index+1} />
3535- {/each}
3636- </div>
3737- <div class="grid grid-cols-2 gap-4">
3838- <SpeciesCard name="Halovian">
3939- <p>Humanoid species with angelic features that follow Xipe, the Aeon of Harmony.
4040- They're known to be naturally charming and intelligent, with some capable of using their charisma
4141- to influence societies at the national level. They are the artists that many love, including singers, dancers, and actors.</p>
4242- </SpeciesCard>
4343- <SpeciesCard name="Vidyadhara">
4444- <p>Human hybrids with draconic features, known to be able to live up to 700 years.
4545- They are thought to be descendants of the aeon who had departed this universe; Long the Permanence.</p>
4646- </SpeciesCard>
4747- <SpeciesCard name="Foxian">
4848- <LoremIpsumText
4949- wordsPerSentence={{min: 10, max: 20}}
5050- sentencesPerParagraph={{min: 1, max: 2}}
5151- unit="sentences"
5252- amount={2} />
5353- </SpeciesCard>
5454- <SpeciesCard name="Intellitron">
5555- <p>Intellitrons are intelligent mechanic lifeforms, capable of forming their own thoughts and deductive reasoning.
5656- They have robust pattern recognition skills, and many are curious about worlds beyond their own.</p>
5757- </SpeciesCard>
5858- </div>
5959-</PageLayout>
app/src/routes/classes/[page]/+page.svelte
This is a binary file and will not be displayed.
+10
app/src/routes/classes/new/+page.server.ts
···11+import { pageTitle } from '$lib/utils'
22+import type { PageServerLoad } from './$types'
33+44+export const load: PageServerLoad = async () => {
55+ return {
66+ meta: {
77+ pageTitle: pageTitle('Register a new class'),
88+ },
99+ }
1010+}
+38
app/src/routes/classes/new/+page.svelte
···11+<script lang="ts">
22+import { Field, FieldLabel } from '$ui/field'
33+import { HeadingGroup, Heading, SubHeading } from '$ui/heading'
44+import { PageLayout } from '$ui/site'
55+import { TextAreaInput, TextInput } from '$ui/text-input'
66+import type { PageProps } from './$types'
77+88+let { data }: PageProps = $props()
99+const { meta: { pageTitle } } = $derived(data)
1010+</script>
1111+1212+<svelte:head>
1313+ <title>{pageTitle}</title>
1414+</svelte:head>
1515+1616+<PageLayout display="flex" direction="col" class="gap-8" items="stretch">
1717+ <HeadingGroup>
1818+ <Heading level={1}>Register a new class</Heading>
1919+ <SubHeading isScript>Register a new class</SubHeading>
2020+ </HeadingGroup>
2121+ <form class="flex flex-col items-start gap-10 max-w-100ch">
2222+ <Field>
2323+ <FieldLabel>Class name</FieldLabel>
2424+ <TextInput
2525+ name="name"
2626+ placeholder="Enter class name..."
2727+ maxlength={20} />
2828+ </Field>
2929+ <Field>
3030+ <FieldLabel>Class description</FieldLabel>
3131+ <TextAreaInput
3232+ name="description"
3333+ placeholder="Describe the class..."
3434+ rows={7}
3535+ resizable />
3636+ </Field>
3737+ </form>
3838+</PageLayout>