···11<script lang="ts">
22import { DropdownMenu } from 'bits-ui'
33-import type { DropdownMenuTriggerProps as BitsTriggerProps, WithChildren } from 'bits-ui'
44-import { tv } from 'tailwind-variants'
33+import type { WithChildren } from 'bits-ui'
44+import { cn, tv } from 'tailwind-variants'
5566-type DropdownMenuTriggerRoot = BitsTriggerProps
77-type DropdownMenuTriggerProps = WithChildren<DropdownMenuTriggerRoot>
88-let { children }: DropdownMenuTriggerProps = $props()
66+type MenuTriggerRoot = DropdownMenu.TriggerProps
77+type MenuTriggerProps = WithChildren<MenuTriggerRoot>
88+let { class: className, ...restProps }: MenuTriggerProps = $props()
991010const trigger = tv({
1111 base: [
1212- 'flex flex-row justify-end w-[230px]',
1212+ 'flex flex-row justify-end',
1313 'outline-hidden focus-visible:outline-hidden',
1414 ]
1515})
1616</script>
17171818-<DropdownMenu.Trigger class={trigger()}>
1919- {@render children?.()}
2020-</DropdownMenu.Trigger>
1818+<DropdownMenu.Trigger {...restProps} class={cn(trigger(), className)} />
+1
app/src/lib/ui-components/menu/exports.ts
···11export { default as Content } from './MenuContent.svelte'
22export { default as Item } from './MenuItem.svelte'
33+export { default as LinkItem } from './MenuLinkItem.svelte'
34export { default as Trigger } from './MenuTrigger.svelte'
···33import type { Snippet } from 'svelte'
44import { tv } from 'tailwind-variants'
5566-type TooltipRootProps = Tooltip.RootProps
77-type TooltipProps = TooltipRootProps & {
66+type TooltipProps = Tooltip.RootProps & {
87 trigger: Snippet
98 triggerProps?: Tooltip.TriggerProps
109 children?: Snippet
+1-1
app/src/routes/(auth)/AuthFooter.svelte
···15151616<Button intent="secondary" class="w-full -mt-3" {...googleProps}>
1717 <GoogleIcon class="size-5 fill-hsr-dark dark:fill-white stroke-none" />
1818- Sign in with Google
1818+ Continue with Google
1919</Button>
+21
app/src/routes/+error.svelte
···11+<script>
22+import { page } from '$app/state'
33+import { LinkButton } from '$ui/button'
44+</script>
55+66+<div class="mx-auto my-auto">
77+ <div class="flex flex-col gap-8 -my-16">
88+ <div class="flex flex-col gap-4">
99+ <div>
1010+ <div class="text-xs font-mono uppercase text-zinc-500">Error {page?.status}</div>
1111+ <h2 class="text-2xl font-mono uppercase">404 Not Found</h2>
1212+ </div>
1313+ <p class="max-w-50ch italic text-pretty">
1414+ There are limitless, countless regions across the cosmos.
1515+ Within one's lifetime, they may only experience at most a trillionth of the universe.
1616+ This place is not one of them.
1717+ </p>
1818+ </div>
1919+ <LinkButton intent="primary" href="/" class="self-end">Go back home</LinkButton>
2020+ </div>
2121+</div>
+10-45
app/src/routes/+layout.svelte
···11<script lang="ts">
22-import HouseIcon from '@lucide/svelte/icons/house'
32import LogInIcon from '@lucide/svelte/icons/log-in'
44-import LogOutIcon from '@lucide/svelte/icons/log-out'
55-import SettingsIcon from '@lucide/svelte/icons/settings'
66-import UserIcon from '@lucide/svelte/icons/user'
73import UserPlusIcon from '@lucide/svelte/icons/user-plus'
88-import { DropdownMenu, Tooltip, type WithChildren } from 'bits-ui'
44+import { Tooltip, type WithChildren } from 'bits-ui'
95import { pageTitle } from '$lib/utils'
1010-import { Avatar } from '$ui/avatar'
116import { LinkButton } from '$ui/button'
1212-import { Menu } from '$ui/menu'
137import { Header } from '$ui/site'
1414-import { Separator } from '$ui/separator'
158import type { LayoutProps } from './$types'
99+import CreateMenu from './CreateMenu.svelte'
1010+import SignedInMenu from './SignedInMenu.svelte'
1611import './../styles/app.css'
1712import '@fontsource-variable/suse'
1813import '@fontsource-variable/suse/wght-italic.css'
···3126 <meta name="theme-color" content="#151512" media="(prefers-color-scheme: dark)">
3227</svelte:head>
33283434-{#snippet loggedInDropdown(username: string, userId: string, src?: string)}
3535- <DropdownMenu.Root>
3636- <Menu.Trigger>
3737- <Avatar {username} {src} />
3838- </Menu.Trigger>
3939- <DropdownMenu.Portal>
4040- <Menu.Content>
4141- <Menu.Item href={'/'}>
4242- <HouseIcon class="size-5" strokeWidth={1.5} />
4343- Home
4444- </Menu.Item>
4545- <Menu.Item href={`/users/${username}`}>
4646- <UserIcon class="size-5" strokeWidth={1.5} />
4747- Profile
4848- </Menu.Item>
4949- <Menu.Item href={'/characters/new'}>
5050- <UserPlusIcon class="size-5" strokeWidth={1.5} />
5151- New Character
5252- </Menu.Item>
5353- <Menu.Item>
5454- <SettingsIcon class="size-5" strokeWidth={1.5} />
5555- Settings
5656- </Menu.Item>
5757- <Separator class="my-2" />
5858- <Menu.Item href={'/signout'}>
5959- <LogOutIcon class="size-5" strokeWidth={1.5} />
6060- Sign Out
6161- </Menu.Item>
6262- </Menu.Content>
6363- </DropdownMenu.Portal>
6464- </DropdownMenu.Root>
6565-{/snippet}
6666-6729<Tooltip.Provider>
6830 <div class={["flex flex-col gap-4 h-screen"]}>
6931 <Header>
7032 {#if data.user !== undefined}
7133 {@const user = data.user}
7234 {@const profile = user.image as (string|undefined)}
7373- {@render loggedInDropdown(user.name, user.id, profile)}
3535+ <div class="flex flex-row gap-4 items-center">
3636+ <CreateMenu />
3737+ <SignedInMenu username={user.name} src={profile} />
3838+ </div>
7439 {:else}
7575- <div class="flex flex-row gap-2">
4040+ <div class="flex flex-row gap-2 items-center">
7641 <LinkButton href="/signin" intent="secondary">
7742 <LogInIcon class="size-5" />
7878- Sign In
4343+ Sign in
7944 </LinkButton>
8045 <LinkButton href="/signup" intent="primary">
8146 <UserPlusIcon class="size-5" />
8282- Sign up
4747+ Create account
8348 </LinkButton>
8449 </div>
8550 {/if}
···7788 </div>
99</PageLayout>
1010-1111-<!-- <SpeciesCard name="Halovian">
1212- <p>Humanoid species with angelic features that follow Xipe, the Aeon of Harmony.
1313- They're known to be naturally charming and intelligent, with some capable of using their charisma
1414- to influence societies at the national level. They are the artists that many love, including singers, dancers, and actors.</p>
1515-</SpeciesCard>
1616-<SpeciesCard name="Vidyadhara">
1717- <p>Human hybrids with draconic features, known to be able to live up to 700 years.
1818- They are thought to be descendants of the aeon who had departed this universe; Long the Permanence.</p>
1919-</SpeciesCard>
2020-<SpeciesCard name="Foxian">
2121- <LoremIpsum
2222- wordsPerSentence={{min: 10, max: 20}}
2323- sentencesPerParagraph={{min: 1, max: 2}}
2424- generate={['sentences', 2]} />
2525-</SpeciesCard>
2626-<SpeciesCard name="Intellitron">
2727- <p>Intellitrons are intelligent mechanic lifeforms, capable of forming their own thoughts and deductive reasoning.
2828- They have robust pattern recognition skills, and many are curious about worlds beyond their own.</p>
2929-</SpeciesCard> -->
+1-1
app/src/routes/species/new/+page.svelte
···3131 <Heading level={1}>Register a new species</Heading>
3232 <SubHeading isScript>Register a new species</SubHeading>
3333 </HeadingGroup>
3434- <form class="flex flex-col items-start gap-10 max-w-100ch">
3434+ <form class="flex flex-col items-start gap-10">
3535 <Field.Root>
3636 <Field.Label>Species name</Field.Label>
3737 <TextInput