# DesktopLoginScreen

> A desktop OS sign-in screen. Wallpaper, a clock with a greeting, and a card with the mark and the Nasaq LoginForm, plus optional power buttons.

Source: https://docs.nasaqui.com/components/desktop-login-screen

## Install

```bash
npx shadcn@latest add https://docs.nasaqui.com/r/desktop-login-screen.json
```

The first screen of a web OS: the time, a greeting and a sign-in card over a wallpaper. The form is `LoginForm`, so
passkeys, providers, errors and rate limiting work the same as on any Nasaq sign-in page.

## When to use

- Signing in to a desktop-style app built with `DesktopShell`.

## When not to use

- A person already signed in coming back after idle: use `LockScreen`.
- A normal web app sign-in page: use `AuthLayout` with `LoginForm`.

## Import

```tsx
import { DesktopLoginScreen } from "@fadymondy/nasaq/web";
// inside this monorepo: "@nasaq/web"
```

## Quick start

```tsx
import { DesktopLoginScreen } from "@fadymondy/nasaq/web";

export function SignIn() {
  return (
    <DesktopLoginScreen
      title="ToGO OS"
      onSubmit={async ({ email, password }) => {
        const ok = await api.signIn(email, password);
        if (!ok) return { error: "Incorrect email or password." };
      }}
    />
  );
}

declare const api: { signIn(e: string, p: string): Promise<boolean> };
```

## Anatomy

```
DesktopLoginScreen          data-slot="desktop-login-screen"
├─ wallpaper + scrim        aria-hidden
├─ clock                    greeting, time, date   (showClock)
├─ card                     <section> labelled by the title
│  ├─ mark, title, description
│  ├─ LoginForm | children
│  └─ footer
└─ power actions            <nav>  (powerActions)
```

## API

`div` props (except `children`, `title`, `onSubmit`) plus:

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `onSubmit` | `LoginFormProps["onSubmit"]` | | Resolve with nothing, or `{ error, fieldErrors }`. |
| `formProps` | `Omit<LoginFormProps, "onSubmit">` | | Passkeys, providers, forgot password, labels. |
| `children` | `ReactNode` | | Replaces the form. |
| `wallpaper` | `ReactNode` | | Under a scrim. |
| `mark` | `ReactNode` | `ProductMark` | `null` hides it. |
| `title` / `description` | `ReactNode` | `"Sign in"` | |
| `showClock` / `now` | `boolean` / `Date \| number` | `true` / live | Freeze time for docs. |
| `footer` | `ReactNode` | | Under the form. |
| `powerActions` | `{ id, label, icon, onSelect }[]` | | Round buttons at the bottom. |
| `labels` | `DesktopLoginScreenLabels` | | |

## Accessibility

- The card is a labelled `section` with an `h1`; the power buttons are a labelled `nav` and each has a name.
- Errors come from `LoginForm` and are announced.

## RTL & i18n

- Greetings and labels are in English and Arabic. The time uses `Intl` with Latin digits and stays left to right.

## Styling & tokens

- `rounded-card`, a hairline border and `bg-card/90` with a blur over the wallpaper. No shadows.

## Do / Don't

- Do keep the power actions real: hide them if they do nothing in a browser.
- Don't add a second form next to the card. Use `children` to replace it.

## Related

