# Gamification

> A kit for progress and rewards. Leaderboard with period tabs, podium, movement arrows and your rank pinned, a badge grid with earned, in-progress and locked states and rarity, achievement card, XP and level progress, streak counter with calendar, reward cards and an unlock toast that respects reduced motion.

Source: https://docs.nasaqui.com/components/gamification

## Install

```bash
npx shadcn@latest add https://docs.nasaqui.com/r/gamification.json
```

Generic parts for showing progress and rewards. Nothing product specific is baked in: you provide the achievements,
scores and days, and the kit lays them out, ranks them and works out levels and streaks.

## When to use

- Achievements, levels, streaks, rankings and rewards in a learning, fitness, community or team app.

## When not to use

- Plain numeric progress: use [`Progress`](https://docs.nasaqui.com/components/progress).
- Tables of ranked data with sorting and filters: use [`DataTable`](https://docs.nasaqui.com/components/data-table).

## Import

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

## Quick start

```tsx
import { BadgeGrid, Leaderboard, XpProgress } from "@fadymondy/nasaq/web";

export const Page = () => (
  <>
    <XpProgress totalXp={1380} />
    <BadgeGrid achievements={[{ id: "a", title: "First step", rarity: "common", earnedAt: "2026-09-01" }]} />
    <Leaderboard entries={[{ id: "u1", name: "Layla", score: 4820, previousRank: 2 }]} youId="u1" unit="XP" />
  </>
);
```

## Anatomy

```
Leaderboard                data-slot="leaderboard": header with period Tabs, podium (2, 1, 3), ranked list, pinned "you" row
BadgeGrid                  filter Tabs (All, Earned, In progress, Locked) and a grid of AchievementMedal
AchievementCard            medal, rarity, XP, description, progress or earned date
XpProgress                 level number, XP in level, bar, XP to the next level
StreakCounter              flame, days in a row, longest, at-risk note
StreakCalendar / StreakCard month grid with active days; card combines both
RewardCard                 art, rarity, cost, Claim with progress and error states
AchievementUnlockToast     status region with a medal pop and burst
```

## API

| Component | Main props |
| --- | --- |
| `Leaderboard` | `entries` (`{ id, name, score, previousRank?, avatar?, subtitle? }`), `youId`, `periods`, `period`, `onPeriodChange`, `unit`, `limit` (10), `podium` (true), `loading`, `title`. |
| `BadgeGrid` | `achievements`, `filters` (true), `filter`, `onFilterChange`, `onSelect(id)`, `selectedId`. |
| `AchievementCard` | `achievement`, `actions`. |
| `Achievement` | `{ id, title, description?, icon?, rarity?, progress?, goal?, earnedAt?, xp?, secret? }`. |
| `XpProgress` | `totalXp`, `curve` (`{ base, growth }`). |
| `StreakCounter` | `current`, `longest`, `atRisk`. |
| `StreakCalendar` / `StreakCard` | `activeDays`, `month`, `onMonthChange`, `today`, `weekStart`. |
| `RewardCard` | `title`, `description`, `art`, `rarity`, `cost`, `costUnit`, `balance`, `status`, `lockedReason`, `onClaim` (async, may resolve `{ error }`). |
| `AchievementUnlockToast` | `achievement`, `open`, `onClose`, `onView`, `duration` (6000), `floating`. |

Rarity is `common`, `uncommon`, `rare`, `epic` or `legendary`. Tied scores share a rank (1, 2, 2, 4).
Pure helpers, tested: `rankEntries`, `movement`, `levelProgress`, `streakStats`, `monthGrid`, `achievementStatus`.

## Examples

**Async claim with an error**

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

export const Reward = () => (
  <RewardCard title="Golden frame" cost={800} balance={1200} rarity="rare" onClaim={async () => ({ error: "Out of stock." })} />
);
```

## Accessibility

- Rarity, status and movement are always words as well as colour or icon (screen reader text on arrows).
- Your row is marked `aria-current`. The pinned row is a labelled list.
- The unlock toast is a polite `role="status"` that stays mounted, pauses its timer on hover and focus, and can be dismissed.
- Under `prefers-reduced-motion` the toast is a still card: no pop and no burst.

## RTL & i18n

English and Arabic follow the Nasaq locale, override with `labels`. Numbers use `Num`, the calendar starts on
Saturday in Arabic, the ring fill mirrors.

## Styling & tokens

Tokens only. Epic uses the violet tag hue and legendary the accent. No custom CSS: the burst uses the Web Animations API.

## Do / Don't

- Do let people see how to earn a locked badge.
- Don't make rank the only way to feel progress: show personal progress too.
- Don't use the celebration for routine events.

## Related

[`Progress`](https://docs.nasaqui.com/components/progress), [`Badge`](https://docs.nasaqui.com/components/badge), [`Tabs`](https://docs.nasaqui.com/components/tabs), [`Toast`](https://docs.nasaqui.com/components/toast).

## Code

### React

```tsx
import { BadgeGrid, Leaderboard, XpProgress } from "@fadymondy/nasaq/web";

export const Page = () => (
  <>
    <XpProgress totalXp={1380} />
    <BadgeGrid achievements={[{ id: "a", title: "First step", rarity: "common", earnedAt: "2026-09-01" }]} />
    <Leaderboard entries={[{ id: "u1", name: "Layla", score: 4820, previousRank: 2 }]} youId="u1" unit="XP" />
  </>
);
```

### shadcn

```tsx
import { BadgeGrid, Leaderboard, XpProgress } from "@/components/ui/gamification";

export const Page = () => (
  <>
    <XpProgress totalXp={1380} />
    <BadgeGrid achievements={[{ id: "a", title: "First step", rarity: "common", earnedAt: "2026-09-01" }]} />
    <Leaderboard entries={[{ id: "u1", name: "Layla", score: 4820, previousRank: 2 }]} youId="u1" unit="XP" />
  </>
);
```

### Vue

```vue
<script setup lang="ts">
import {
  NqAchievementCard,
  NqAchievementUnlockToast,
  NqBadgeGrid,
  NqLeaderboard,
  NqRewardCard,
  NqStreakCard,
  NqXpProgress,
  type Achievement,
} from "@fadymondy/nasaq/vue";
import { Rocket, Zap } from "lucide-vue-next";
import { ref } from "vue";

const achievements: Achievement[] = [
  { id: "first", title: "First order", description: "Place your first order.", icon: Rocket, rarity: "common", earnedAt: "2026-09-12", xp: 50 },
  { id: "streak", title: "Seven in a row", description: "Order seven days running.", icon: Zap, rarity: "rare", progress: 4, goal: 7, xp: 200 },
  { id: "vip", title: "Big spender", description: "Spend 1,000 USD.", rarity: "epic", progress: 0, goal: 1000 },
  { id: "hidden", title: "Easter egg", description: "You found it.", rarity: "legendary", secret: true },
];
const entries = [
  { id: "a", name: "Sara Ali", score: 2400, previousRank: 2 },
  { id: "b", name: "Omar Nasser", score: 2250, previousRank: 1 },
  { id: "c", name: "Lina Haddad", score: 1900, previousRank: 3 },
  { id: "d", name: "You Yourself", score: 1200 },
];
const periods = [
  { id: "week", label: "This week" },
  { id: "all", label: "All time" },
];
const today = new Date(2026, 8, 20);
const activeDays = ["2026-09-16", "2026-09-17", "2026-09-18", "2026-09-19", "2026-09-20", "2026-09-05"];
const open = ref(true);
</script>

<template>
  <div class="flex flex-col gap-6">
    <NqXpProgress :total-xp="260" />
    <NqBadgeGrid :achievements="achievements" />
    <NqAchievementCard :achievement="achievements[1]!" />
    <NqStreakCard :active-days="activeDays" :today="today" class="max-w-sm" />
    <NqLeaderboard :entries="entries" you-id="d" :periods="periods" unit="XP" :limit="3" />
    <NqRewardCard title="Free delivery" description="One order, on us." rarity="rare" :cost="500" :balance="320" :on-claim="async () => {}" class="max-w-xs" />
    <NqAchievementUnlockToast :achievement="achievements[0]!" :open="open" :floating="false" :duration="0" @close="open = false" />
  </div>
</template>
```

### Blade

```blade
@php
    $achievements = [
        ['id' => 'first', 'title' => 'First order', 'description' => 'Place your first order.', 'icon' => 'rocket', 'rarity' => 'common', 'earnedAt' => '2026-09-12', 'xp' => 50],
        ['id' => 'streak', 'title' => 'Seven in a row', 'description' => 'Order seven days running.', 'icon' => 'zap', 'rarity' => 'rare', 'progress' => 4, 'goal' => 7, 'xp' => 200],
        ['id' => 'vip', 'title' => 'Big spender', 'description' => 'Spend 1,000 USD.', 'rarity' => 'epic', 'progress' => 0, 'goal' => 1000],
        ['id' => 'hidden', 'title' => 'Easter egg', 'description' => 'You found it.', 'rarity' => 'legendary', 'secret' => true],
    ];
    $entries = [
        ['id' => 'a', 'name' => 'Sara Ali', 'score' => 2400, 'previousRank' => 2],
        ['id' => 'b', 'name' => 'Omar Nasser', 'score' => 2250, 'previousRank' => 1],
        ['id' => 'c', 'name' => 'Lina Haddad', 'score' => 1900, 'previousRank' => 3],
        ['id' => 'd', 'name' => 'You Yourself', 'score' => 1200],
    ];
    $periods = [['id' => 'week', 'label' => 'This week'], ['id' => 'all', 'label' => 'All time']];
    $activeDays = ['2026-09-16', '2026-09-17', '2026-09-18', '2026-09-19', '2026-09-20', '2026-09-05'];
@endphp
<div class="flex flex-col gap-6">
    <x-nq::gamification.xp-progress :total-xp="260" />
    <x-nq::gamification.badge-grid :achievements="$achievements" selectable />
    <x-nq::gamification.achievement-card :achievement="$achievements[1]" />
    <x-nq::gamification.streak-card :active-days="$activeDays" today="2026-09-20" class="max-w-sm" />
    <x-nq::gamification.leaderboard :entries="$entries" you-id="d" :periods="$periods" unit="XP" :limit="3" />
    <x-nq::gamification.reward-card title="Free delivery" description="One order, on us." rarity="rare" :cost="500" :balance="620" claimable class="max-w-xs" />
    <x-nq::gamification.reward-card title="Gold mug" rarity="epic" :cost="900" :balance="620" claimable class="max-w-xs" />
    <x-nq::gamification.unlock-toast :achievement="$achievements[0]" :open="true" :floating="false" :duration="0" has-view />
</div>
```

### HTML + Alpine

```html
<div class="flex flex-col gap-6">
    <div data-slot="xp-progress" data-level="2" class="flex items-center gap-3">
    <span aria-hidden="true" class="grid size-12 shrink-0 place-items-center rounded-full border-2 border-nq-accent bg-nq-accent/15 text-h3 tabular-nums text-nq-accent-text">2</span>
    <div class="flex min-w-0 flex-1 flex-col gap-1.5">
        <div class="flex items-baseline justify-between gap-2">
            <span class="text-label text-foreground">Level 2</span>
            <span class="text-caption tabular-nums text-muted-foreground"><bdi>160 / 183 XP</bdi></span>
        </div>
        <div data-slot="progress" data-tone="default" role="progressbar"     aria-valuemin="0" aria-valuemax="100"  aria-valuenow="87"     aria-valuetext="87%" data-progressing
    aria-label="Level 2" class="flex w-full flex-col gap-1.5">
        <div data-slot="progress-track" data-progressing class="relative block w-full overflow-hidden rounded-full bg-nq-surface-soft h-1">
        <div data-slot="progress-indicator" data-progressing style="inset-inline-start:0;width:87%"
            class="block h-full rounded-full transition-[width] duration-300 ease-nq motion-reduce:transition-none bg-primary"></div>
    </div>
</div>
        <span class="text-caption text-muted-foreground"><bdi>23 XP to level 3</bdi></span>
    </div>
</div>
    <section data-slot="badge-grid" x-data="nqBadgeGrid('all', null, JSON.parse('{\u0022all\u0022:4,\u0022earned\u0022:1,\u0022in-progress\u0022:1,\u0022locked\u0022:2}'))" class="flex min-w-0 flex-col gap-4">
            <div data-slot="tabs" data-orientation="horizontal" x-data="nqTabs('all')" x-modelable="value" x-id="['nq-tabs']" x-model="filter" class="flex flex-col gap-4">
    <div data-slot="tabs-list" data-variant="segmented" aria-orientation="horizontal" x-bind="list"
    aria-label="Filter achievements" class="relative z-0 flex max-w-full overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden w-fit gap-0.5 rounded-control bg-secondary p-0.5">
    <button type="button" data-slot="tabs-tab" x-bind="tab('all')"
     data-active aria-selected="true"         class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">All<span class="text-caption tabular-nums text-muted-foreground">4</span></button>
                                    <button type="button" data-slot="tabs-tab" x-bind="tab('earned')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">Earned<span class="text-caption tabular-nums text-muted-foreground">1</span></button>
                                    <button type="button" data-slot="tabs-tab" x-bind="tab('in-progress')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">In progress<span class="text-caption tabular-nums text-muted-foreground">1</span></button>
                                    <button type="button" data-slot="tabs-tab" x-bind="tab('locked')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">Locked<span class="text-caption tabular-nums text-muted-foreground">2</span></button>
                                <span data-slot="tabs-indicator" aria-hidden="true"
    class="absolute -z-10 transition-[left,width] duration-200 ease-nq left-[var(--active-tab-left)] w-[var(--active-tab-width)] top-[var(--active-tab-top)] h-[var(--active-tab-height)] rounded-[calc(var(--radius-control)-2px)] bg-background shadow-xs"></span>
</div>
</div>
        <div data-slot="empty-state" x-show="empty" style="display: none" class="flex flex-col items-center justify-center gap-3 border border-dashed border-border px-6 py-12 text-center rounded-card">
            <span data-slot="state-icon" class="inline-flex size-10 items-center justify-center rounded-control border border-border bg-card [&amp;_svg]:size-5 text-muted-foreground">
            <svg 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="m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526"/>
  <circle cx="12" cy="8" r="6"/>
</svg>        </span>
        <div class="flex max-w-sm flex-col gap-1">
        <p class="text-label text-foreground">Nothing here yet</p>
                    <p class="text-body-sm text-muted-foreground">Achievements that match this filter show up here.</p>
            </div>
    </div>
    <ul class="grid grid-cols-[repeat(auto-fill,minmax(8.5rem,1fr))] gap-3">
                                <li class="min-w-0" x-show="match('earned')" style="">
                <button  type="button" aria-pressed="false" data-id="first" x-on:click="select($el.dataset.id)" x-effect="$el.setAttribute('aria-pressed', selected === $el.dataset.id ? 'true' : 'false'); selected === $el.dataset.id ? $el.setAttribute('data-selected', '') : $el.removeAttribute('data-selected')"                     data-status="earned"                     class="flex h-full w-full flex-col items-center gap-2 rounded-card border border-border bg-card p-3 text-center outline-none transition-colors duration-150 ease-nq hover:bg-nq-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-selected:border-nq-line-strong data-selected:bg-nq-selected">
                    <span aria-hidden="true" data-slot="achievement-medal" data-status="earned" data-rarity="common"
    class="relative inline-grid shrink-0 place-items-center rounded-full size-16">
            <span class="absolute inset-0 rounded-full border-2 border-nq-line-strong bg-secondary"></span>
        <span class="relative grid place-items-center rounded-full size-[68%]">
                    <svg class="size-7 text-muted-foreground" 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 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"/>
  <path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09"/>
  <path d="M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z"/>
  <path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05"/>
</svg>            </span>
</span>
                    <span dir="auto" class="line-clamp-2 text-label text-foreground">First order</span>
                    <span class="flex flex-col items-center gap-0.5 text-caption text-muted-foreground">
                        <span>Earned</span>
                                            </span>
                </button>
            </li>
                                <li class="min-w-0" x-show="match('in-progress')" style="">
                <button  type="button" aria-pressed="false" data-id="streak" x-on:click="select($el.dataset.id)" x-effect="$el.setAttribute('aria-pressed', selected === $el.dataset.id ? 'true' : 'false'); selected === $el.dataset.id ? $el.setAttribute('data-selected', '') : $el.removeAttribute('data-selected')"                     data-status="in-progress"                     class="flex h-full w-full flex-col items-center gap-2 rounded-card border border-border bg-card p-3 text-center outline-none transition-colors duration-150 ease-nq hover:bg-nq-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-selected:border-nq-line-strong data-selected:bg-nq-selected">
                    <span aria-hidden="true" data-slot="achievement-medal" data-status="in-progress" data-rarity="rare"
    class="relative inline-grid shrink-0 place-items-center rounded-full size-16">
            <svg viewBox="0 0 64 64" class="absolute inset-0 -rotate-90 rtl:scale-x-[-1] text-nq-info-text">
            <circle cx="32" cy="32" r="30" fill="none" stroke-width="4" class="stroke-nq-line" />
            <circle cx="32" cy="32" r="30" fill="none" stroke-width="4" stroke-linecap="round" stroke-dasharray="188.4956" stroke-dashoffset="81.0531" class="stroke-current transition-[stroke-dashoffset] duration-300 ease-nq motion-reduce:transition-none" />
        </svg>
        <span class="relative grid place-items-center rounded-full size-[72%] bg-nq-info-soft">
                    <svg class="size-7 text-nq-info-text opacity-80" 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="M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z"/>
</svg>            </span>
</span>
                    <span dir="auto" class="line-clamp-2 text-label text-foreground">Seven in a row</span>
                    <span class="flex flex-col items-center gap-0.5 text-caption text-muted-foreground">
                        <span>In progress · 4 of 7</span>
                        <span class="text-nq-info-text">Rare</span>                    </span>
                </button>
            </li>
                                <li class="min-w-0" x-show="match('locked')" style="">
                <button  type="button" aria-pressed="false" data-id="vip" x-on:click="select($el.dataset.id)" x-effect="$el.setAttribute('aria-pressed', selected === $el.dataset.id ? 'true' : 'false'); selected === $el.dataset.id ? $el.setAttribute('data-selected', '') : $el.removeAttribute('data-selected')"                     data-status="locked"                     class="flex h-full w-full flex-col items-center gap-2 rounded-card border border-border bg-card p-3 text-center outline-none transition-colors duration-150 ease-nq hover:bg-nq-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-selected:border-nq-line-strong data-selected:bg-nq-selected text-muted-foreground">
                    <span aria-hidden="true" data-slot="achievement-medal" data-status="locked" data-rarity="epic"
    class="relative inline-grid shrink-0 place-items-center rounded-full size-16">
            <span class="absolute inset-0 rounded-full border-2 border-dashed border-nq-line-strong bg-secondary"></span>
        <span class="relative grid place-items-center rounded-full size-[68%]">
                    <svg class="text-muted-foreground 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">
  <rect width="18" height="11" x="3" y="11" rx="2" ry="2"/>
  <path d="M7 11V7a5 5 0 0 1 10 0v4"/>
</svg>            </span>
</span>
                    <span dir="auto" class="line-clamp-2 text-label text-muted-foreground">Big spender</span>
                    <span class="flex flex-col items-center gap-0.5 text-caption text-muted-foreground">
                        <span>Locked</span>
                        <span class="text-[var(--nq-tag-violet)]">Epic</span>                    </span>
                </button>
            </li>
                                <li class="min-w-0" x-show="match('locked')" style="">
                <button  type="button" aria-pressed="false" data-id="hidden" x-on:click="select($el.dataset.id)" x-effect="$el.setAttribute('aria-pressed', selected === $el.dataset.id ? 'true' : 'false'); selected === $el.dataset.id ? $el.setAttribute('data-selected', '') : $el.removeAttribute('data-selected')"                     data-status="locked"                     class="flex h-full w-full flex-col items-center gap-2 rounded-card border border-border bg-card p-3 text-center outline-none transition-colors duration-150 ease-nq hover:bg-nq-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-selected:border-nq-line-strong data-selected:bg-nq-selected text-muted-foreground">
                    <span aria-hidden="true" data-slot="achievement-medal" data-status="locked" data-rarity="legendary"
    class="relative inline-grid shrink-0 place-items-center rounded-full size-16">
            <span class="absolute inset-0 rounded-full border-2 border-dashed border-nq-line-strong bg-secondary"></span>
        <span class="relative grid place-items-center rounded-full size-[68%]">
                    <svg class="text-muted-foreground 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">
  <rect width="18" height="11" x="3" y="11" rx="2" ry="2"/>
  <path d="M7 11V7a5 5 0 0 1 10 0v4"/>
</svg>            </span>
</span>
                    <span dir="auto" class="line-clamp-2 text-label text-muted-foreground">Secret achievement</span>
                    <span class="flex flex-col items-center gap-0.5 text-caption text-muted-foreground">
                        <span>Locked</span>
                                            </span>
                </button>
            </li>
            </ul>
</section>
    <div role="group" aria-labelledby="nq-ach-16100009" data-slot="achievement-card" data-status="in-progress"
    class="flex flex-col gap-4 rounded-card border border-border bg-card py-4 text-card-foreground min-w-0">
    <div data-slot="card-content" class="flex flex-col items-center gap-4 px-4 text-center sm:flex-row sm:items-start sm:text-start">
        <span aria-hidden="true" data-slot="achievement-medal" data-status="in-progress" data-rarity="rare"
    class="relative inline-grid shrink-0 place-items-center rounded-full size-24">
            <svg viewBox="0 0 96 96" class="absolute inset-0 -rotate-90 rtl:scale-x-[-1] text-nq-info-text">
            <circle cx="48" cy="48" r="46" fill="none" stroke-width="4" class="stroke-nq-line" />
            <circle cx="48" cy="48" r="46" fill="none" stroke-width="4" stroke-linecap="round" stroke-dasharray="289.0265" stroke-dashoffset="124.2814" class="stroke-current transition-[stroke-dashoffset] duration-300 ease-nq motion-reduce:transition-none" />
        </svg>
        <span class="relative grid place-items-center rounded-full size-[72%] bg-nq-info-soft">
                    <svg class="size-10 text-nq-info-text opacity-80" 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="M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z"/>
</svg>            </span>
</span>
        <div class="flex min-w-0 flex-1 flex-col items-center gap-3 sm:items-start">
            <div class="flex flex-col items-center gap-1.5 sm:items-start">
                <div class="flex flex-wrap items-center justify-center gap-1.5 sm:justify-start">
                    <span data-slot="rarity-badge" data-rarity="rare"
    class="inline-flex h-5 shrink-0 items-center whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 gap-1 border-nq-info text-nq-info-text"><svg aria-hidden="true" class="fill-current" 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="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/>
</svg>Rare</span>
                                            <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-accent/40 bg-nq-accent/15 text-nq-accent-text"><svg 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="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"/>
  <path d="M20 2v4"/>
  <path d="M22 4h-4"/>
  <circle cx="4" cy="20" r="2"/>
</svg>+200 XP</span>
                                    </div>
                <h3 data-slot="card-title" id="nq-ach-16100009" class="text-foreground text-body"><span dir="auto">Seven in a row</span></h3>
                <div data-slot="card-description" class="text-body-sm text-muted-foreground"><span dir="auto">Order seven days running.</span></div>
            </div>
                            <div data-slot="progress" data-tone="default" role="progressbar"  aria-labelledby="nq-progress-b6e0b0c9-label"     aria-valuemin="0" aria-valuemax="100"  aria-valuenow="57"     aria-valuetext="57%" data-progressing
    class="flex flex-col gap-1.5 w-full max-w-sm">
            <div data-slot="progress-head" class="flex items-baseline justify-between gap-3 text-body-sm">
            <span id="nq-progress-b6e0b0c9-label" class="text-label text-foreground">In progress</span>            <span aria-hidden="true" class="text-muted-foreground tabular-nums">4 of 7</span>        </div>
        <div data-slot="progress-track" data-progressing class="relative block w-full overflow-hidden rounded-full bg-nq-surface-soft h-2">
        <div data-slot="progress-indicator" data-progressing style="inset-inline-start:0;width:57%"
            class="block h-full rounded-full transition-[width] duration-300 ease-nq motion-reduce:transition-none bg-primary"></div>
    </div>
</div>
                                </div>
    </div>
</div>
    <div data-slot="streak-card" class="flex flex-col gap-4 rounded-card border border-border bg-card py-4 text-card-foreground min-w-0 max-w-sm">
    <div data-slot="card-content" class="flex flex-col gap-4 px-4">
        <div data-slot="streak-counter"  class="flex items-center gap-3">
    <span aria-hidden="true" class="grid size-12 shrink-0 place-items-center rounded-full bg-nq-warning-soft text-nq-warning-text">
        <svg class="size-6 fill-current" 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 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4"/>
</svg>    </span>
    <div class="flex min-w-0 flex-col">
        <span class="flex items-baseline gap-1.5">
            <span class="text-h2 tabular-nums text-foreground">5</span>
            <span class="text-body-sm text-muted-foreground">Day streak</span>
        </span>
        <span class="text-caption text-muted-foreground">Longest 5</span>
    </div>
</div>
        <div data-slot="streak-calendar" x-data="nqStreakCalendar(JSON.parse('{\u0022days\u0022:[\u00222026-09-16\u0022,\u00222026-09-17\u0022,\u00222026-09-18\u0022,\u00222026-09-19\u0022,\u00222026-09-20\u0022,\u00222026-09-05\u0022],\u0022today\u0022:\u00222026-09-20\u0022,\u0022year\u0022:2026,\u0022month\u0022:9,\u0022start\u0022:0,\u0022locale\u0022:\u0022en\u0022,\u0022today_label\u0022:\u0022Today\u0022,\u0022active_label\u0022:\u0022Active\u0022}'))" class="flex w-full flex-col gap-2 max-w-none">
    <div class="flex items-center justify-between">
        <button data-slot="button"
     type="button"                         aria-label="Previous month" x-on:click="go(-1)" 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 aria-hidden="true" class="rtl:-scale-x-100" 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="m15 18-6-6 6-6"/>
</svg></button>
        <span aria-live="polite" class="text-label text-foreground" x-ref="title">September 2026</span>
        <button data-slot="button"
     type="button"                         aria-label="Next month" x-on:click="go(1)" 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 aria-hidden="true" class="rtl:-scale-x-100" 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="m9 18 6-6-6-6"/>
</svg></button>
    </div>
    <table role="grid" class="w-full table-fixed border-separate border-spacing-1 text-center">
        <thead>
            <tr><th scope="col" class="pb-1 text-caption font-normal text-muted-foreground">Sun</th><th scope="col" class="pb-1 text-caption font-normal text-muted-foreground">Mon</th><th scope="col" class="pb-1 text-caption font-normal text-muted-foreground">Tue</th><th scope="col" class="pb-1 text-caption font-normal text-muted-foreground">Wed</th><th scope="col" class="pb-1 text-caption font-normal text-muted-foreground">Thu</th><th scope="col" class="pb-1 text-caption font-normal text-muted-foreground">Fri</th><th scope="col" class="pb-1 text-caption font-normal text-muted-foreground">Sat</th></tr>
        </thead>
        <tbody x-ref="body">
                            <tr>
                                            <td class="p-0">
                                                    </td>
                                            <td class="p-0">
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">1</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">2</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">3</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">4</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span  data-active                                       title="Active"                                     class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums bg-nq-warning text-nq-bg">5<span class="sr-only">Active</span><svg aria-hidden="true" class="absolute -end-0.5 -top-0.5 size-3 rounded-full bg-card p-px text-nq-success-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">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
                                                    </td>
                                    </tr>
                            <tr>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">6</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">7</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">8</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">9</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">10</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">11</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">12</span>
                                                    </td>
                                    </tr>
                            <tr>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">13</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">14</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-foreground">15</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span  data-active                                       title="Active"                                     class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums bg-nq-warning text-nq-bg">16<span class="sr-only">Active</span><svg aria-hidden="true" class="absolute -end-0.5 -top-0.5 size-3 rounded-full bg-card p-px text-nq-success-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">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
                                                    </td>
                                            <td class="p-0">
                                                            <span  data-active                                       title="Active"                                     class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums bg-nq-warning text-nq-bg">17<span class="sr-only">Active</span><svg aria-hidden="true" class="absolute -end-0.5 -top-0.5 size-3 rounded-full bg-card p-px text-nq-success-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">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
                                                    </td>
                                            <td class="p-0">
                                                            <span  data-active                                       title="Active"                                     class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums bg-nq-warning text-nq-bg">18<span class="sr-only">Active</span><svg aria-hidden="true" class="absolute -end-0.5 -top-0.5 size-3 rounded-full bg-card p-px text-nq-success-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">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
                                                    </td>
                                            <td class="p-0">
                                                            <span  data-active                                       title="Active"                                     class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums bg-nq-warning text-nq-bg">19<span class="sr-only">Active</span><svg aria-hidden="true" class="absolute -end-0.5 -top-0.5 size-3 rounded-full bg-card p-px text-nq-success-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">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
                                                    </td>
                                    </tr>
                            <tr>
                                            <td class="p-0">
                                                            <span  data-active   data-today                                      title="Today"                                     class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums bg-nq-warning text-nq-bg outline-2 -outline-offset-2 outline-nq-focus">20<span class="sr-only">Active</span><svg aria-hidden="true" class="absolute -end-0.5 -top-0.5 size-3 rounded-full bg-card p-px text-nq-success-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">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">21</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">22</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">23</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">24</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">25</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">26</span>
                                                    </td>
                                    </tr>
                            <tr>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">27</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">28</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">29</span>
                                                    </td>
                                            <td class="p-0">
                                                            <span                                                                          class="relative mx-auto grid aspect-square w-full max-w-9 place-items-center rounded-full text-caption tabular-nums text-muted-foreground/60">30</span>
                                                    </td>
                                            <td class="p-0">
                                                    </td>
                                            <td class="p-0">
                                                    </td>
                                            <td class="p-0">
                                                    </td>
                                    </tr>
                    </tbody>
    </table>
</div>
    </div>
</div>
    <section data-slot="leaderboard" aria-labelledby="nq-lb-00ae8e37" x-data="nqLeaderboard('week')" class="min-w-0 overflow-hidden rounded-card border border-border bg-card">
    <header class="flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3">
        <h2 id="nq-lb-00ae8e37" class="flex items-center gap-2 text-label text-foreground">
            <svg aria-hidden="true" class="size-4 text-nq-accent-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">
  <path d="M10 14.66V17a1 1 0 0 1-1 1 2 2 0 0 0-2 2v2"/>
  <path d="M14 14.66V17a1 1 0 0 0 1 1 2 2 0 0 1 2 2v2"/>
  <path d="M17.916 10H19.5A2.5 2.5 0 0 0 22 7.5V5a1 1 0 0 0-1-1h-3"/>
  <path d="M4 22h16"/>
  <path d="M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z"/>
  <path d="M6.084 10H4.5A2.5 2.5 0 0 1 2 7.5V5a1 1 0 0 1 1-1h3"/>
</svg>            Leaderboard        </h2>
                    <div data-slot="tabs" data-orientation="horizontal" x-data="nqTabs('week')" x-modelable="value" x-id="['nq-tabs']" x-model="period" class="flex flex-col gap-4">
    <div data-slot="tabs-list" data-variant="segmented" aria-orientation="horizontal" x-bind="list"
    aria-label="Period" class="relative z-0 flex max-w-full overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden w-fit gap-0.5 rounded-control bg-secondary p-0.5">
    <button type="button" data-slot="tabs-tab" x-bind="tab('week')"
     data-active aria-selected="true"         class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">This week</button>
                                            <button type="button" data-slot="tabs-tab" x-bind="tab('all')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">All time</button>
                                        <span data-slot="tabs-indicator" aria-hidden="true"
    class="absolute -z-10 transition-[left,width] duration-200 ease-nq left-[var(--active-tab-left)] w-[var(--active-tab-width)] top-[var(--active-tab-top)] h-[var(--active-tab-height)] rounded-[calc(var(--radius-control)-2px)] bg-background shadow-xs"></span>
</div>
</div>
            </header>
                        <ol data-slot="leaderboard-podium" class="flex items-end justify-center gap-2 border-b border-border px-4 pt-6 sm:gap-4">
                                                        <li  class="flex min-w-0 flex-1 basis-0 flex-col items-center gap-1.5 sm:max-w-40 order-2">
                        <span class="relative">
                            <svg aria-hidden="true" class="absolute -top-4 start-1/2 size-5 -translate-x-1/2 text-nq-accent-text rtl:translate-x-1/2" 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="M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z"/>
  <path d="M5 21h14"/>
</svg>                            <span data-slot="avatar" x-data="nqAvatar(0)"
    class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground rounded-full size-14 text-body ring-2 ring-offset-2 ring-offset-card ring-nq-accent">
                    <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback"
             role="img" aria-label="Sara Ali" >SA</span>
    </span>
                        </span>
                        <span class="flex w-full min-w-0 flex-col items-center text-center">
                            <bdi dir="auto" class="w-full truncate text-label text-foreground">Sara Ali</bdi>
                            <span class="text-caption"><span class="tabular-nums text-foreground">2,400<span class="ms-1 text-caption text-muted-foreground">XP</span></span></span>
                        </span>
                        <span class="flex w-full flex-col items-center justify-start gap-0.5 rounded-t-control border border-b-0 pt-2 text-h3 tabular-nums h-24 border-nq-accent bg-nq-accent/15 text-nq-accent-text">
                            <span class="sr-only">Rank</span>
                            1
                            <span data-movement="up" class="inline-flex items-center gap-0.5 text-caption tabular-nums text-nq-success-text">
        <svg aria-hidden="true" class="size-3.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="m5 12 7-7 7 7"/>
  <path d="M12 19V5"/>
</svg>        <span aria-hidden="true">1</span>        <span class="sr-only">Up 1</span>
    </span>
                        </span>
                    </li>
                                                        <li  class="flex min-w-0 flex-1 basis-0 flex-col items-center gap-1.5 sm:max-w-40 order-1">
                        <span class="relative">
                                                        <span data-slot="avatar" x-data="nqAvatar(0)"
    class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground rounded-full size-14 text-body ring-2 ring-offset-2 ring-offset-card ring-nq-line-strong">
                    <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback"
             role="img" aria-label="Omar Nasser" >ON</span>
    </span>
                        </span>
                        <span class="flex w-full min-w-0 flex-col items-center text-center">
                            <bdi dir="auto" class="w-full truncate text-label text-foreground">Omar Nasser</bdi>
                            <span class="text-caption"><span class="tabular-nums text-foreground">2,250<span class="ms-1 text-caption text-muted-foreground">XP</span></span></span>
                        </span>
                        <span class="flex w-full flex-col items-center justify-start gap-0.5 rounded-t-control border border-b-0 pt-2 text-h3 tabular-nums h-16 border-nq-line-strong bg-secondary text-foreground">
                            <span class="sr-only">Rank</span>
                            2
                            <span data-movement="down" class="inline-flex items-center gap-0.5 text-caption tabular-nums text-nq-danger-text">
        <svg aria-hidden="true" class="size-3.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="M12 5v14"/>
  <path d="m19 12-7 7-7-7"/>
</svg>        <span aria-hidden="true">1</span>        <span class="sr-only">Down 1</span>
    </span>
                        </span>
                    </li>
                                                        <li  class="flex min-w-0 flex-1 basis-0 flex-col items-center gap-1.5 sm:max-w-40 order-3">
                        <span class="relative">
                                                        <span data-slot="avatar" x-data="nqAvatar(0)"
    class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground rounded-full size-14 text-body ring-2 ring-offset-2 ring-offset-card ring-nq-line-strong">
                    <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback"
             role="img" aria-label="Lina Haddad" >LH</span>
    </span>
                        </span>
                        <span class="flex w-full min-w-0 flex-col items-center text-center">
                            <bdi dir="auto" class="w-full truncate text-label text-foreground">Lina Haddad</bdi>
                            <span class="text-caption"><span class="tabular-nums text-foreground">1,900<span class="ms-1 text-caption text-muted-foreground">XP</span></span></span>
                        </span>
                        <span class="flex w-full flex-col items-center justify-start gap-0.5 rounded-t-control border border-b-0 pt-2 text-h3 tabular-nums h-12 border-nq-line-strong bg-secondary text-foreground">
                            <span class="sr-only">Rank</span>
                            3
                            <span data-movement="same" class="inline-flex items-center gap-0.5 text-caption tabular-nums text-muted-foreground">
        <svg aria-hidden="true" class="size-3.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="M5 12h14"/>
</svg>                <span class="sr-only">No change</span>
    </span>
                        </span>
                    </li>
                            </ol>
                                    <ol aria-label="Your rank" class="sticky bottom-0 shadow-[0_-4px_8px_-6px_color-mix(in_oklab,var(--nq-fg)_25%,transparent)]">
                <li  data-you="" aria-current="true"  class="flex min-h-14 items-center gap-3 px-4 py-2 border-t border-border bg-card">
    <span class="w-8 shrink-0 text-center text-label tabular-nums text-muted-foreground"><span class="sr-only">Rank </span>4</span>
    <span data-slot="avatar" x-data="nqAvatar(0)"
    class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground size-8 text-caption rounded-full">
                    <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback"
             role="img" aria-label="You Yourself" >YY</span>
    </span>
    <span class="flex min-w-0 flex-1 flex-col">
        <span class="flex items-center gap-1.5">
            <bdi dir="auto" class="truncate text-label text-foreground">You Yourself</bdi>
            <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-brand/40 bg-[color-mix(in_oklab,var(--nq-brand)_14%,transparent)] text-foreground">You</span>
        </span>
            </span>
    <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-info/40 bg-nq-info-soft text-nq-info-text">New</span>
    <span class="min-w-16 text-end text-body-sm">
        <span class="tabular-nums text-foreground">1,200<span class="ms-1 text-caption text-muted-foreground">XP</span></span>
    </span>
</li>
            </ol>
            </section>
    <div data-slot="reward-card" data-status="available" data-rarity="rare" x-data="nqRewardCard('Could not claim. Try again.')"
    class="flex flex-col rounded-card border border-border bg-card text-card-foreground min-w-0 gap-3 overflow-hidden py-0 max-w-xs">
    <div class="grid h-32 place-items-center border-b [&_svg]:size-12 bg-nq-info-soft border-nq-info text-nq-info-text">
        <svg 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="M12 7v14"/>
  <path d="M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8"/>
  <path d="M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5"/>
  <rect x="3" y="7" width="18" height="4" rx="1"/>
</svg>    </div>
    <div data-slot="card-header" class="grid auto-rows-min items-start gap-1 px-4">
        <h3 data-slot="card-title" class="flex flex-wrap items-center gap-1.5 text-label text-foreground">
            <span dir="auto">Free delivery</span>
            <span data-slot="rarity-badge" data-rarity="rare"
    class="inline-flex h-5 shrink-0 items-center whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 gap-1 border-nq-info text-nq-info-text"><svg aria-hidden="true" class="fill-current" 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="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/>
</svg>Rare</span>
        </h3>
        <div data-slot="card-description" class="text-body-sm text-muted-foreground"><span dir="auto">One order, on us.</span></div>    </div>
    <div data-slot="card-content" class="flex flex-col gap-2 px-4 pb-4">
        <div class="flex items-center justify-between gap-2">
                            <span class="inline-flex items-center gap-1 text-label tabular-nums text-foreground">
                    <svg aria-hidden="true" class="size-4 text-nq-accent-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">
  <path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"/>
  <path d="M20 2v4"/>
  <path d="M22 4h-4"/>
  <circle cx="4" cy="20" r="2"/>
</svg>                    <bdi>500 points</bdi>
                </span>
                                        <button type="button" data-slot="button" 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 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-[color-mix(in_oklab,var(--nq-action)_88%,var(--nq-fg))] h-control-sm px-2.5" x-on:click="claim()" x-bind:disabled="busy" x-bind:aria-busy="busy ? 'true' : 'false'" x-bind:data-disabled="busy ? '' : null">
                    <svg data-slot="spinner" aria-hidden="true" style="display: none;" x-show="busy" 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>                    <span x-show="! busy">Claim</span>
                    <span x-show="busy" style="display: none">Claiming</span>
                </button>
                    </div>
                        <p role="alert" class="text-caption text-nq-danger-text" x-show="error" x-text="error" style="display: none"></p>
    </div>
</div>
    <div data-slot="reward-card" data-status="available" data-rarity="epic" x-data="nqRewardCard('Could not claim. Try again.')"
    class="flex flex-col rounded-card border border-border bg-card text-card-foreground min-w-0 gap-3 overflow-hidden py-0 max-w-xs">
    <div class="grid h-32 place-items-center border-b [&_svg]:size-12 bg-[var(--nq-tag-violet-soft)] border-[var(--nq-tag-violet)] text-[var(--nq-tag-violet)]">
        <svg 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="M12 7v14"/>
  <path d="M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8"/>
  <path d="M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5"/>
  <rect x="3" y="7" width="18" height="4" rx="1"/>
</svg>    </div>
    <div data-slot="card-header" class="grid auto-rows-min items-start gap-1 px-4">
        <h3 data-slot="card-title" class="flex flex-wrap items-center gap-1.5 text-label text-foreground">
            <span dir="auto">Gold mug</span>
            <span data-slot="rarity-badge" data-rarity="epic"
    class="inline-flex h-5 shrink-0 items-center whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 gap-1 border-[var(--nq-tag-violet)] text-[var(--nq-tag-violet)]"><svg aria-hidden="true" class="fill-current" 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="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/>
</svg>Epic</span>
        </h3>
            </div>
    <div data-slot="card-content" class="flex flex-col gap-2 px-4 pb-4">
        <div class="flex items-center justify-between gap-2">
                            <span class="inline-flex items-center gap-1 text-label tabular-nums text-foreground">
                    <svg aria-hidden="true" class="size-4 text-nq-accent-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">
  <path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"/>
  <path d="M20 2v4"/>
  <path d="M22 4h-4"/>
  <circle cx="4" cy="20" r="2"/>
</svg>                    <bdi>900 points</bdi>
                </span>
                                        <button type="button" data-slot="button" 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 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-[color-mix(in_oklab,var(--nq-action)_88%,var(--nq-fg))] h-control-sm px-2.5" disabled data-disabled>Claim</button>
                    </div>
                <p class="text-caption text-muted-foreground">280 more needed</p>        <p role="alert" class="text-caption text-nq-danger-text" x-show="error" x-text="error" style="display: none"></p>
    </div>
</div>
    <div role="status" aria-live="polite" data-slot="achievement-unlock-toast" x-data="nqUnlockToast(0, true)" x-on:nq-open="show()"
    class="w-full">
    <div x-ref="card" x-show="open" data-rarity="common" style=""
        x-on:pointerenter="pause()" x-on:pointerleave="resume()" x-on:focusin="pause()" x-on:focusout="resume()"
        class="pointer-events-auto relative flex items-center gap-3 rounded-floating border bg-popover p-3 text-popover-foreground shadow-floating border-nq-line-strong">
        <span class="relative shrink-0">
            <span x-ref="medal" class="inline-block"><span aria-hidden="true" data-slot="achievement-medal" data-status="earned" data-rarity="common"
    class="relative inline-grid shrink-0 place-items-center rounded-full size-16">
            <span class="absolute inset-0 rounded-full border-2 border-nq-line-strong bg-secondary"></span>
        <span class="relative grid place-items-center rounded-full size-[68%]">
                    <svg class="size-7 text-muted-foreground" 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 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"/>
  <path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09"/>
  <path d="M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z"/>
  <path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05"/>
</svg>            </span>
</span>
</span>
            <span x-ref="burst" aria-hidden="true" class="pointer-events-none absolute inset-0">
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-accent"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-success"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-info"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-accent"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-success"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-info"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-accent"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-success"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-info"></span>
                                    <span class="absolute start-1/2 top-1/2 size-1.5 rounded-full opacity-0 bg-nq-accent"></span>
                            </span>
        </span>
        <div class="flex min-w-0 flex-1 flex-col gap-0.5">
            <span class="text-eyebrow text-nq-accent-text">Achievement unlocked</span>
            <span dir="auto" class="truncate text-label text-foreground">First order</span>
            <span class="flex flex-wrap items-center gap-1.5 text-caption text-muted-foreground">
                <span>Common</span>
                <span class="text-nq-accent-text">+50 XP</span>            </span>
        </div>
                    <button data-slot="button"
     type="button"                         data-id="first" x-on:click="view($el.dataset.id)" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border 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 border-border bg-card text-foreground hover:bg-nq-hover h-control-sm px-2.5">
        View</button>
                <button data-slot="button"
     type="button"                         aria-label="Dismiss" x-on:click="close()" 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 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="M18 6 6 18"/>
  <path d="m6 6 12 12"/>
</svg></button>
    </div>
</div>
</div>
```