- [`login-form`](https://docs.nasaqui.com/components/login-form)
- [`lock-screen`](https://docs.nasaqui.com/components/lock-screen)
- [`desktop-os-shell`](https://docs.nasaqui.com/components/desktop-os-shell)

## Lab

https://docs.nasaqui.com/?path=/docs/components-auth-pages-desktop-login-screen--docs

## Code

### React

```tsx
import { DesktopLoginScreen } from "@fadymondy/nasaq/web";

export function SignIn() {
  return (
    <DesktopLoginScreen
      title="ToGO OS"
      onSubmit={async ({ email, password }) => {
        const ok = await api.signIn(email, password);
        if (!ok) return { error: "Incorrect email or password." };
      }}
    />
  );
}

declare const api: { signIn(e: string, p: string): Promise<boolean> };
```

### shadcn

```tsx
import { DesktopLoginScreen } from "@/components/ui/desktop-login-screen";

export function SignIn() {
  return (
    <DesktopLoginScreen
      title="ToGO OS"
      onSubmit={async ({ email, password }) => {
        const ok = await api.signIn(email, password);
        if (!ok) return { error: "Incorrect email or password." };
      }}
    />
  );
}

declare const api: { signIn(e: string, p: string): Promise<boolean> };
```

### Vue

```vue
<script setup lang="ts">
import { NqDesktopLoginScreen } from "@fadymondy/nasaq/vue";

// Your API call. Resolve { error } for a wrong password.
async function signIn({ email, password }: { email: string; password: string }) {
  const res = await fetch("/api/sign-in", { method: "POST", body: JSON.stringify({ email, password }) });
  if (!res.ok) return { error: "Incorrect email or password." };
}
</script>

<template>
  <NqDesktopLoginScreen title="ToGO OS" :on-submit="signIn" />
</template>
```

### Blade

```blade
{{-- Your sign-in call. Resolve { error } for a wrong password. The clock is frozen here (docs); leave `now` out for a live clock. --}}
<x-nq::desktop-login-screen title="ToGO OS" now="2026-09-29T09:00:00"
    :power-actions="[['id' => 'sleep', 'label' => 'Sleep', 'icon' => 'moon'], ['id' => 'shutdown', 'label' => 'Shut down', 'icon' => 'power']]"
    x-on:nq-login="$event.detail.waitUntil(new Promise((done) => setTimeout(() => done($event.detail.password === 'correct-horse' ? undefined : { error: 'Incorrect email or password.' }), 300)))" />
```

### HTML + Alpine

```html
<div data-slot="desktop-login-screen" x-data="nqDesktopLoginScreen(JSON.parse('{\u0022now\u0022:\u00222026-09-29T09:00:00\u0022,\u0022locale\u0022:\u0022en\u0022,\u0022labels\u0022:{\u0022morning\u0022:\u0022Good morning\u0022,\u0022afternoon\u0022:\u0022Good afternoon\u0022,\u0022evening\u0022:\u0022Good evening\u0022}}'))"
    x-on:nq-login="$event.detail.waitUntil(new Promise((done) =&gt; setTimeout(() =&gt; done($event.detail.password === &#039;correct-horse&#039; ? undefined : { error: &#039;Incorrect email or password.&#039; }), 300)))" class="relative isolate flex min-h-dvh flex-col items-center overflow-hidden bg-muted px-4 text-foreground">
    <div aria-hidden="true" data-slot="desktop-login-screen-wallpaper" class="absolute inset-0 -z-10">
                <div class="absolute inset-0 bg-background/55 backdrop-blur-sm"></div>
    </div>
    <main class="flex w-full max-w-sm flex-1 flex-col items-center justify-center gap-8 py-10">
                    <div data-slot="desktop-login-screen-clock" class="flex flex-col items-center gap-1 text-center">
                <p class="text-label tracking-wide text-muted-foreground uppercase" x-text="greeting"></p>
                <time dir="ltr" class="text-[clamp(3rem,10vw,5rem)] leading-none font-light tabular-nums text-foreground" x-text="time"></time>
                <p class="text-body text-muted-foreground first-letter:uppercase" x-text="date"></p>
            </div>
        <section aria-labelledby="desktop-login-title" data-slot="desktop-login-screen-card" class="flex w-full flex-col gap-6 rounded-card border border-border bg-card/90 p-6 text-card-foreground backdrop-blur-md">
            <header class="flex flex-col items-center gap-3 text-center">
                                    <div data-slot="desktop-login-screen-mark"><svg data-slot="product-mark" viewBox="0 0 100 100" width="40" height="40"  aria-hidden="true"  shape-rendering="crispEdges"  class="shrink-0">
            <g class="dark:hidden">
                            <rect x="0" y="20" width="20" height="20" fill="#15694A" />
                            <rect x="80" y="20" width="20" height="20" fill="#15694A" />
                            <rect x="20" y="40" width="20" height="20" fill="#15694A" />
                            <rect x="60" y="40" width="20" height="20" fill="#15694A" />
                            <rect x="40" y="60" width="20" height="20" fill="#C9A227" />
                    </g>
        <g class="hidden dark:block">
                            <rect x="0" y="20" width="20" height="20" fill="#4CC495" />
                            <rect x="80" y="20" width="20" height="20" fill="#4CC495" />
                            <rect x="20" y="40" width="20" height="20" fill="#4CC495" />
                            <rect x="60" y="40" width="20" height="20" fill="#4CC495" />
                            <rect x="40" y="60" width="20" height="20" fill="#C9A227" />
                    </g>
    </svg>
</div>
                                <div class="flex flex-col gap-0.5">
                    <h1 id="desktop-login-title" class="text-h3 text-foreground">ToGO OS</h1>
                                    </div>
            </header>
                            <form data-slot="login-form" novalidate x-data="nqLoginForm(JSON.parse('{\u0022password\u0022:true,\u0022magicLink\u0022:false,\u0022magicLinkSeconds\u0022:30,\u0022oauth\u0022:false,\u0022passkey\u0022:false,\u0022passkeyAutofill\u0022:false,\u0022names\u0022:[\u0022email\u0022,\u0022password\u0022],\u0022fieldLabels\u0022:{\u0022email\u0022:\u0022Email\u0022,\u0022password\u0022:\u0022Password\u0022},\u0022errorTitle\u0022:\u0022Fix these to sign in\u0022,\u0022failed\u0022:\u0022Something went wrong. Try again.\u0022,\u0022labels\u0022:{\u0022email\u0022:\u0022Email\u0022,\u0022emailPlaceholder\u0022:\u0022you@example.com\u0022,\u0022password\u0022:\u0022Password\u0022,\u0022remember\u0022:\u0022Remember me\u0022,\u0022submit\u0022:\u0022Sign in\u0022,\u0022passkey\u0022:\u0022Sign in with a passkey\u0022,\u0022divider\u0022:\u0022or\u0022,\u0022emailRequired\u0022:\u0022Enter your email address.\u0022,\u0022emailInvalid\u0022:\u0022Enter a valid email address.\u0022,\u0022passwordRequired\u0022:\u0022Enter your password.\u0022,\u0022errorTitle\u0022:\u0022Fix these to sign in\u0022,\u0022failed\u0022:\u0022Something went wrong. Try again.\u0022,\u0022magicLink\u0022:\u0022Email me a sign-in link\u0022,\u0022sentTitle\u0022:\u0022Check your email\u0022,\u0022sentBody\u0022:\u0022We sent a sign-in link to {email}. It works once and expires soon.\u0022,\u0022resend\u0022:\u0022Send the link again\u0022,\u0022resendIn\u0022:\u0022Send again in {time}\u0022,\u0022resent\u0022:\u0022We sent a new link.\u0022,\u0022changeEmail\u0022:\u0022Use a different email\u0022,\u0022devLogin\u0022:\u0022Dev login\u0022,\u0022devFailed\u0022:\u0022Dev login failed.\u0022,\u0022blockedTitle\u0022:\u0022Sign-in is not available\u0022,\u0022blockedBody\u0022:\u0022This account can\\u0027t sign in here. Contact your administrator.\u0022}}'))" x-bind:data-state="sentTo ? 'sent' : 'idle'"
        x-bind:aria-busy="pending ? 'true' : null" x-on:submit.prevent="onSubmit()" x-on:input="clear($event.target.name)"
        class="flex w-full flex-col gap-4">
        <div class="contents" x-show="! sentTo">
            <div tabindex="-1" class="sr-only" x-show="! problems()"></div>
<div tabindex="-1" data-slot="auth-error-summary" class="outline-none" x-show="problems()" style="display: none">
    <div data-slot="alert" data-tone="danger" role="alert" class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-danger/30 bg-nq-danger-soft">
        <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-danger-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m15 9-6 6"/>
  <path d="m9 9 6 6"/>
</svg>        <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
            <div data-slot="alert-title" class="text-label text-foreground" x-text="summaryTitle()"></div>
            <div data-slot="alert-description" class="text-body-sm text-muted-foreground" x-show="! error && entries().length" style="display: none">
                <ul class="flex list-disc flex-col gap-0.5 ps-4">
                    <template x-for="e in entries()" :key="e.name">
                        <li><button type="button" class="text-start underline underline-offset-2" x-on:click="focusField(e.name)" x-text="(e.label ? e.label + ': ' : '') + e.message"></button></li>
                    </template>
                </ul>
            </div>
        </div>
    </div>
</div>
            <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     x-model="bad.email" class="flex flex-col gap-1.5">
    <label data-slot="field-label"  for="nq-login-000001-email" class="text-label text-foreground data-disabled:opacity-50">Email</label>
                <input data-slot="input" type="email"
     dir="ltr"      name="email"             id="nq-login-000001-email" inputmode="email" value="" autocomplete="username" placeholder="you@example.com" aria-describedby="nq-login-000001-email-error" x-bind:aria-invalid="bad.email ? &#039;true&#039; : null" class="w-full min-w-0 rounded-control border border-input bg-card px-3 text-body text-foreground min-h-[var(--nq-touch-min,0px)] transition-colors duration-150 ease-nq outline-none placeholder:text-muted-foreground focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-invalid:border-nq-danger aria-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px] h-control text-start">
                <div data-slot="field-error" role="alert" x-show="invalid"  style="display: none"  id="nq-login-000001-email-error" class="text-caption text-nq-danger-text"><span x-text="fe.email"></span></div>
</div>
                            <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     x-model="bad.password" class="flex flex-col gap-1.5">
    <div class="flex items-baseline justify-between gap-3">
                        <label data-slot="field-label"  for="nq-login-000001-password" class="text-label text-foreground data-disabled:opacity-50">Password</label>
                                            </div>
                    <div data-slot="password-input" x-data="nqPasswordInput('', JSON.parse('{\u0022visible\u0022:false,\u0022score\u0022:null,\u0022rules\u0022:null,\u0022levels\u0022:[\u0022Very weak\u0022,\u0022Weak\u0022,\u0022Fair\u0022,\u0022Good\u0022,\u0022Strong\u0022]}'))" x-modelable="value"
    class="flex w-full flex-col gap-2">
    <div role="group" data-slot="input-group"
    class="group/input-group flex h-control min-h-[var(--nq-touch-min,0px)] w-full min-w-0 items-center overflow-hidden rounded-control border border-input bg-card text-body text-foreground transition-colors duration-150 ease-nq focus-within:border-nq-focus focus-within:outline-1 focus-within:outline-nq-focus has-[[data-invalid]]:border-nq-danger has-[[aria-invalid=true]]:border-nq-danger has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50"><input data-slot="input-group-input"     x-model="value" x-bind:type="shown ? &#039;text&#039; : &#039;password&#039;" type="password" value="" autocapitalize="none" autocorrect="off" spellcheck="false" id="nq-login-000001-password" name="password" autocomplete="current-password" aria-describedby="nq-login-000001-password-error" x-bind:aria-invalid="bad.password ? &#039;true&#039; : null" class="h-full min-w-0 flex-1 border-0 bg-transparent px-3 text-body text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed pointer-coarse:text-[16px]" />
        <div data-slot="input-group-addon" data-align="end"
    class="flex h-full shrink-0 items-center gap-1.5 text-body-sm text-muted-foreground [&_svg]:size-4 order-last ps-1 pe-1.5"><button data-slot="password-input-toggle"
     type="button"                         x-bind="toggle" aria-label="Show password" aria-pressed="false" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0">
        <svg x-show="shown" x-cloak="1" style="display: none" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"/>
  <path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"/>
  <path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"/>
  <path d="m2 2 20 20"/>
</svg>                <svg x-show="!shown" x-cloak="1" style="" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"/>
  <circle cx="12" cy="12" r="3"/>
</svg></button></div></div>
        </div>
                    <div data-slot="field-error" role="alert" x-show="invalid"  style="display: none"  id="nq-login-000001-password-error" class="text-caption text-nq-danger-text"><span x-text="fe.password"></span></div>
</div>
                                    <label class="flex items-center gap-2 text-body-sm text-foreground">
                        <button type="button" role="checkbox" data-slot="checkbox" x-data="nqCheckbox(false, false)" x-modelable="checked" x-bind="root"
    aria-checked="false"
     data-unchecked                 x-model="remember" class="relative inline-flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-nq-line-strong bg-card text-primary-foreground outline-none transition-colors duration-150 ease-nq data-checked:border-primary data-checked:bg-primary data-indeterminate:border-primary data-indeterminate:bg-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:cursor-not-allowed data-disabled:opacity-50 after:absolute after:-inset-1">
    <span data-slot="checkbox-indicator" class="flex items-center justify-center [&_svg]:size-3 [&_svg]:stroke-3" x-show="checked || indeterminate"  style="display: none" >
        <svg aria-hidden="true" x-show="indeterminate" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M5 12h14"/>
</svg>        <svg aria-hidden="true" x-show="! indeterminate" style="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg>    </span>
    <input type="hidden" name="remember" value="1" x-bind:disabled="! checked"  disabled ></button>
                        Remember me
                    </label>
                                        <button data-slot="button"
     type="submit"                         x-bind:disabled="offFor(&#039;password&#039;)" x-bind:data-disabled="offFor(&#039;password&#039;) ? &#039;&#039; : null" x-bind:aria-busy="loadingFor(&#039;password&#039;) ? &#039;true&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-[color-mix(in_oklab,var(--nq-action)_88%,var(--nq-fg))] h-[calc(var(--nq-control)+8px)] px-5 text-body">
        <template x-if="loadingFor('password')"><svg data-slot="spinner" aria-hidden="true" class="size-4 animate-spin motion-reduce:animate-none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M21 12a9 9 0 1 1-6.219-8.56"/>
</svg></template>
                Sign in</button>
                                                                    </div>
        <div class="contents" x-show="sentTo" style="display: none">
            <div class="flex size-10 items-center justify-center rounded-full bg-nq-success-soft text-nq-success-text">
                <svg aria-hidden="true" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M22 13V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h8"/>
  <path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/>
  <path d="m16 19 2 2 4-4"/>
</svg>            </div>
            <div role="status" class="flex flex-col gap-1.5">
                <h2 data-slot="login-form-sent-title" tabindex="-1" class="text-h3 text-foreground outline-none">Check your email</h2>
                <p class="text-body-sm text-muted-foreground">We sent a sign-in link to <bdi dir="ltr" class="font-medium text-foreground" x-text="sentTo"></bdi>. It works once and expires soon.</p>
            </div>
            <div data-slot="alert" data-tone="danger" role="alert"
        x-show="resendError" style="display: none" class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-danger/30 bg-nq-danger-soft">
    <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-danger-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m15 9-6 6"/>
  <path d="m9 9 6 6"/>
</svg>    <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
                            <div data-slot="alert-description" class="text-body-sm text-foreground"><span x-text="resendError"></span></div>
            </div>
    </div>
            <span role="status" class="sr-only" x-text="resendDone && cooldown > 0 ? 'We sent a new link.' : ''"></span>
            <button data-slot="login-form-resend"
     type="button"                         x-on:click="resend()" x-bind:disabled="resendOff()" x-bind:data-disabled="resendOff() ? &#039;&#039; : null" x-bind:aria-busy="resendPending ? &#039;true&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border-border bg-card text-foreground hover:bg-nq-hover h-[calc(var(--nq-control)+8px)] px-5 text-body">
        <template x-if="resendPending"><svg data-slot="spinner" aria-hidden="true" class="size-4 animate-spin motion-reduce:animate-none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M21 12a9 9 0 1 1-6.219-8.56"/>
</svg></template>
                <span x-text="resendLabel()">Send the link again</span></button>
            <button data-slot="button"
     type="button"                         x-on:click="changeEmail()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground underline decoration-nq-line underline-offset-4 hover:decoration-current h-auto px-0 self-start">
        Use a different email</button>
        </div>
    </form>
                                </section>
    </main>
            <nav aria-label="Power options" data-slot="desktop-login-screen-power" class="flex items-center gap-4 pb-8">
                            <button type="button" data-id="sleep" aria-label="Sleep" title="Sleep" x-on:click="power($el.dataset.id)"
                    class="grid size-10 place-items-center rounded-full border border-border bg-card/70 text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:bg-nq-hover hover:text-foreground focus-visible:outline-2 focus-visible:outline-nq-focus">
                    <svg aria-hidden="true" class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/>
</svg>                </button>
                            <button type="button" data-id="shutdown" aria-label="Shut down" title="Shut down" x-on:click="power($el.dataset.id)"
                    class="grid size-10 place-items-center rounded-full border border-border bg-card/70 text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:bg-nq-hover hover:text-foreground focus-visible:outline-2 focus-visible:outline-nq-focus">
                    <svg aria-hidden="true" class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M12 2v10"/>
  <path d="M18.4 6.6a9 9 0 1 1-12.77.04"/>
</svg>                </button>
                    </nav>
    </div>
```
