# Bionis dashboard

A shadcn/ui block from the [@watermelon](https://ui.watermelon.sh/?utm_source=shadcn.exchange) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/watermelon/bionis-dashboard).

- Page, with a live preview: https://shadcn.exchange/r/watermelon/bionis-dashboard
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/watermelon/bionis-dashboard-light-95c36fa32867f728.png
- Registry item: https://registry.watermelon.sh/r/bionis-dashboard.json
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://shadcn.exchange/r/watermelon/bionis-dashboard.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `lucide-react`, `recharts`
- Registry items: `button`, `dropdown-menu`, `input-group`, `sidebar`, `utils`

## Files

### `src/components/dashboards/bionis-dashboard/components/bionis/dashboard-content.tsx`

```tsx
import { useMemo, useState, type ComponentType, type SVGProps } from 'react'
import {
  AlertDiamondIcon,
  AlertTriangleIcon,
  BedIcon,
  BlingFilledIcon,
  CalendarIcon,
  CheckCircleRegularIcon,
  DropIcon,
  HeartbeatFilledIcon,
  HighKneesIcon,
  Sparkles3FilledIcon,
  VoiceIcon,
} from './icons'
import {
  ScoreDonut,
  SleepBreakdownChart,
  ActivityTrendChart,
  KeyMetricCard,
} from './shared'
import { Button } from '@/components/ui/button'
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import {
  bodyVitals,
  currentUser,
  getActivityTrend,
  getSleepBreakdown,
  healthPredictions,
  keyMetricsByTimeline,
  recommendedActions,
  timelineOptions,
  wellnessByTimeline,
  type BodyVitalTone,
  type HealthPredictionTone,
  type RecommendedAction,
  type TimelineOptionValue,
} from '../../data'
import { cn } from '@/lib/utils'

function useGreeting(fullName: string) {
  return useMemo(() => {
    const hour = new Date().getHours()
    const firstName = fullName.split(' ')[0] ?? fullName

    if (hour < 12) return `Good Morning ${firstName}`
    if (hour < 18) return `Good Afternoon ${firstName}`
    return `Good Evening ${firstName}`
  }, [fullName])
}


const predictionToneIcon: Record<
  HealthPredictionTone,
  ComponentType<SVGProps<SVGSVGElement>>
> = {
  warning: AlertTriangleIcon,
  success: CheckCircleRegularIcon,
  danger: AlertDiamondIcon,
}

const predictionToneClass: Record<HealthPredictionTone, string> = {
  warning: 'text-(--prediction-warn)',
  success: 'text-(--vital-good)',
  danger: 'text-(--prediction-danger)',
}

const vitalToneClass: Record<BodyVitalTone, string> = {
  good: 'text-(--vital-good)',
  neutral: 'text-foreground',
  warn: 'text-(--chart-warn)',
}

const actionIcons: Record<
  RecommendedAction['icon'],
  ComponentType<SVGProps<SVGSVGElement>>
> = {
  bed: BedIcon,
  drop: DropIcon,
  highKnees: HighKneesIcon,
  voice: VoiceIcon,
}

function InsightBadge({ children }: { children: string }) {
  return (
    <span className="inline-flex shrink-0 items-center rounded-xl bg-background px-2.5 py-2 text-xs font-medium tracking-tight text-(--chart-period)">
      {children}
    </span>
  )
}

export function DashboardContent() {
  const greeting = useGreeting(currentUser.name)
  const [timeline, setTimeline] = useState<TimelineOptionValue>('7d')
  const selectedLabel =
    timelineOptions.find((option) => option.value === timeline)?.label ??
    'Last 7 days'
  const wellness = wellnessByTimeline[timeline]
  const keyMetrics = keyMetricsByTimeline[timeline]
  const sleepBreakdown = getSleepBreakdown(timeline)
  const activityTrend = getActivityTrend(timeline)

  return (
    <div className="flex flex-col gap-8">
      <div className="flex items-center justify-between gap-3">
        <h1 className="min-w-0 truncate text-xl font-medium md:text-2xl">
          {greeting}
        </h1>

        <DropdownMenu>
          <DropdownMenuTrigger asChild>
            <Button
              type="button"
              variant="outline"
              className="h-10 shrink-0 gap-1 rounded-lg px-3.5 text-sm font-normal tracking-tight shadow-[0_2px_4px_rgba(0,0,0,0.05)]"
            >
              <CalendarIcon />
              <span>{selectedLabel}</span>
            </Button>
          </DropdownMenuTrigger>
          <DropdownMenuContent align="end" className="bionis-dashboard min-w-40">
            <DropdownMenuRadioGroup
              value={timeline}
              onValueChange={(value) =>
                setTimeline(value as TimelineOptionValue)
              }
            >
              {timelineOptions.map((option) => (
                <DropdownMenuRadioItem
                  key={option.value}
                  value={option.value}
                  className="font-normal text-muted-foreground data-[state=checked]:font-medium data-[state=checked]:text-foreground"
                >
                  {option.label}
                </DropdownMenuRadioItem>
              ))}
            </DropdownMenuRadioGroup>
          </DropdownMenuContent>
        </DropdownMenu>
      </div>

      <section className="flex items-center gap-6">
        <div className="flex min-h-28.5 flex-col justify-between gap-4">
          <h2 className="text-lg font-medium">Overall Wellness</h2>
          <div className="flex flex-col gap-2">
            <span className="inline-flex w-fit rounded-xl bg-(--live)/10 px-3 py-1 text-sm font-medium text-(--live)">
              {wellness.condition}
            </span>
            <p className="max-w-md text-sm leading-[1.4] text-muted-foreground">
              {wellness.summary.before}
              <span className="font-medium text-foreground">
                {wellness.summary.highlight}
              </span>
              {wellness.summary.after}
            </p>
          </div>
        </div>

        <div className="flex flex-1 items-center justify-center">
          <ScoreDonut value={wellness.score} />
        </div>
      </section>

      <section className="flex flex-col gap-3.5">
        <div className="flex flex-col gap-2">
          <h2 className="text-lg font-medium">Key metrics</h2>
          <p className="text-sm text-muted-foreground">
            Today&apos;s snapshot vs your weekly average
          </p>
        </div>
        <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4">
          {keyMetrics.map((metric) => (
            <KeyMetricCard key={metric.id} metric={metric} />
          ))}
        </div>
      </section>

      <section className="grid grid-cols-1 gap-6 xl:grid-cols-2">
        <SleepBreakdownChart
          key={`sleep-${timeline}`}
          data={sleepBreakdown.points}
          flaggedNights={sleepBreakdown.flaggedNights}
        />
        <ActivityTrendChart
          key={`activity-${timeline}`}
          data={activityTrend}
          periodLabel={selectedLabel}
        />
      </section>

      <section className="grid grid-cols-1 gap-4 xl:grid-cols-3">
        <article className="flex min-h-85.5 flex-col gap-6 rounded-2xl border bg-[linear-gradient(180deg,rgb(99_102_241/0.08)_0%,transparent_42%)] p-4">
          <div className="flex flex-wrap items-center justify-between gap-x-3 gap-y-2">
            <div className="flex items-center gap-2">
              <span className="flex size-7 shrink-0 items-center justify-center rounded-md bg-(--insight-prediction) text-white">
                <Sparkles3FilledIcon className="size-4" />
              </span>
              <h3 className="font-medium">Health Prediction</h3>
            </div>
            <InsightBadge>7 days outlook</InsightBadge>
          </div>

          <div className="flex flex-1 flex-col gap-2">
            {healthPredictions.map((item) => {
              const Icon = predictionToneIcon[item.tone]
              return (
                <div
                  key={item.id}
                  className="flex flex-1 items-center gap-3 rounded-xl bg-muted px-3 py-2"
                >
                  <Icon
                    className={cn('size-5 shrink-0', predictionToneClass[item.tone])}
                  />
                  <div className="flex min-w-0 flex-col gap-1.5">
                    <p className="text-sm font-medium">{item.title}</p>
                    <p className="text-xs text-muted-foreground">
                      {item.description}
                    </p>
                  </div>
                </div>
              )
            })}
          </div>
        </article>

        <article className="flex min-h-85.5 flex-col gap-6 rounded-2xl border bg-[linear-gradient(180deg,rgb(247_46_46/0.08)_0%,transparent_42%)] p-4">
          <div className="flex flex-wrap items-center justify-between gap-x-3 gap-y-2">
            <div className="flex items-center gap-2">
              <span className="flex size-7 shrink-0 items-center justify-center rounded-md bg-(--insight-vitals) text-white">
                <HeartbeatFilledIcon className="size-4" />
              </span>
              <h3 className="font-medium">Body Vitals</h3>
            </div>
            <InsightBadge>All Stable</InsightBadge>
          </div>

          <div className="flex flex-1 flex-col justify-between rounded-xl bg-background p-3">
            {bodyVitals.map((vital) => (
              <div
                key={vital.id}
                className="flex items-center justify-between gap-3 py-1.5"
              >
                <p className="text-muted-foreground">
                  {vital.label}
                </p>
                <p
                  className={cn(
                    'shrink-0 font-semibold',
                    vitalToneClass[vital.tone],
                  )}
                >
                  {vital.value}
                </p>
              </div>
            ))}
          </div>
        </article>

        <article className="flex min-h-85.5 flex-col gap-6 rounded-2xl border bg-[linear-gradient(180deg,rgb(20_184_166/0.08)_0%,transparent_42%)] p-4">
          <div className="flex flex-wrap items-center gap-2">
            <span className="flex size-7 shrink-0 items-center justify-center rounded-md bg-(--insight-actions) text-white">
              <BlingFilledIcon className="size-4" />
            </span>
            <h3 className="font-medium">Recommended actions</h3>
          </div>

          <div className="flex flex-1 flex-col justify-between gap-2">
            {recommendedActions.map((action) => {
              const Icon = actionIcons[action.icon]
              return (
                <div
                  key={action.id}
                  className="flex items-start gap-3 rounded-xl bg-muted px-3 py-2"
                >
                  <Icon className="size-5 shrink-0 text-foreground" />
                  <div className="flex min-w-0 flex-col gap-1.5">
                    <p className="text-sm font-medium">{action.title}</p>
                    <p className="text-xs text-muted-foreground/80">
                      {action.description}
                    </p>
                  </div>
                </div>
              )
            })}
          </div>
        </article>
      </section>
    </div>
  )
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/icons.tsx`

```tsx
import type { SVGProps } from 'react'
import { cn } from '@/lib/utils'

type IconProps = SVGProps<SVGSVGElement>

function Icon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    />
  )
}

export function HomeIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 21"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.615 3.03c-.315.085-.577.277-3.963 2.913-3.907 3.04-3.647 2.81-3.65 3.238 0 .251.067.41.25.586.179.175.358.218.892.218h.444l.001 3.31c.003 3.692-.006 3.536.224 3.918.134.222.405.482.633.605.348.188.152.182 5.554.182 5.4 0 5.204.006 5.556-.182.214-.115.56-.46.674-.674.183-.343.182-.309.182-3.88V9.985h.444c.534 0 .713-.043.893-.218a.72.72 0 0 0 .248-.586c-.002-.429.258-.198-3.647-3.237-1.916-1.491-3.552-2.745-3.636-2.786a2 2 0 0 0-.313-.118 2.2 2.2 0 0 0-.786-.01m2.953 3.553 2.53 1.967-.097.121c-.202.255-.192.038-.192 4.06v3.667H5.191v-3.65c0-3.992.008-3.825-.189-4.073l2.442-2.1C8.84 5.488 9.997 4.603 10.01 4.608q1.285.98 2.557 1.975"
        fill="currentColor"
      />
    </svg>
  )
}

export function SleepIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M7.00917 2.37333C6.9685 2.4399 6.93311 2.50956 6.90333 2.58167C6.66083 3.13833 5.985 3.905 5.40583 4.28333C5.2375 4.3925 5.1 4.505 5.10083 4.53333C5.10167 4.56083 5.24 4.67333 5.40917 4.78333C5.75917 5.01 6.30417 5.53333 6.54 5.86833C6.62417 5.98833 6.77167 6.23167 6.86667 6.41C6.96167 6.5875 7.05917 6.73333 7.08333 6.73333C7.1075 6.73333 7.205 6.5875 7.3 6.41C7.395 6.23167 7.5425 5.98833 7.62667 5.86833C7.85917 5.5375 8.4425 4.97833 8.77667 4.76667C8.93583 4.66583 9.06583 4.56083 9.06583 4.53333C9.06667 4.505 8.92917 4.3925 8.76083 4.28333C8.1825 3.90583 7.6225 3.275 7.2825 2.62C7.14333 2.35167 7.07583 2.29083 7.00917 2.37333ZM10.9333 2.63083C10.7567 2.68157 10.6019 2.78956 10.4933 2.93783C10.3847 3.08611 10.3284 3.26627 10.3333 3.45C10.3333 3.58167 10.365 3.70917 10.4475 3.90833C10.8321 4.82925 10.9319 5.84432 10.7339 6.82249C10.5359 7.80066 10.0492 8.69701 9.33667 9.39583C8.66417 10.0608 7.795 10.5233 6.80833 10.7408C6.545 10.7983 6.37 10.8125 5.88333 10.8142C5.08833 10.8158 4.69917 10.7458 3.95417 10.465C3.44667 10.2742 3.155 10.29 2.895 10.525C2.6125 10.78 2.55917 11.0192 2.66667 11.5508C3.19917 14.1983 5.27333 16.4342 7.90167 17.195C9.69956 17.7177 11.6279 17.5492 13.3079 16.7225C14.9879 15.8959 16.298 14.4709 16.9808 12.7275C17.3267 11.8567 17.48 11.0167 17.48 10C17.48 9.22083 17.43 8.81833 17.2467 8.10167C16.5575 5.4125 14.355 3.28917 11.6292 2.68583C11.2333 2.59833 11.0808 2.58583 10.9333 2.63083ZM12.6758 4.82083C13.2067 5.0875 13.8042 5.53333 14.2025 5.96C15.0025 6.81583 15.4808 7.73917 15.7225 8.895C15.8 9.26417 15.8108 9.39833 15.8133 9.96667C15.815 10.4508 15.8008 10.6975 15.7575 10.9333C15.5225 12.2108 14.9908 13.2417 14.1158 14.1158C13.1792 15.0533 12.0467 15.6083 10.7142 15.7833C8.3225 16.0967 5.93 14.835 4.8175 12.6733C4.74833 12.54 4.69833 12.4242 4.70667 12.4158C4.71417 12.4083 4.8175 12.4192 4.935 12.44C5.05333 12.4608 5.4575 12.4783 5.83333 12.4792C6.61417 12.4808 7.09583 12.4142 7.75667 12.2142C8.99083 11.84 10.1742 11.0533 10.9725 10.0767C12.0642 8.74 12.6083 7.02583 12.4742 5.34167C12.4622 5.15197 12.4419 4.9629 12.4133 4.775C12.4017 4.73333 12.4017 4.7 12.4133 4.7C12.425 4.7 12.5433 4.75417 12.6758 4.82083ZM4.485 6.53C4.31917 6.8975 3.88417 7.39583 3.52833 7.625C3.35417 7.73667 3.27833 7.83333 3.365 7.83333C3.38167 7.83333 3.51833 7.92583 3.66833 8.03917C3.975 8.26917 4.26083 8.6075 4.43417 8.94333C4.49833 9.06583 4.56583 9.16667 4.58417 9.16667C4.60333 9.16667 4.66583 9.0725 4.7225 8.95667C4.8875 8.62333 5.19167 8.26833 5.53083 8.015C5.6975 7.89083 5.83333 7.78 5.83333 7.76917C5.78638 7.72271 5.73307 7.68315 5.675 7.65167C5.31833 7.42917 4.81333 6.855 4.66917 6.505C4.61083 6.365 4.55583 6.3725 4.485 6.53Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function ActivityIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M7.78833 1.96333C7.39417 2.07833 7.22333 2.19167 7.09083 2.42667C7.0366 2.52477 7.00293 2.6329 6.99188 2.74444C6.98083 2.85599 6.99262 2.96862 7.02655 3.07546C7.06047 3.1823 7.11581 3.28111 7.18919 3.36585C7.26257 3.45059 7.35244 3.51948 7.45333 3.56833C7.66667 3.67167 7.88583 3.6675 8.315 3.55167C8.7525 3.43333 8.91 3.32917 9.04167 3.06917C9.2075 2.74083 9.15083 2.35333 8.9 2.11C8.63667 1.85333 8.31167 1.81083 7.78833 1.96333ZM11.2833 1.93833C10.9833 2.09417 10.8333 2.33917 10.8333 2.67583C10.8333 3.08 11.0642 3.37667 11.4642 3.48583C12.5942 3.795 13.4358 4.20667 14.2 4.82417C14.495 5.0625 15.055 5.63417 15.2717 5.91667C16.1675 7.08775 16.6573 8.51892 16.6667 9.99333C16.661 11.4725 16.171 12.909 15.2717 14.0833C15.0558 14.3658 14.495 14.9375 14.2 15.1758C13.2177 15.9718 12.0293 16.472 10.7734 16.618C9.51758 16.7639 8.24612 16.5496 7.1075 16C6.46285 15.6983 5.87551 15.2869 5.37167 14.7842C4.48897 13.9398 3.85804 12.8669 3.54917 11.685C3.44917 11.3175 3.35667 11.145 3.19333 11.025C3.01417 10.8933 2.88667 10.8583 2.63833 10.8717C2.345 10.8883 2.13 11.0117 1.985 11.2467C1.83 11.4967 1.83 11.74 1.9825 12.2667C2.3032 13.3943 2.85787 14.4417 3.61039 15.3407C4.36291 16.2397 5.29639 16.97 6.35 17.4842C7.15833 17.8808 8.04917 18.1458 9 18.2733C9.51833 18.3425 10.6958 18.3242 11.2267 18.2392C12.5717 18.0225 13.7067 17.5708 14.7667 16.8283C16.3165 15.7457 17.4522 14.1683 17.9874 12.3551C18.5225 10.5419 18.4253 8.60066 17.7117 6.85C17.2311 5.68112 16.4921 4.63622 15.5501 3.79366C14.6081 2.9511 13.4875 2.33276 12.2725 1.985C11.78 1.84333 11.4933 1.83 11.2833 1.93833ZM4.62167 3.72083C4.41083 3.78583 3.8775 4.29 3.75083 4.54417C3.58917 4.86833 3.65083 5.21917 3.91583 5.48417C4.18083 5.74917 4.53167 5.81083 4.85583 5.64917C5.10333 5.52583 5.605 4.99833 5.6775 4.785C5.73335 4.63623 5.74448 4.47438 5.70954 4.31936C5.6746 4.16435 5.5951 4.02292 5.48083 3.9125C5.25583 3.6875 4.95167 3.62 4.62167 3.72083ZM9.7025 5.0575C9.59621 5.10284 9.49929 5.16755 9.41667 5.24833C9.15917 5.50583 9.16667 5.4275 9.16667 7.91667C9.16667 9.8675 9.17333 10.14 9.22083 10.2858C9.27 10.4325 9.41917 10.5942 10.6292 11.8092C12.0925 13.2783 12.1592 13.3333 12.4817 13.3333C12.7575 13.3325 12.8942 13.2767 13.0858 13.0858C13.2767 12.8942 13.3333 12.7567 13.3325 12.4833C13.3317 12.1642 13.2825 12.1025 12.015 10.8325L10.8333 9.64917V7.68C10.8333 5.45583 10.8383 5.50333 10.5842 5.24917C10.4712 5.13577 10.328 5.05738 10.1716 5.02338C10.0152 4.98938 9.85232 5.00123 9.7025 5.0575ZM2.56333 6.97667C2.2525 7.09333 2.09417 7.315 1.95333 7.83333C1.8075 8.36667 1.85667 8.72833 2.105 8.95417C2.46833 9.28583 3.08583 9.22417 3.35167 8.83083C3.46833 8.6575 3.6675 7.96 3.66583 7.72917C3.66417 7.4525 3.47833 7.16 3.2175 7.02583C3.0525 6.94083 2.72583 6.91667 2.56333 6.97667Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function RecoveryIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M3.06083 4.21833C2.84917 4.285 2.62333 4.51333 2.54833 4.7375C2.48333 4.93417 2.4975 5.16167 2.5875 5.35833C2.62333 5.43833 3.20083 6.0425 4.18 7.02667C5.91083 8.76417 5.89417 8.75083 6.295 8.72833C6.73417 8.70333 7.03333 8.41 7.06083 7.97833C7.08583 7.5925 7.0575 7.55083 6.15417 6.64083L5.35083 5.83083L8.80083 5.8425C11.9675 5.8525 12.2708 5.85833 12.5 5.9125C13.3692 6.11833 14.0025 6.46583 14.6017 7.065C15.2133 7.67667 15.5717 8.34 15.7558 9.2C15.84 9.5925 15.84 10.4075 15.7558 10.8C15.5717 11.6592 15.2142 12.32 14.6008 12.9342C13.9992 13.535 13.3683 13.8817 12.5 14.0875C12.27 14.1417 11.9208 14.1483 8.1 14.165C3.45333 14.1858 3.8325 14.1633 3.5725 14.4317C3.25167 14.7617 3.25917 15.2542 3.58917 15.5842C3.85917 15.8542 3.55833 15.8383 8.20583 15.8233C12.5633 15.8083 12.4683 15.8117 13.1 15.6525C15.1667 15.13 16.8258 13.455 17.3292 11.3833C17.5342 10.4725 17.5342 9.5275 17.3292 8.61667C17.0734 7.59047 16.5455 6.65226 15.8012 5.90092C15.0569 5.14958 14.1237 4.61292 13.1 4.3475C12.4625 4.18667 12.6033 4.19083 7.76667 4.18C3.84667 4.17083 3.195 4.17667 3.06083 4.21833Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function TrendsIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M13.8942 5.0525C13.7785 5.09328 13.674 5.16064 13.5892 5.24917C13.5093 5.32394 13.4455 5.4143 13.402 5.51468C13.3584 5.61506 13.3359 5.72331 13.3358 5.83274C13.3357 5.94217 13.3581 6.05045 13.4015 6.15089C13.445 6.25133 13.5085 6.34178 13.5883 6.41667C13.8117 6.64 13.9392 6.66667 14.7808 6.66667H15.4833L13.575 8.575L11.6675 10.4825L10.0417 8.86C8.81083 7.63083 8.38 7.22 8.26667 7.16917C8.15268 7.12094 8.02983 7.09721 7.90608 7.0995C7.78234 7.1018 7.66045 7.13008 7.54833 7.1825C7.42083 7.24583 6.74583 7.90333 4.57917 10.0742C2.02 12.6383 1.77083 12.8975 1.72083 13.0475C1.69051 13.14 1.6723 13.2361 1.66667 13.3333C1.66667 13.6708 1.92417 14.0217 2.24167 14.1158C2.45667 14.18 2.54333 14.18 2.76917 14.1133C2.94417 14.0625 3.02583 13.985 5.43333 11.5808L7.91667 9.10167L9.56667 10.7475C11.1517 12.3283 11.2242 12.3958 11.3975 12.4467C11.6242 12.5133 11.7092 12.5133 11.9358 12.4467C12.1108 12.3958 12.19 12.3208 14.3917 10.1225L16.6667 7.85167V8.57C16.6667 9.41083 16.69 9.5175 16.9217 9.75C17.0717 9.89917 17.3033 10 17.5 10C17.835 10 18.1892 9.74 18.2825 9.425C18.3583 9.17167 18.3583 5.82833 18.2825 5.575C18.2413 5.45323 18.1725 5.3426 18.0816 5.2517C17.9907 5.16079 17.8801 5.09206 17.7583 5.05083C17.5125 4.9775 14.1317 4.97917 13.8942 5.0525Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function PredictionIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M8.89 1.7175C8.72448 1.7729 8.58241 1.88239 8.48667 2.02833C8.445 2.095 8.21083 2.6 7.9675 3.15C7.4675 4.2775 7.2675 4.69083 7.02417 5.1C6.26923 6.35307 5.23014 7.41101 3.99083 8.18833C3.82167 8.2925 3.30083 8.59333 2.83333 8.85583C1.92833 9.36417 1.81083 9.45667 1.71833 9.72583C1.65333 9.91667 1.65333 10.0425 1.71583 10.2542C1.8 10.5375 1.9125 10.6267 2.83333 11.1442C3.30083 11.4067 3.82167 11.7075 3.99083 11.8117C5.23014 12.589 6.26923 13.6469 7.02417 14.9C7.2675 15.3092 7.4675 15.7225 7.9675 16.85C8.21083 17.4 8.44667 17.905 8.49167 17.9725C8.57917 18.1058 8.75333 18.2333 8.93 18.2942C9.25083 18.405 9.66583 18.2583 9.84667 17.9717C9.88833 17.905 10.1225 17.4 10.3658 16.85C10.8658 15.7225 11.0658 15.3092 11.3092 14.9C12.0641 13.6469 13.1032 12.589 14.3425 11.8117C14.5117 11.7075 15.0325 11.4067 15.5 11.1442C16.405 10.6358 16.5225 10.5433 16.615 10.2742C16.68 10.0833 16.68 9.9575 16.6175 9.74583C16.5333 9.4625 16.4208 9.37333 15.5 8.85583C15.1111 8.63868 14.7252 8.41616 14.3425 8.18833C13.1032 7.41101 12.0641 6.35307 11.3092 5.1C11.0658 4.69083 10.8658 4.2775 10.3658 3.15C10.1225 2.6 9.88667 2.095 9.84167 2.0275C9.73801 1.87973 9.58918 1.76962 9.41756 1.71371C9.24593 1.65781 9.0608 1.65914 8.89 1.7175ZM15.4283 2.25667C14.9125 2.9775 14.6908 3.21833 14.0867 3.71833C13.8008 3.95583 13.5667 4.15667 13.5667 4.16667C13.5667 4.17667 13.8008 4.3775 14.0867 4.615C14.6908 5.115 14.9125 5.35583 15.4275 6.075C15.6342 6.36333 15.8167 6.6 15.8333 6.6C15.85 6.6 16.0317 6.365 16.2375 6.0775C16.755 5.355 16.96 5.13083 17.5617 4.62917C17.8483 4.38917 18.0833 4.18167 18.0833 4.16667C18.0833 4.15167 17.8492 3.945 17.5633 3.70583C16.955 3.1975 16.7833 3.01083 16.2642 2.29C16.0525 1.995 15.8625 1.74833 15.8425 1.74167C15.8225 1.735 15.6367 1.96667 15.4283 2.25667ZM9.35167 4.955C10.2633 6.94917 11.8308 8.66417 13.77 9.79083C13.9517 9.89583 14.1 9.99 14.1 10C14.1 10.01 13.9517 10.1042 13.77 10.2092C11.8368 11.3307 10.2946 13.0187 9.35167 15.045C9.2625 15.24 9.17917 15.4 9.16667 15.4C9.15417 15.4 9.07083 15.24 8.98167 15.045C8.07 13.0508 6.5025 11.3358 4.56333 10.2092C4.38167 10.1042 4.23333 10.01 4.23333 10C4.23333 9.99083 4.3725 9.90167 4.54167 9.80333C6.00917 8.94833 7.24833 7.79167 8.15 6.43333C8.48167 5.93417 8.76167 5.435 8.98167 4.955C9.07083 4.76 9.15417 4.6 9.16667 4.6C9.17917 4.6 9.2625 4.76 9.35167 4.955Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function ReportsIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M4.56417 1.7275C4.15667 1.83417 3.78833 2.11917 3.55417 2.51167C3.31833 2.90417 3.33333 2.40917 3.335 10.0233C3.33667 16.3967 3.34083 16.8992 3.39417 17.1025C3.5025 17.5183 3.8325 17.93 4.22583 18.1433C4.5875 18.3392 4.38417 18.3325 10 18.3325C15.6133 18.3325 15.41 18.3392 15.7758 18.1433C15.9992 18.0242 16.3575 17.6658 16.4767 17.4425C16.6717 17.0775 16.6658 17.2633 16.6658 11.8475C16.6667 8.4075 16.6558 6.81833 16.63 6.6825C16.5987 6.53982 16.5521 6.40095 16.4908 6.26833C16.3967 6.06833 16.2175 5.88 14.3358 3.9975C12.4533 2.11583 12.265 1.93667 12.065 1.8425C11.9324 1.78126 11.7935 1.7346 11.6508 1.70333C11.5175 1.67833 10.3875 1.6675 8.11917 1.66833C5.07667 1.67 4.76417 1.67583 4.56417 1.7275ZM10.0067 5.35833L10.0167 7.38333L10.11 7.58333C10.2325 7.84583 10.4892 8.10333 10.7467 8.2225L10.95 8.31667L12.975 8.32667L15 8.33583V16.6667H5V3.33333H9.9975L10.0067 5.35833ZM13.1667 5.18333L14.65 6.66667H11.6667V5.18333C11.6667 4.3675 11.6708 3.7 11.675 3.7C11.68 3.7 12.3508 4.3675 13.1667 5.18333ZM7.2275 9.21917C6.925 9.3125 6.66667 9.67167 6.66667 10C6.66667 10.3375 6.92417 10.6883 7.24167 10.7825C7.47833 10.8533 8.355 10.8533 8.59167 10.7825C8.90667 10.6892 9.16667 10.335 9.16667 10C9.16667 9.665 8.90667 9.31083 8.59167 9.2175C8.3625 9.14917 7.45083 9.15083 7.2275 9.21917ZM7.2275 12.5525C6.925 12.6458 6.66667 13.005 6.66667 13.3333C6.66667 13.6708 6.92417 14.0217 7.24167 14.1158C7.4975 14.1917 12.5025 14.1917 12.7583 14.1158C13.0733 14.0225 13.3333 13.6683 13.3333 13.3333C13.3333 12.9983 13.0733 12.6442 12.7583 12.5508C12.5108 12.4767 7.4675 12.4792 7.2275 12.5525Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function BellIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M9.61667 1.68583C8.92917 1.75167 8.54167 1.83333 8.01667 2.0225C7.21364 2.31304 6.48436 2.77667 5.88052 3.38052C5.27667 3.98436 4.81304 4.71364 4.5225 5.51667C4.21417 6.375 4.195 6.54833 4.17083 8.7725L4.15 10.6617L3.35667 12.2558C2.5825 13.8125 2.56417 13.855 2.56583 14.05C2.56833 14.445 2.71167 14.6983 3.03333 14.88L3.21667 14.9833L4.99417 15L6.77167 15.0167L6.85 15.24C7.02131 15.7254 7.30039 16.1658 7.66627 16.5279C8.03215 16.89 8.47532 17.1645 8.9625 17.3308C9.20833 17.4142 9.73333 17.5 10 17.5C10.1008 17.5 10.3275 17.4775 10.5042 17.4517C11.1044 17.358 11.6678 17.1026 12.134 16.713C12.6001 16.3233 12.9513 15.8141 13.15 15.24L13.2283 15.0167L15.0058 15L16.7833 14.9833L16.9667 14.88C17.2883 14.6983 17.4317 14.445 17.4342 14.05C17.4358 13.855 17.4175 13.8125 16.6433 12.2558L15.85 10.6617L15.8292 8.7725C15.805 6.54833 15.7858 6.375 15.4775 5.51667C14.7633 3.53167 12.9842 2.06083 10.9183 1.74833C10.605 1.70083 9.84417 1.66417 9.61667 1.68583ZM10.8333 3.4175C11.6667 3.59917 12.3333 3.96333 12.935 4.565C13.4225 5.0525 13.7292 5.54 13.9433 6.16667C14.1417 6.74917 14.1425 6.75667 14.1642 8.86667C14.1833 10.65 14.1908 10.8383 14.25 11.0667C14.2917 11.23 14.4858 11.6625 14.8075 12.3108C15.0783 12.8575 15.3 13.3117 15.3 13.3192C15.3 13.3267 12.915 13.3333 10 13.3333C7.085 13.3333 4.7 13.3267 4.7 13.3192C4.7 13.3117 4.92167 12.8575 5.1925 12.3108C5.51417 11.6625 5.70833 11.23 5.75 11.0667C5.80917 10.8383 5.81667 10.65 5.83583 8.86667C5.8575 6.75667 5.85833 6.74917 6.05667 6.16667C6.27083 5.54 6.5775 5.0525 7.065 4.565C7.43833 4.19167 7.72667 3.98167 8.15417 3.77167C8.58 3.56167 8.85667 3.47833 9.53333 3.35333C9.70917 3.32083 10.5917 3.36417 10.8333 3.4175ZM11.4333 15.0342C11.4333 15.0525 11.325 15.1783 11.1917 15.3133C10.9342 15.5742 10.72 15.7025 10.41 15.7833C10.0109 15.8799 9.59055 15.8311 9.22417 15.6458C9.0575 15.5617 8.56667 15.105 8.56667 15.0342C8.56667 15.0117 9.04833 15 10 15C10.9517 15 11.4333 15.0117 11.4333 15.0342Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function GearIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M7.25 2.14667C6.49167 2.33333 4.7725 3.36667 4.45583 3.825C4.24833 4.12583 4.2275 4.22167 4.21833 4.9125C4.21 5.58333 4.1875 5.72333 4.01917 6.14083C3.90229 6.42767 3.7346 6.69106 3.52417 6.91833C3.27167 7.19417 3.02583 7.37583 2.60667 7.59667C2.205 7.8075 1.97667 8.03 1.87083 8.31417C1.6275 8.96333 1.62833 11.0383 1.87167 11.6892C1.97 11.9525 2.21167 12.1975 2.54167 12.3675C3.42917 12.8258 3.88417 13.35 4.1375 14.2058C4.19917 14.4133 4.21083 14.5458 4.2175 15.0858C4.22583 15.7758 4.24667 15.8717 4.4575 16.1767C4.72167 16.5592 5.92583 17.3317 6.86667 17.7208C7.225 17.8692 7.27 17.88 7.55 17.8817C7.89917 17.8833 8.01417 17.845 8.39583 17.6008C8.97 17.2325 9.40333 17.0958 10 17.0958C10.5983 17.0958 11.0625 17.2442 11.6333 17.6167C11.9992 17.8558 12.0742 17.8808 12.4333 17.8808C12.7358 17.8808 12.7675 17.8733 13.1333 17.7217C13.8544 17.4207 14.533 17.0265 15.1517 16.5492C15.455 16.3125 15.5667 16.1808 15.6883 15.9142C15.7692 15.7392 15.7742 15.695 15.7817 15.09C15.7875 14.6075 15.8033 14.4008 15.8458 14.2517C16.0925 13.3892 16.545 12.85 17.3992 12.4008C17.795 12.1925 18.0242 11.9683 18.1292 11.6858C18.37 11.0425 18.37 8.9575 18.1292 8.31417C18.0233 8.02917 17.7908 7.8025 17.4008 7.6025C16.585 7.18333 16.1242 6.65083 15.8783 5.84333C15.7958 5.57417 15.7875 5.4975 15.7808 4.9125C15.7725 4.22167 15.7517 4.12667 15.5442 3.825C15.2908 3.45833 14.1042 2.6875 13.2283 2.32083C12.5167 2.0225 12.1783 2.0325 11.6667 2.36667C11.0775 2.75083 10.5983 2.90667 10 2.90667C9.40167 2.90667 8.9225 2.75083 8.33333 2.36667C7.95667 2.12 7.62833 2.05333 7.25 2.14667ZM7.85083 4.01667C8.21417 4.2175 8.59833 4.36667 9.03333 4.47667C9.2775 4.53833 9.41083 4.54833 10 4.54833C10.5892 4.54833 10.7225 4.53833 10.9667 4.47667C11.3792 4.37557 11.7768 4.22092 12.1492 4.01667C12.3317 3.91583 12.4958 3.83333 12.515 3.83333C12.5342 3.83417 12.715 3.91417 12.9167 4.01167C13.29 4.1925 13.6575 4.41333 13.9417 4.6275L14.1 4.74667V4.99167C14.1 6.64667 14.9183 8.0875 16.3283 8.91333C16.59 9.06667 16.5975 9.075 16.6233 9.2275C16.6383 9.31333 16.65 9.66083 16.65 10C16.65 10.3392 16.6383 10.6867 16.6233 10.7725C16.5975 10.925 16.59 10.9333 16.3283 11.0867C15.5596 11.5255 14.9417 12.1867 14.5558 12.9833C14.2808 13.5333 14.1442 14.0992 14.1117 14.8167C14.0892 15.315 14.1275 15.2517 13.65 15.5733C13.355 15.7717 12.5942 16.1658 12.5042 16.1667C12.4792 16.1667 12.3717 16.1133 12.2642 16.0483C10.9092 15.225 9.09083 15.225 7.73583 16.0483C7.62833 16.1133 7.52 16.1667 7.49333 16.1667C7.39583 16.1667 6.57167 15.7308 6.25 15.5092L5.91667 15.2792L5.89333 14.8375C5.8325 13.685 5.5 12.8283 4.7925 12C4.48833 11.6442 3.92667 11.2025 3.54083 11.0167C3.41083 10.9542 3.40167 10.9392 3.37667 10.7667C3.34167 10.5283 3.3425 9.42917 3.37667 9.2275C3.4025 9.075 3.41 9.06667 3.67167 8.91333C4.81667 8.2425 5.57083 7.1825 5.815 5.9C5.845 5.74417 5.8775 5.42167 5.88833 5.18333C5.91167 4.68167 5.86917 4.7475 6.38167 4.40917C6.68667 4.2075 7.4025 3.83417 7.485 3.83333C7.50417 3.83333 7.66833 3.91583 7.85083 4.01667ZM9.465 6.7175C8.95517 6.80283 8.47207 7.00519 8.05362 7.30869C7.63518 7.61219 7.29279 8.00855 7.05333 8.46667C6.87954 8.78657 6.76493 9.13521 6.715 9.49583C6.655 9.82927 6.655 10.1707 6.715 10.5042C6.9 11.7283 7.77 12.7583 8.9625 13.1642C9.20833 13.2475 9.73333 13.3333 10 13.3333C10.2667 13.3333 10.7917 13.2475 11.0375 13.1642C11.8575 12.885 12.5633 12.2825 12.9467 11.5333C13.1205 11.2134 13.2351 10.8648 13.285 10.5042C13.345 10.1707 13.345 9.82927 13.285 9.49583C13.2056 8.97967 13.0056 8.4895 12.7012 8.06512C12.3969 7.64074 11.9968 7.2941 11.5333 7.05333C11.2134 6.87954 10.8648 6.76493 10.5042 6.715C10.1601 6.65748 9.80879 6.65833 9.465 6.7175ZM10.41 8.38333C10.71 8.46083 10.9317 8.59167 11.17 8.83C11.4167 9.07583 11.5433 9.2975 11.6167 9.6075C11.7108 10.0029 11.6609 10.4189 11.4758 10.7808C11.365 11 10.9967 11.3667 10.775 11.4792C10.535 11.6016 10.2694 11.6654 10 11.6654C9.73059 11.6654 9.465 11.6016 9.225 11.4792C9.00083 11.3658 8.63417 10.9992 8.52083 10.775C8.39843 10.535 8.33462 10.2694 8.33462 10C8.33462 9.73059 8.39843 9.465 8.52083 9.225C8.635 9 9.00083 8.63417 9.22583 8.52083C9.59184 8.33629 10.0114 8.28757 10.41 8.38333Z"
        fillRule="evenodd"
        clipRule="evenodd"
        fill="currentColor"
      />
    </Icon>
  )
}

export function QuestionIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M10.9375 14.0625C10.9375 14.2479 10.8825 14.4292 10.7795 14.5833C10.6765 14.7375 10.5301 14.8577 10.3588 14.9286C10.1875 14.9996 9.99896 15.0182 9.8171 14.982C9.63525 14.9458 9.4682 14.8565 9.33709 14.7254C9.20598 14.5943 9.11669 14.4273 9.08051 14.2454C9.04434 14.0635 9.06291 13.875 9.13386 13.7037C9.20482 13.5324 9.32498 13.386 9.47915 13.283C9.63332 13.18 9.81458 13.125 10 13.125C10.2486 13.125 10.4871 13.2238 10.6629 13.3996C10.8387 13.5754 10.9375 13.8139 10.9375 14.0625ZM10 5.625C8.27656 5.625 6.875 6.88672 6.875 8.4375V8.75C6.875 8.91576 6.94085 9.07473 7.05806 9.19194C7.17527 9.30915 7.33424 9.375 7.5 9.375C7.66576 9.375 7.82473 9.30915 7.94194 9.19194C8.05915 9.07473 8.125 8.91576 8.125 8.75V8.4375C8.125 7.57812 8.96641 6.875 10 6.875C11.0336 6.875 11.875 7.57812 11.875 8.4375C11.875 9.29688 11.0336 10 10 10C9.83424 10 9.67527 10.0658 9.55806 10.1831C9.44085 10.3003 9.375 10.4592 9.375 10.625V11.25C9.375 11.4158 9.44085 11.5747 9.55806 11.6919C9.67527 11.8092 9.83424 11.875 10 11.875C10.1658 11.875 10.3247 11.8092 10.4419 11.6919C10.5592 11.5747 10.625 11.4158 10.625 11.25V11.1937C12.05 10.932 13.125 9.79531 13.125 8.4375C13.125 6.88672 11.7234 5.625 10 5.625ZM18.125 10C18.125 11.607 17.6485 13.1779 16.7557 14.514C15.8629 15.8502 14.594 16.8916 13.1093 17.5065C11.6247 18.1215 9.99099 18.2824 8.41489 17.9689C6.8388 17.6554 5.39106 16.8815 4.25476 15.7452C3.11846 14.6089 2.34462 13.1612 2.03112 11.5851C1.71761 10.009 1.87852 8.37535 2.49348 6.8907C3.10844 5.40605 4.14984 4.1371 5.48599 3.24431C6.82214 2.35152 8.39303 1.875 10 1.875C12.1542 1.87727 14.2195 2.73403 15.7427 4.25727C17.266 5.78051 18.1227 7.84581 18.125 10ZM16.875 10C16.875 8.64025 16.4718 7.31104 15.7164 6.18045C14.9609 5.04987 13.8872 4.16868 12.6309 3.64833C11.3747 3.12798 9.99237 2.99183 8.65875 3.2571C7.32513 3.52237 6.10013 4.17715 5.13864 5.13864C4.17715 6.10013 3.52237 7.32513 3.2571 8.65875C2.99183 9.99237 3.12798 11.3747 3.64833 12.6309C4.16868 13.8872 5.04987 14.9609 6.18045 15.7164C7.31104 16.4718 8.64025 16.875 10 16.875C11.8227 16.8729 13.5702 16.1479 14.8591 14.8591C16.1479 13.5702 16.8729 11.8227 16.875 10Z"
        fill="currentColor"
      />
    </Icon>
  )
}

export function UserIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M18.0406 16.5625C16.8508 14.5055 15.0172 13.0305 12.8773 12.3312C13.9358 11.7011 14.7582 10.741 15.2181 9.59828C15.6781 8.45556 15.7502 7.19344 15.4235 6.00575C15.0967 4.81806 14.3891 3.77046 13.4094 3.02385C12.4296 2.27723 11.2318 1.87287 10 1.87287C8.76818 1.87287 7.57041 2.27723 6.59064 3.02385C5.61088 3.77046 4.90328 4.81806 4.57652 6.00575C4.24975 7.19344 4.3219 8.45556 4.78186 9.59828C5.24183 10.741 6.06419 11.7011 7.12266 12.3312C4.98281 13.0297 3.14922 14.5047 1.95937 16.5625C1.91574 16.6336 1.8868 16.7128 1.87426 16.7953C1.86171 16.8778 1.86583 16.962 1.88635 17.0429C1.90687 17.1238 1.94339 17.1998 1.99374 17.2664C2.0441 17.3329 2.10728 17.3887 2.17955 17.4305C2.25182 17.4722 2.33172 17.499 2.41454 17.5094C2.49735 17.5198 2.5814 17.5135 2.66174 17.4908C2.74207 17.4682 2.81705 17.4297 2.88226 17.3776C2.94746 17.3255 3.00158 17.2608 3.04141 17.1875C4.51328 14.6438 7.11484 13.125 10 13.125C12.8852 13.125 15.4867 14.6438 16.9586 17.1875C16.9984 17.2608 17.0525 17.3255 17.1177 17.3776C17.183 17.4297 17.2579 17.4682 17.3383 17.4908C17.4186 17.5135 17.5026 17.5198 17.5855 17.5094C17.6683 17.499 17.7482 17.4722 17.8204 17.4305C17.8927 17.3887 17.9559 17.3329 18.0063 17.2664C18.0566 17.1998 18.0931 17.1238 18.1137 17.0429C18.1342 16.962 18.1383 16.8778 18.1257 16.7953C18.1132 16.7128 18.0843 16.6336 18.0406 16.5625ZM5.625 7.5C5.625 6.63471 5.88159 5.78885 6.36232 5.06938C6.84305 4.34992 7.52633 3.78916 8.32576 3.45803C9.12519 3.12689 10.0049 3.04025 10.8535 3.20906C11.7022 3.37787 12.4817 3.79455 13.0936 4.40641C13.7054 5.01826 14.1221 5.79781 14.2909 6.64648C14.4597 7.49515 14.3731 8.37481 14.042 9.17424C13.7108 9.97367 13.1501 10.6569 12.4306 11.1377C11.7112 11.6184 10.8653 11.875 10 11.875C8.84006 11.8738 7.72798 11.4124 6.90778 10.5922C6.08758 9.77202 5.62624 8.65994 5.625 7.5Z"
        fill="currentColor"
      />
    </Icon>
  )
}

export function ArrowRightIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 15.0005 12.5007"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        d="M14.8172 6.69254L9.19219 12.3175C9.07491 12.4348 8.91585 12.5007 8.75 12.5007C8.58415 12.5007 8.42509 12.4348 8.30781 12.3175C8.19054 12.2003 8.12465 12.0412 8.12465 11.8753C8.12465 11.7095 8.19054 11.5504 8.30781 11.4332L12.8664 6.87535H0.625C0.45924 6.87535 0.300269 6.8095 0.183058 6.69229C0.0658481 6.57508 0 6.41611 0 6.25035C0 6.08459 0.0658481 5.92562 0.183058 5.80841C0.300269 5.6912 0.45924 5.62535 0.625 5.62535H12.8664L8.30781 1.06753C8.19054 0.95026 8.12465 0.7912 8.12465 0.625347C8.12465 0.459495 8.19054 0.300435 8.30781 0.18316C8.42509 0.0658846 8.58415 0 8.75 0C8.91585 0 9.07491 0.0658846 9.19219 0.18316L14.8172 5.80816C14.8753 5.86621 14.9214 5.93514 14.9529 6.01101C14.9843 6.08688 15.0005 6.16821 15.0005 6.25035C15.0005 6.33248 14.9843 6.41381 14.9529 6.48969C14.9214 6.56556 14.8753 6.63449 14.8172 6.69254Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function SidebarCollapseIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 15 15.625"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.75', className)}
      {...props}
    >
      <path
        d="M13.5672 8.30781C13.6253 8.36588 13.6713 8.43482 13.7027 8.51069C13.7342 8.58656 13.7503 8.66788 13.7503 8.75C13.7503 8.83212 13.7342 8.91344 13.7027 8.98931C13.6713 9.06518 13.6253 9.13412 13.5672 9.19219C13.5091 9.25026 13.4402 9.29632 13.3643 9.32775C13.2884 9.35917 13.2071 9.37535 13.125 9.37535C13.0429 9.37535 12.9616 9.35917 12.8857 9.32775C12.8098 9.29632 12.7409 9.25026 12.6828 9.19219L8.125 4.63359V15C8.125 15.1658 8.05915 15.3247 7.94194 15.4419C7.82473 15.5592 7.66576 15.625 7.5 15.625C7.33424 15.625 7.17527 15.5592 7.05806 15.4419C6.94085 15.3247 6.875 15.1658 6.875 15V4.63359L2.31719 9.19219C2.25912 9.25026 2.19018 9.29632 2.11431 9.32775C2.03844 9.35917 1.95712 9.37535 1.875 9.37535C1.79288 9.37535 1.71156 9.35917 1.63569 9.32775C1.55982 9.29632 1.49088 9.25026 1.43281 9.19219C1.37474 9.13412 1.32868 9.06518 1.29725 8.98931C1.26583 8.91344 1.24965 8.83212 1.24965 8.75C1.24965 8.66788 1.26583 8.58656 1.29725 8.51069C1.32868 8.43482 1.37474 8.36588 1.43281 8.30781L7.05781 2.68281C7.11586 2.6247 7.18479 2.5786 7.26066 2.54715C7.33654 2.5157 7.41787 2.49951 7.5 2.49951C7.58213 2.49951 7.66346 2.5157 7.73934 2.54715C7.81521 2.5786 7.88414 2.6247 7.94219 2.68281L13.5672 8.30781ZM14.375 0H0.625C0.45924 0 0.300269 0.0658481 0.183058 0.183058C0.0658481 0.300269 0 0.45924 0 0.625C0 0.79076 0.0658481 0.949731 0.183058 1.06694C0.300269 1.18415 0.45924 1.25 0.625 1.25H14.375C14.5408 1.25 14.6997 1.18415 14.8169 1.06694C14.9342 0.949731 15 0.79076 15 0.625C15 0.45924 14.9342 0.300269 14.8169 0.183058C14.6997 0.0658481 14.5408 0 14.375 0Z"
        fill="currentColor"
      />
    </svg>
  )
}

type ToggleIconProps = IconProps & {
  pressed?: boolean
}

export function ToggleIcon({
  className,
  pressed = false,
  ...props
}: ToggleIconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M13.75 4.375H6.25C4.75816 4.375 3.32742 4.96763 2.27252 6.02252C1.21763 7.07742 0.625 8.50816 0.625 10C0.625 11.4918 1.21763 12.9226 2.27252 13.9775C3.32742 15.0324 4.75816 15.625 6.25 15.625H13.75C15.2418 15.625 16.6726 15.0324 17.7275 13.9775C18.7824 12.9226 19.375 11.4918 19.375 10C19.375 8.50816 18.7824 7.07742 17.7275 6.02252C16.6726 4.96763 15.2418 4.375 13.75 4.375ZM13.75 14.375H6.25C5.08968 14.375 3.97688 13.9141 3.15641 13.0936C2.33594 12.2731 1.875 11.1603 1.875 10C1.875 8.83968 2.33594 7.72688 3.15641 6.90641C3.97688 6.08594 5.08968 5.625 6.25 5.625H13.75C14.9103 5.625 16.0231 6.08594 16.8436 6.90641C17.6641 7.72688 18.125 8.83968 18.125 10C18.125 11.1603 17.6641 12.2731 16.8436 13.0936C16.0231 13.9141 14.9103 14.375 13.75 14.375Z"
        fill="currentColor"
      />
      <g
        className={cn(
          'origin-center transition-transform duration-200 ease-linear',
          pressed ? 'translate-x-0' : '-translate-x-2',
        )}
      >
        <path
          d="M13.75 6.875C13.1319 6.875 12.5277 7.05828 12.0138 7.40166C11.4999 7.74504 11.0994 8.2331 10.8629 8.80411C10.6264 9.37513 10.5645 10.0035 10.685 10.6097C10.8056 11.2158 11.1033 11.7727 11.5403 12.2097C11.9773 12.6467 12.5342 12.9444 13.1403 13.065C13.7465 13.1855 14.3749 13.1236 14.9459 12.8871C15.5169 12.6506 16.005 12.2501 16.3483 11.7362C16.6917 11.2223 16.875 10.6181 16.875 10C16.875 9.1712 16.5458 8.37634 15.9597 7.79029C15.3737 7.20424 14.5788 6.875 13.75 6.875ZM13.75 11.875C13.3792 11.875 13.0166 11.765 12.7083 11.559C12.4 11.353 12.1596 11.0601 12.0177 10.7175C11.8758 10.3749 11.8387 9.99792 11.911 9.63421C11.9834 9.27049 12.162 8.9364 12.4242 8.67417C12.6864 8.41195 13.0205 8.23337 13.3842 8.16103C13.7479 8.08868 14.1249 8.12581 14.4675 8.26773C14.8101 8.40964 15.103 8.64996 15.309 8.95831C15.515 9.26665 15.625 9.62916 15.625 10C15.625 10.4973 15.4275 10.9742 15.0758 11.3258C14.7242 11.6775 14.2473 11.875 13.75 11.875Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  )
}

export function SearchIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 15 15"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.5', className)}
      {...props}
    >
      <path
        d="M10.5376 10.5376C11.0716 10.0036 11.4953 9.36959 11.7843 8.67184C12.0733 7.9741 12.222 7.22626 12.222 6.47102C12.222 5.71579 12.0733 4.96795 11.7843 4.2702C11.4953 3.57245 11.0716 2.93847 10.5376 2.40444C10.0036 1.8704 9.36959 1.44679 8.67184 1.15777C7.9741 0.868754 7.22626 0.72 6.47102 0.72C5.71579 0.72 4.96795 0.868754 4.2702 1.15777C3.57245 1.44679 2.93847 1.8704 2.40443 2.40444C1.32591 3.48296 0.72 4.94576 0.72 6.47102C0.72 7.99629 1.32591 9.45908 2.40443 10.5376C3.48296 11.6161 4.94576 12.222 6.47102 12.222C7.99629 12.222 9.45908 11.6161 10.5376 10.5376ZM10.5376 10.5376L14.1599 14.1599"
        stroke="currentColor"
        strokeWidth="1.44"
        strokeLinecap="round"
        strokeLinejoin="round"
      />
    </svg>
  )
}



export function CalendarIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 16 16"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-4', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M5.09533 2.046C5.0103 2.08227 4.93276 2.13404 4.86667 2.19867C4.70133 2.364 4.66667 2.49333 4.66667 2.95133V3.33333H3.95133C3.55333 3.33333 3.16667 3.346 3.078 3.362C2.566 3.456 2.12267 3.89933 2.02867 4.41133C1.98867 4.63333 1.98867 12.7 2.02867 12.922C2.12267 13.434 2.566 13.8773 3.078 13.9713C3.30067 14.012 12.6993 14.012 12.922 13.9713C13.434 13.8773 13.8773 13.434 13.9713 12.922C14.0113 12.7 14.0113 4.63333 13.9713 4.41133C13.8773 3.89933 13.434 3.456 12.922 3.362C12.8333 3.346 12.4467 3.33333 12.0487 3.33333H11.3333V2.95133C11.3333 2.494 11.2987 2.364 11.134 2.19933C11.073 2.13737 11.0002 2.08817 10.92 2.05458C10.8398 2.02099 10.7536 2.0037 10.6667 2.0037C10.5797 2.0037 10.4936 2.02099 10.4134 2.05458C10.3331 2.08817 10.2604 2.13737 10.1993 2.19933C10.0347 2.364 10 2.494 10 2.95133V3.33333H6V2.95133C6 2.494 5.96533 2.364 5.80067 2.19933C5.71032 2.10862 5.59571 2.0459 5.4706 2.0187C5.34549 1.99151 5.21519 2.00098 5.09533 2.046ZM12.6667 5.33333V6H3.33333V4.66667H12.6667V5.33333ZM12.6667 10V12.6667H3.33333V7.33333H12.6667V10ZM5.09533 8.044C4.85867 8.13133 4.66667 8.41 4.66667 8.66667C4.66667 8.938 4.86133 9.20733 5.11933 9.29333C5.27412 9.34764 5.44359 9.34235 5.59469 9.27851C5.74579 9.21466 5.86771 9.09684 5.93667 8.948C6.09133 8.61533 5.95533 8.23667 5.618 8.062C5.49933 8.00067 5.238 7.992 5.09533 8.044ZM7.762 8.044C7.52533 8.13133 7.33333 8.41 7.33333 8.66667C7.33333 8.938 7.528 9.20733 7.786 9.29333C7.94079 9.34764 8.11025 9.34235 8.26136 9.27851C8.41246 9.21466 8.53437 9.09684 8.60333 8.948C8.758 8.61533 8.622 8.23667 8.28467 8.062C8.166 8.00067 7.90467 7.992 7.762 8.044ZM10.4287 8.044C10.192 8.13133 10 8.41 10 8.66667C10 8.938 10.1947 9.20733 10.4527 9.29333C10.6075 9.34764 10.7769 9.34235 10.928 9.27851C11.0791 9.21466 11.201 9.09684 11.27 8.948C11.4247 8.61533 11.2887 8.23667 10.9513 8.062C10.8327 8.00067 10.5713 7.992 10.4287 8.044ZM5.09533 10.044C4.85867 10.1313 4.66667 10.41 4.66667 10.6667C4.66667 10.938 4.86133 11.2073 5.11933 11.2933C5.27412 11.3476 5.44359 11.3423 5.59469 11.2785C5.74579 11.2147 5.86771 11.0968 5.93667 10.948C6.09133 10.6153 5.95533 10.2367 5.618 10.062C5.49933 10.0007 5.238 9.992 5.09533 10.044ZM7.762 10.044C7.52533 10.1313 7.33333 10.41 7.33333 10.6667C7.33333 10.938 7.528 11.2073 7.786 11.2933C7.94079 11.3476 8.11025 11.3423 8.26136 11.2785C8.41246 11.2147 8.53437 11.0968 8.60333 10.948C8.758 10.6153 8.622 10.2367 8.28467 10.062C8.166 10.0007 7.90467 9.992 7.762 10.044ZM10.4287 10.044C10.192 10.1313 10 10.41 10 10.6667C10 10.938 10.1947 11.2073 10.4527 11.2933C10.6075 11.3476 10.7769 11.3423 10.928 11.2785C11.0791 11.2147 11.201 11.0968 11.27 10.948C11.4247 10.6153 11.2887 10.2367 10.9513 10.062C10.8327 10.0007 10.5713 9.992 10.4287 10.044Z"
        fill="currentColor"
      />
    </svg>
  )
}



export function CloseIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M5 5L15 15M15 5L5 15"
        stroke="currentColor"
        strokeWidth="1.5"
        strokeLinecap="round"
      />
    </Icon>
  )
}

function SmallIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 16 16"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-4', className)}
      {...props}
    />
  )
}

export function SpinnerGapIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M8.5 2V4C8.5 4.13261 8.44732 4.25979 8.35355 4.35355C8.25979 4.44732 8.13261 4.5 8 4.5C7.86739 4.5 7.74021 4.44732 7.64645 4.35355C7.55268 4.25979 7.5 4.13261 7.5 4V2C7.5 1.86739 7.55268 1.74021 7.64645 1.64645C7.74021 1.55268 7.86739 1.5 8 1.5C8.13261 1.5 8.25979 1.55268 8.35355 1.64645C8.44732 1.74021 8.5 1.86739 8.5 2ZM14 7.5H12C11.8674 7.5 11.7402 7.55268 11.6464 7.64645C11.5527 7.74021 11.5 7.86739 11.5 8C11.5 8.13261 11.5527 8.25979 11.6464 8.35355C11.7402 8.44732 11.8674 8.5 12 8.5H14C14.1326 8.5 14.2598 8.44732 14.3536 8.35355C14.4473 8.25979 14.5 8.13261 14.5 8C14.5 7.86739 14.4473 7.74021 14.3536 7.64645C14.2598 7.55268 14.1326 7.5 14 7.5ZM11.1819 10.475C11.0873 10.3852 10.9615 10.3359 10.8311 10.3375C10.7007 10.3392 10.5761 10.3917 10.4839 10.4839C10.3917 10.5761 10.3392 10.7007 10.3375 10.8311C10.3359 10.9615 10.3852 11.0873 10.475 11.1819L11.8888 12.5962C11.9826 12.6901 12.1098 12.7428 12.2425 12.7428C12.3752 12.7428 12.5024 12.6901 12.5962 12.5962C12.6901 12.5024 12.7428 12.3752 12.7428 12.2425C12.7428 12.1098 12.6901 11.9826 12.5962 11.8888L11.1819 10.475ZM8 11.5C7.86739 11.5 7.74021 11.5527 7.64645 11.6464C7.55268 11.7402 7.5 11.8674 7.5 12V14C7.5 14.1326 7.55268 14.2598 7.64645 14.3536C7.74021 14.4473 7.86739 14.5 8 14.5C8.13261 14.5 8.25979 14.4473 8.35355 14.3536C8.44732 14.2598 8.5 14.1326 8.5 14V12C8.5 11.8674 8.44732 11.7402 8.35355 11.6464C8.25979 11.5527 8.13261 11.5 8 11.5ZM4.81812 10.475L3.40375 11.8888C3.30993 11.9826 3.25722 12.1098 3.25722 12.2425C3.25722 12.3752 3.30993 12.5024 3.40375 12.5962C3.49757 12.6901 3.62482 12.7428 3.7575 12.7428C3.89018 12.7428 4.01743 12.6901 4.11125 12.5962L5.525 11.1819C5.61481 11.0873 5.66414 10.9615 5.66247 10.8311C5.6608 10.7007 5.60826 10.5761 5.51606 10.4839C5.42386 10.3917 5.29929 10.3392 5.16891 10.3375C5.03853 10.3359 4.91266 10.3852 4.81812 10.475ZM4.5 8C4.5 7.86739 4.44732 7.74021 4.35355 7.64645C4.25979 7.55268 4.13261 7.5 4 7.5H2C1.86739 7.5 1.74021 7.55268 1.64645 7.64645C1.55268 7.74021 1.5 7.86739 1.5 8C1.5 8.13261 1.55268 8.25979 1.64645 8.35355C1.74021 8.44732 1.86739 8.5 2 8.5H4C4.13261 8.5 4.25979 8.44732 4.35355 8.35355C4.44732 8.25979 4.5 8.13261 4.5 8ZM4.11125 3.40375C4.01743 3.30993 3.89018 3.25722 3.7575 3.25722C3.62482 3.25722 3.49757 3.30993 3.40375 3.40375C3.30993 3.49757 3.25722 3.62482 3.25722 3.7575C3.25722 3.89018 3.30993 4.01743 3.40375 4.11125L4.81812 5.525C4.91266 5.61481 5.03853 5.66414 5.16891 5.66247C5.29929 5.6608 5.42386 5.60826 5.51606 5.51606C5.60826 5.42386 5.6608 5.29929 5.66247 5.16891C5.66414 5.03853 5.61481 4.91266 5.525 4.81812L4.11125 3.40375Z"
        fill="currentColor"
      />
    </SmallIcon>
  )
}

export function FadersHorizontalIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M11 5C11 4.86739 11.0527 4.74021 11.1464 4.64645C11.2402 4.55268 11.3674 4.5 11.5 4.5H13.5C13.6326 4.5 13.7598 4.55268 13.8536 4.64645C13.9473 4.74021 14 4.86739 14 5C14 5.13261 13.9473 5.25979 13.8536 5.35355C13.7598 5.44732 13.6326 5.5 13.5 5.5H11.5C11.3674 5.5 11.2402 5.44732 11.1464 5.35355C11.0527 5.25979 11 5.13261 11 5ZM2.5 5.5H9V6.5C9 6.63261 9.05268 6.75979 9.14645 6.85355C9.24021 6.94732 9.36739 7 9.5 7C9.63261 7 9.75979 6.94732 9.85355 6.85355C9.94732 6.75979 10 6.63261 10 6.5V3.5C10 3.36739 9.94732 3.24021 9.85355 3.14645C9.75979 3.05268 9.63261 3 9.5 3C9.36739 3 9.24021 3.05268 9.14645 3.14645C9.05268 3.24021 9 3.36739 9 3.5V4.5H2.5C2.36739 4.5 2.24021 4.55268 2.14645 4.64645C2.05268 4.74021 2 4.86739 2 5C2 5.13261 2.05268 5.25979 2.14645 5.35355C2.24021 5.44732 2.36739 5.5 2.5 5.5ZM13.5 10.5H7.5C7.36739 10.5 7.24021 10.5527 7.14645 10.6464C7.05268 10.7402 7 10.8674 7 11C7 11.1326 7.05268 11.2598 7.14645 11.3536C7.24021 11.4473 7.36739 11.5 7.5 11.5H13.5C13.6326 11.5 13.7598 11.4473 13.8536 11.3536C13.9473 11.2598 14 11.1326 14 11C14 10.8674 13.9473 10.7402 13.8536 10.6464C13.7598 10.5527 13.6326 10.5 13.5 10.5ZM5.5 9C5.36739 9 5.24021 9.05268 5.14645 9.14645C5.05268 9.24021 5 9.36739 5 9.5V10.5H2.5C2.36739 10.5 2.24021 10.5527 2.14645 10.6464C2.05268 10.7402 2 10.8674 2 11C2 11.1326 2.05268 11.2598 2.14645 11.3536C2.24021 11.4473 2.36739 11.5 2.5 11.5H5V12.5C5 12.6326 5.05268 12.7598 5.14645 12.8536C5.24021 12.9473 5.36739 13 5.5 13C5.63261 13 5.75979 12.9473 5.85355 12.8536C5.94732 12.7598 6 12.6326 6 12.5V9.5C6 9.36739 5.94732 9.24021 5.85355 9.14645C5.75979 9.05268 5.63261 9 5.5 9Z"
        fill="currentColor"
      />
    </SmallIcon>
  )
}

export function CheckCircleIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M10.8538 6.14625C10.9002 6.19269 10.9371 6.24783 10.9623 6.30853C10.9874 6.36923 11.0004 6.43429 11.0004 6.5C11.0004 6.56571 10.9874 6.63077 10.9623 6.69147C10.9371 6.75217 10.9002 6.80731 10.8538 6.85375L7.35375 10.3538C7.30731 10.4002 7.25217 10.4371 7.19147 10.4623C7.13077 10.4874 7.06571 10.5004 7 10.5004C6.93429 10.5004 6.86923 10.4874 6.80853 10.4623C6.74783 10.4371 6.69269 10.4002 6.64625 10.3538L5.14625 8.85375C5.05243 8.75993 4.99972 8.63268 4.99972 8.5C4.99972 8.36732 5.05243 8.24007 5.14625 8.14625C5.24007 8.05243 5.36732 7.99972 5.5 7.99972C5.63268 7.99972 5.75993 8.05243 5.85375 8.14625L7 9.29313L10.1462 6.14625C10.1927 6.09976 10.2478 6.06288 10.3085 6.03772C10.3692 6.01256 10.4343 5.99961 10.5 5.99961C10.5657 5.99961 10.6308 6.01256 10.6915 6.03772C10.7522 6.06288 10.8073 6.09976 10.8538 6.14625ZM14.5 8C14.5 9.28558 14.1188 10.5423 13.4046 11.6112C12.6903 12.6801 11.6752 13.5132 10.4874 14.0052C9.29972 14.4972 7.99279 14.6259 6.73191 14.3751C5.47104 14.1243 4.31285 13.5052 3.40381 12.5962C2.49476 11.6872 1.8757 10.529 1.6249 9.26809C1.37409 8.00721 1.50281 6.70028 1.99478 5.51256C2.48675 4.32484 3.31987 3.30968 4.38879 2.59545C5.45771 1.88122 6.71442 1.5 8 1.5C9.72335 1.50182 11.3756 2.18722 12.5942 3.40582C13.8128 4.62441 14.4982 6.27665 14.5 8ZM13.5 8C13.5 6.9122 13.1774 5.84883 12.5731 4.94436C11.9687 4.03989 11.1098 3.33494 10.1048 2.91866C9.09977 2.50238 7.9939 2.39346 6.927 2.60568C5.86011 2.8179 4.8801 3.34172 4.11091 4.11091C3.34172 4.8801 2.8179 5.86011 2.60568 6.927C2.39346 7.9939 2.50238 9.09977 2.91866 10.1048C3.33494 11.1098 4.03989 11.9687 4.94436 12.5731C5.84883 13.1774 6.9122 13.5 8 13.5C9.45818 13.4983 10.8562 12.9184 11.8873 11.8873C12.9184 10.8562 13.4983 9.45818 13.5 8Z"
        fill="currentColor"
      />
    </SmallIcon>
  )
}

export function StatusWarningIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M14.8 11.7556L9.33438 2.26375C9.1978 2.0312 9.00281 1.83839 8.76875 1.70441C8.5347 1.57044 8.26969 1.49996 8 1.49996C7.73031 1.49996 7.4653 1.57044 7.23125 1.70441C6.99719 1.83839 6.80221 2.0312 6.66563 2.26375L1.2 11.7556C1.06859 11.9806 0.99933 12.2364 0.99933 12.4969C0.99933 12.7574 1.06859 13.0132 1.2 13.2381C1.33483 13.4721 1.52948 13.6659 1.76398 13.7998C1.99847 13.9337 2.26436 14.0028 2.53437 14H13.4656C13.7354 14.0026 14.0011 13.9334 14.2353 13.7995C14.4696 13.6656 14.664 13.4719 14.7987 13.2381C14.9304 13.0133 14.9998 12.7575 15 12.497C15.0003 12.2365 14.9312 11.9807 14.8 11.7556ZM13.9331 12.7375C13.8855 12.8188 13.8171 12.8859 13.7349 12.9321C13.6528 12.9782 13.5598 13.0016 13.4656 13H2.53437C2.44017 13.0016 2.34723 12.9782 2.26508 12.9321C2.18293 12.8859 2.11452 12.8188 2.06687 12.7375C2.02372 12.6644 2.00095 12.5811 2.00095 12.4963C2.00095 12.4114 2.02372 12.3281 2.06687 12.255L7.5325 2.76312C7.58111 2.68223 7.64983 2.6153 7.73197 2.56883C7.81411 2.52236 7.90688 2.49793 8.00125 2.49793C8.09562 2.49793 8.18839 2.52236 8.27053 2.56883C8.35267 2.6153 8.42139 2.68223 8.47 2.76312L13.9356 12.255C13.9784 12.3283 14.0007 12.4117 14.0003 12.4966C13.9999 12.5815 13.9767 12.6647 13.9331 12.7375ZM7.5 9V6.5C7.5 6.36739 7.55268 6.24021 7.64645 6.14645C7.74021 6.05268 7.86739 6 8 6C8.13261 6 8.25979 6.05268 8.35355 6.14645C8.44732 6.24021 8.5 6.36739 8.5 6.5V9C8.5 9.13261 8.44732 9.25979 8.35355 9.35355C8.25979 9.44732 8.13261 9.5 8 9.5C7.86739 9.5 7.74021 9.44732 7.64645 9.35355C7.55268 9.25979 7.5 9.13261 7.5 9ZM8.75 11.25C8.75 11.3983 8.70601 11.5433 8.6236 11.6667C8.54119 11.79 8.42406 11.8861 8.28701 11.9429C8.14997 11.9997 7.99917 12.0145 7.85368 11.9856C7.7082 11.9566 7.57456 11.8852 7.46967 11.7803C7.36478 11.6754 7.29335 11.5418 7.26441 11.3963C7.23547 11.2508 7.25032 11.1 7.30709 10.963C7.36386 10.8259 7.45999 10.7088 7.58332 10.6264C7.70666 10.544 7.85166 10.5 8 10.5C8.19891 10.5 8.38968 10.579 8.53033 10.7197C8.67098 10.8603 8.75 11.0511 8.75 11.25Z"
        fill="currentColor"
      />
    </SmallIcon>
  )
}

export function HeartbeatIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 14 14"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M4.50742 1.7745C3.72867 1.87192 2.97792 2.2645 2.38 2.88575C1.76342 3.52567 1.37142 4.32133 1.22617 5.2255C1.1795 5.51425 1.15558 6.00892 1.17717 6.23583L1.19408 6.41667H4.30558L4.81833 5.38533C5.21558 4.58675 5.35325 4.33183 5.42675 4.25717C5.47984 4.2033 5.54309 4.1605 5.61284 4.13125C5.68259 4.102 5.75746 4.08689 5.83309 4.08678C5.90872 4.08667 5.98363 4.10157 6.05346 4.13062C6.1233 4.15967 6.18667 4.20228 6.23992 4.256C6.3245 4.34117 6.41083 4.52958 7.01167 5.9325C7.38325 6.80167 7.693 7.51275 7.7 7.51275C7.70642 7.51217 7.85342 7.29983 8.02667 7.04025C8.29792 6.63367 8.35742 6.559 8.45658 6.49833L8.5715 6.42833L10.6872 6.42192L12.8036 6.4155L12.8182 6.27258C12.8695 5.78317 12.7872 5.10183 12.6087 4.5395C12.5037 4.20758 12.2232 3.64292 12.0231 3.36C11.7927 3.03508 11.3167 2.56725 11.0052 2.36017C10.6223 2.09689 10.1911 1.91192 9.73642 1.81592C9.40508 1.74417 8.81067 1.74417 8.47583 1.81592C7.96542 1.92558 7.54717 2.12392 7.04375 2.49375C7.00642 2.52058 6.99358 2.52058 6.95625 2.49375C6.44933 2.121 6.02467 1.92092 5.52417 1.81825C5.25058 1.76225 4.76875 1.74125 4.50742 1.7745ZM5.47575 6.68792C5.3025 7.03442 5.13333 7.35117 5.10008 7.39083C5.05045 7.44238 4.99247 7.48517 4.92858 7.51742L4.81833 7.57167L3.15467 7.58333L1.49158 7.595L1.66717 7.94908C2.24467 9.11633 3.30983 10.2416 4.73667 11.1924C5.6 11.7676 6.63133 12.2494 7 12.2494C7.36867 12.2494 8.4 11.7676 9.26333 11.1924C10.1879 10.5758 10.9772 9.87117 11.5827 9.121C11.9029 8.72433 12.3037 8.0675 12.4682 7.67083L12.5043 7.58333H9.06092L8.53767 8.3685C8.25008 8.80017 7.98292 9.17758 7.94325 9.20792C7.83151 9.2944 7.69213 9.33729 7.5511 9.3286C7.41007 9.31991 7.27702 9.26022 7.17675 9.16067C7.09275 9.07608 7.00992 8.897 6.454 7.595C6.24037 7.09311 6.02531 6.59183 5.80883 6.09117C5.79717 6.069 5.68517 6.27025 5.47575 6.68792Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function WalkIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 14 14"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M6.70775 1.19C6.3867 1.24714 6.08761 1.39165 5.84331 1.60765C5.59901 1.82365 5.41896 2.10279 5.32292 2.41442C5.2745 2.57367 5.26575 2.6495 5.26575 2.91667C5.26575 3.18383 5.2745 3.25967 5.32292 3.41892C5.39058 3.64117 5.5125 3.8675 5.64783 4.02092C5.70208 4.08275 5.73708 4.14108 5.726 4.15158C5.71433 4.1615 5.3375 4.431 4.88833 4.75067C4.43917 5.07033 4.02675 5.37775 3.97192 5.43375C3.85058 5.55742 2.97558 7.00875 2.93767 7.14817C2.8665 7.413 3.02225 7.72275 3.28183 7.83125C3.38042 7.87267 3.61958 7.87267 3.71817 7.83125C3.87858 7.76417 3.96083 7.65508 4.38492 6.94517C4.74717 6.3385 4.82183 6.22825 4.91167 6.16467C4.94405 6.13894 4.97928 6.11702 5.01667 6.09933C5.01667 6.104 4.94608 6.38983 4.85975 6.73458C4.71275 7.322 4.70283 7.378 4.70342 7.61833C4.704 7.84467 4.71158 7.89308 4.76817 8.02958C4.84983 8.22617 5.01433 8.42975 5.18642 8.54642C5.25992 8.59658 5.71142 8.99558 6.18975 9.43192L7.05833 10.2264L7.34125 11.3534C7.52208 12.0721 7.64342 12.5107 7.67608 12.5638C7.74083 12.6688 7.84875 12.7522 7.97883 12.7977C8.11942 12.8473 8.76342 12.8473 8.93083 12.7977C9.09358 12.7493 9.24933 12.5936 9.29775 12.4308C9.34208 12.2809 9.34208 12.2191 9.29775 12.0692C9.22833 11.8353 8.9845 11.6667 8.71617 11.6667H8.62108L8.40292 10.7858C8.18008 9.88283 8.10483 9.66233 7.966 9.49783C7.7616 9.29542 7.55232 9.098 7.33833 8.90575C7.14017 8.72498 6.94242 8.54376 6.74508 8.36208C6.71592 8.33583 6.7165 8.32592 6.74742 8.28975C6.86408 8.155 6.91425 8.00625 7.11783 7.18492C7.23392 6.71825 7.33192 6.33325 7.33658 6.32917C7.34067 6.3245 7.48067 6.47675 7.6475 6.66633C7.81375 6.8565 7.99867 7.05658 8.05817 7.11083C8.13517 7.182 8.3545 7.30392 8.82525 7.539L9.485 7.868L9.65067 7.85925C9.96858 7.8435 10.1751 7.63933 10.1932 7.32317C10.2008 7.18667 10.1932 7.14467 10.1413 7.0385C10.1124 6.97734 10.0753 6.92043 10.031 6.86933C10.0042 6.84483 9.72125 6.69375 9.40275 6.53333L8.8235 6.24167L8.12175 5.439C7.73558 4.99742 7.42525 4.6305 7.43225 4.6235C7.43925 4.6165 7.50167 4.59317 7.5705 4.57158C7.93625 4.45842 8.32592 4.12942 8.53533 3.75725C8.68408 3.49183 8.73425 3.28008 8.73425 2.91667C8.73425 2.6495 8.7255 2.57367 8.67708 2.41442C8.50733 1.85675 8.05233 1.40292 7.50225 1.24192C7.29167 1.18008 6.902 1.155 6.70775 1.19ZM7.29867 2.41908C7.66617 2.64483 7.67317 3.17683 7.31208 3.40608C7.24618 3.44786 7.17255 3.47596 7.09557 3.48872C7.01859 3.50147 6.93984 3.49863 6.86398 3.48034C6.78812 3.46206 6.71672 3.42871 6.654 3.38228C6.59129 3.33586 6.53855 3.2773 6.49892 3.21008C6.4365 3.10858 6.42833 3.07475 6.42833 2.91842C6.42833 2.76733 6.43767 2.72592 6.49308 2.63142C6.54557 2.53419 6.62579 2.45477 6.72353 2.40325C6.82127 2.35173 6.93213 2.33044 7.042 2.34208C7.13307 2.34328 7.22198 2.36995 7.29867 2.41908ZM5.00558 9.10117C4.89186 9.1563 4.79823 9.24564 4.73783 9.35667C4.71508 9.40158 4.64158 9.60633 4.57392 9.81167L4.45142 10.185L3.73333 10.9083C3.33783 11.3062 2.99542 11.6684 2.97208 11.7133C2.90967 11.8329 2.91375 12.0919 2.97967 12.215C3.04092 12.3288 3.43408 12.719 3.54667 12.7779C3.66625 12.8403 3.92467 12.8363 4.05067 12.7698C4.1615 12.7114 4.28517 12.5784 4.33125 12.4682C4.37033 12.3754 4.37325 12.145 4.33708 12.0412L4.31083 11.9659L4.85975 11.4135C5.49383 10.7759 5.47342 10.8074 5.69275 10.1383C5.81817 9.75683 5.83683 9.67867 5.82633 9.57542C5.81542 9.46969 5.77647 9.36879 5.7135 9.28316C5.65053 9.19753 5.56584 9.13027 5.46817 9.08833C5.34858 9.03817 5.11933 9.04458 5.00558 9.10117Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function MoonStarsIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 14 14"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M4.90642 1.66133C4.87795 1.70793 4.85318 1.75669 4.83233 1.80717C4.66258 2.19683 4.1895 2.7335 3.78408 2.99833C3.66625 3.07475 3.57 3.1535 3.57058 3.17333C3.57117 3.19258 3.668 3.27133 3.78642 3.34833C4.03142 3.507 4.41292 3.87333 4.578 4.10783C4.63692 4.19183 4.74017 4.36217 4.80667 4.487C4.87317 4.61125 4.94142 4.71333 4.95833 4.71333C4.97525 4.71333 5.0435 4.61125 5.11 4.487C5.1765 4.36217 5.27975 4.19183 5.33867 4.10783C5.50142 3.87625 5.90975 3.48483 6.14367 3.33667C6.25508 3.26608 6.34608 3.19258 6.34608 3.17333C6.34667 3.1535 6.25042 3.07475 6.13258 2.99833C5.72775 2.73408 5.33575 2.2925 5.09775 1.834C5.00033 1.64617 4.95308 1.60358 4.90642 1.66133ZM7.63 1.85558C7.55686 1.8795 7.48935 1.91805 7.43158 1.9689C7.37381 2.01974 7.327 2.08182 7.294 2.15133C7.20475 2.32925 7.21175 2.46342 7.32608 2.76267C7.50108 3.22292 7.58275 3.64292 7.58275 4.08333C7.58264 4.98292 7.23581 5.84785 6.61438 6.49829C5.99295 7.14873 5.14473 7.53463 4.24608 7.57575C3.74238 7.6003 3.23938 7.51491 2.772 7.3255C2.55908 7.24033 2.51417 7.23042 2.37708 7.238C2.25111 7.24291 2.13024 7.28907 2.03307 7.36938C1.93589 7.44969 1.86779 7.55971 1.83925 7.6825C1.81417 7.77933 1.81708 7.82833 1.86375 8.0675C2.15425 9.56317 3.18325 10.9241 4.57333 11.6509C5.33342 12.0482 6.11333 12.236 7 12.2354C7.52092 12.2354 7.84117 12.1963 8.32125 12.0738C9.37883 11.8049 10.3839 11.1586 11.0758 10.3017C11.668 9.56394 12.0539 8.68227 12.194 7.74667C12.2506 7.378 12.2512 6.64767 12.1946 6.26617C11.8743 4.09092 10.2789 2.36017 8.148 1.87717C7.86567 1.813 7.77933 1.8095 7.63 1.85558ZM3.129 4.59083C3.00242 4.85158 2.68625 5.20508 2.44417 5.35617C2.34442 5.41858 2.29892 5.48333 2.3555 5.48333C2.36717 5.48333 2.46283 5.54808 2.56783 5.62742C2.7825 5.78842 2.98258 6.02525 3.10392 6.26033C3.14883 6.34608 3.19608 6.41667 3.21008 6.41667C3.22408 6.41667 3.26083 6.36183 3.29175 6.29475C3.41483 6.02817 3.67967 5.73242 3.9725 5.53292C4.03375 5.4915 4.08333 5.45067 4.08333 5.44133C4.08275 5.43258 4.0215 5.38533 3.94683 5.3375C3.69775 5.17708 3.39325 4.82825 3.27717 4.571C3.25442 4.52083 3.22408 4.48 3.2095 4.48C3.19492 4.48 3.15875 4.52958 3.129 4.59083Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function BatteryChargingIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 14 14"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M2.08833 3.52742C1.66075 3.60908 1.27167 4.00633 1.19175 4.44325C1.15675 4.63633 1.15675 9.36367 1.19175 9.55675C1.274 10.0048 1.66192 10.3927 2.10992 10.4749C2.19275 10.4895 2.58067 10.5 3.07008 10.5H3.892L3.85875 10.3898C3.80226 10.1737 3.78449 9.94934 3.80625 9.72708C3.83658 9.45583 3.92292 9.22192 4.10842 8.90867C4.19708 8.75875 4.27 8.63042 4.27 8.624C4.27 8.61817 4.20758 8.57967 4.13175 8.53883C3.35883 8.127 3.00883 7.14525 3.34483 6.32975C3.37517 6.25567 3.76308 5.58833 4.20642 4.8475L5.01317 3.5L3.60908 3.50233C2.83033 3.50408 2.15308 3.51517 2.08833 3.52742ZM6.55667 3.52042C6.44292 3.55775 6.3525 3.6155 6.2825 3.69542C6.24283 3.74033 5.80417 4.45433 5.30717 5.28267L4.40358 6.78883L4.3925 6.94867C4.38317 7.07525 4.39075 7.13067 4.42692 7.21175C4.47949 7.34498 4.5797 7.45392 4.70808 7.51742C4.81425 7.56992 4.844 7.57225 5.53583 7.58333L6.25333 7.595L5.63208 8.63333C5.29025 9.20442 4.99567 9.71892 4.977 9.77667C4.893 10.0403 5.04408 10.3565 5.30717 10.4662C5.50667 10.549 5.78725 10.4959 5.93425 10.3472C6.01008 10.2702 7.79508 7.30508 7.83592 7.18783C7.90942 6.97842 7.83067 6.699 7.65858 6.55725C7.49933 6.426 7.43342 6.41667 6.67917 6.41667C6.30175 6.41667 5.99608 6.4085 6.00075 6.39858C6.00483 6.38867 6.29183 5.90917 6.63775 5.334L7.26717 4.28808L7.27592 4.12942C7.28171 4.04927 7.27582 3.9687 7.25842 3.89025C7.22167 3.77942 7.084 3.62483 6.97025 3.5665C6.867 3.514 6.65 3.4895 6.55667 3.52042ZM8.39125 3.61025C8.44492 3.78817 8.4665 4.06642 8.44375 4.27292C8.41342 4.54183 8.32767 4.77692 8.14742 5.0855C8.06167 5.23308 7.98875 5.36083 7.98467 5.36958C7.98058 5.37833 8.04008 5.41917 8.11708 5.46058C8.73192 5.78783 9.10233 6.49483 9.02592 7.19425C8.98508 7.56817 8.9425 7.65275 8.05817 9.128L7.23625 10.5H8.61875C9.51125 10.5 10.0502 10.4913 10.1401 10.4749C10.5881 10.3927 10.976 10.0048 11.0583 9.55675C11.0717 9.48033 11.0833 9.26975 11.0833 9.08833V8.75817L11.2613 8.73075C11.7413 8.65608 12.1392 8.27458 12.2249 7.80675C12.2389 7.728 12.25 7.37917 12.25 7C12.25 6.62083 12.2389 6.272 12.2249 6.19325C12.1392 5.72542 11.7413 5.34392 11.2613 5.26925L11.0833 5.24183V4.91167C11.0833 4.73025 11.0717 4.51967 11.0583 4.44325C10.976 3.99525 10.5881 3.60733 10.1401 3.52508C10.0572 3.5105 9.66933 3.5 9.17992 3.5H8.358L8.39125 3.61025Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function MoreVerticalIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 13.0909 13.0909"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M6.28145 2.49655C6.07445 2.58038 5.90449 2.73583 5.80254 2.93455C5.75618 3.02945 5.74909 3.07364 5.74909 3.27273C5.74909 3.48273 5.75455 3.51218 5.81291 3.62782C5.88873 3.77673 6.05564 3.94145 6.20727 4.01564C6.30218 4.062 6.34636 4.06909 6.54545 4.06909C6.74455 4.06909 6.78873 4.062 6.88364 4.01564C7.03527 3.94145 7.20218 3.77673 7.278 3.62782C7.33636 3.51218 7.34182 3.48273 7.34182 3.27273C7.34182 3.07364 7.33473 3.02945 7.28836 2.93455C7.19996 2.76885 7.0657 2.63212 6.90164 2.54073C6.79364 2.48618 6.74782 2.47691 6.56836 2.472C6.43036 2.46818 6.33327 2.47636 6.28145 2.49655ZM6.28145 5.76927C6.07445 5.85311 5.90449 6.00856 5.80254 6.20727C5.75618 6.30218 5.74909 6.34636 5.74909 6.54545C5.74909 6.75545 5.75455 6.78491 5.81291 6.90055C5.88873 7.04945 6.05564 7.21418 6.20727 7.28836C6.30218 7.33473 6.34636 7.34182 6.54545 7.34182C6.74455 7.34182 6.78873 7.33473 6.88364 7.28836C7.03527 7.21418 7.20218 7.04945 7.278 6.90055C7.33636 6.78491 7.34182 6.75545 7.34182 6.54545C7.34182 6.34636 7.33473 6.30218 7.28836 6.20727C7.19996 6.04157 7.0657 5.90485 6.90164 5.81345C6.79364 5.75891 6.74782 5.74964 6.56836 5.74473C6.43036 5.74091 6.33327 5.74909 6.28145 5.76927ZM6.28145 9.042C6.07445 9.12584 5.90449 9.28129 5.80254 9.48C5.75618 9.57491 5.74909 9.61909 5.74909 9.81818C5.74909 10.0282 5.75455 10.0576 5.81291 10.1733C5.88873 10.3222 6.05564 10.4869 6.20727 10.5611C6.30218 10.6075 6.34636 10.6145 6.54545 10.6145C6.74455 10.6145 6.78873 10.6075 6.88364 10.5611C7.03527 10.4869 7.20218 10.3222 7.278 10.1733C7.33636 10.0576 7.34182 10.0282 7.34182 9.81818C7.34182 9.61909 7.33473 9.57491 7.28836 9.48C7.19996 9.3143 7.0657 9.17758 6.90164 9.08618C6.79364 9.03164 6.74782 9.02236 6.56836 9.01745C6.43036 9.01364 6.33327 9.02182 6.28145 9.042Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function TrendUpIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 10 6.29267"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('h-1.5 w-2.5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M4.7382 0.0184656C4.61136 0.0486771 4.48819 0.0926646 4.37091 0.149643C4.2699 0.200802 3.29656 1.13216 2.20911 2.21831C0.0433712 4.38011 -0.00254076 4.43782 8.27795e-05 5.00713C0.00139455 5.50692 0.263749 5.92931 0.724181 6.17986L0.934064 6.29267H9.06705L9.27693 6.17986C9.49439 6.07109 9.67722 5.90385 9.8049 5.69693C9.93257 5.49001 10 5.25159 9.99972 5.00845C10.005 4.43914 9.96036 4.38273 7.79201 2.21831C6.56025 0.987865 5.73515 0.203425 5.60397 0.139149C5.33375 0.013898 5.03237 -0.0281123 4.7382 0.0184656Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function WarningFilledIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.4 1.68667C7.6425 1.84083 6.08417 2.45833 4.76583 3.52083C3.37 4.64667 2.3425 6.25417 1.91917 7.97583C1.73917 8.71 1.68833 9.15083 1.68833 10C1.68833 10.8492 1.73917 11.29 1.91917 12.0242C2.6575 15.03 5.11833 17.4425 8.13333 18.1167C8.83667 18.2742 9.20583 18.3133 10 18.3133C10.7942 18.3133 11.1633 18.2742 11.8667 18.1167C14.8817 17.4425 17.3425 15.03 18.0808 12.0242C18.2583 11.3 18.3108 10.8467 18.3125 10.0167C18.3133 9.20333 18.2767 8.84667 18.1167 8.13333C17.735 6.42583 16.735 4.77917 15.4 3.65917C13.88 2.38333 12.1375 1.725 10.1833 1.68583C9.92227 1.67839 9.66105 1.67866 9.4 1.68667ZM10.2833 5.055C10.3792 5.0875 10.5025 5.1675 10.5842 5.24917C10.8442 5.50833 10.8333 5.38 10.8333 8.33333C10.8333 11.2883 10.8442 11.1575 10.5833 11.4183C10.4581 11.5441 10.2956 11.626 10.1201 11.6519C9.9445 11.6777 9.76528 11.6461 9.60917 11.5617C9.41566 11.454 9.26963 11.2777 9.2 11.0675C9.17667 10.98 9.16833 10.0542 9.17417 8.26L9.18333 5.58333L9.27583 5.42583C9.37151 5.2536 9.52584 5.12143 9.71074 5.05337C9.89564 4.98532 10.0988 4.98589 10.2833 5.055ZM10.4267 12.6225C10.535 12.6882 10.6269 12.7778 10.6953 12.8845C10.7636 12.9912 10.8066 13.1121 10.8209 13.238C10.8352 13.3639 10.8204 13.4914 10.7778 13.6107C10.7352 13.7301 10.6657 13.838 10.5749 13.9263C10.484 14.0146 10.3741 14.0809 10.2536 14.1201C10.1331 14.1593 10.0052 14.1704 9.87981 14.1525C9.75437 14.1346 9.63471 14.0882 9.53001 14.0168C9.42531 13.9454 9.33836 13.851 9.27583 13.7408C9.19667 13.6067 9.18333 13.5467 9.18333 13.3333C9.18333 13.12 9.19667 13.06 9.27583 12.9258C9.35082 12.7869 9.46541 12.6735 9.60504 12.5999C9.74467 12.5263 9.90304 12.4959 10.06 12.5125C10.1901 12.5142 10.3171 12.5523 10.4267 12.6225Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function AlertDiamondIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.5 1.92917C9.37902 1.9698 9.26189 2.02111 9.15 2.0825C8.89667 2.22667 2.21083 8.92083 2.07417 9.16667C1.92955 9.42002 1.85774 9.70841 1.86667 10C1.86667 10.3275 1.92583 10.565 2.07417 10.8333C2.22167 11.0992 8.90083 17.7783 9.16667 17.9258C9.42002 18.0704 9.70841 18.1423 10 18.1333C10.2916 18.1423 10.58 18.0704 10.8333 17.9258C11.0992 17.7783 17.7783 11.0992 17.9258 10.8333C18.0704 10.58 18.1423 10.2916 18.1333 10C18.1423 9.70841 18.0704 9.42002 17.9258 9.16667C17.8475 9.02583 17.0333 8.1925 14.42 5.58C10.8467 2.00583 10.8858 2.04167 10.4692 1.92C10.2242 1.8475 9.73833 1.8525 9.5 1.92917ZM13.25 6.76667L16.4833 10L13.2417 13.2417L10 16.4833L6.75833 13.2417L3.51667 10L6.75 6.76667C7.82784 5.68338 8.91119 4.60559 10 3.53333C10.0092 3.53333 11.4717 4.98833 13.25 6.76667ZM9.74 6.7025C9.50322 6.75222 9.28909 6.87772 9.13 7.06C8.94167 7.26583 8.84083 7.47417 8.81333 7.71333C8.79 7.91 9.13833 10.805 9.22 11.0942C9.35667 11.58 9.97167 11.8125 10.4217 11.5492C10.5145 11.4933 10.5955 11.4196 10.6598 11.3324C10.7241 11.2451 10.7707 11.1461 10.7967 11.0408C10.8167 10.9542 10.9167 10.2158 11.0192 9.4C11.2217 7.78 11.2258 7.6475 11.0783 7.35667C10.8175 6.8425 10.3033 6.59083 9.74 6.7025ZM9.7275 12.5525C9.42 12.6475 9.16667 13.0075 9.16667 13.35C9.16667 13.6192 9.37917 13.9517 9.635 14.0842C9.77667 14.1575 10.0525 14.1825 10.22 14.1375C10.415 14.0842 10.6142 13.9283 10.7225 13.7433C10.8033 13.6058 10.8167 13.5483 10.8158 13.3333C10.815 13.0442 10.7675 12.9325 10.5608 12.7317C10.3433 12.52 10.0425 12.4558 9.7275 12.5525Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function AlertTriangleIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.675 2.03667C9.5 2.07833 9.15167 2.31083 9.03 2.46667C8.86333 2.68 1.68667 15.1467 1.6225 15.3333C1.53083 15.6 1.55583 15.9917 1.67917 16.245C1.81258 16.5051 2.02779 16.7142 2.29167 16.84L2.515 16.95H17.485L17.7083 16.84C18.1508 16.6225 18.4 16.2617 18.4267 15.8017C18.4398 15.6547 18.4266 15.5065 18.3875 15.3642C18.3542 15.2508 16.9692 12.8175 14.6892 8.86667C11.8067 3.87 11.0108 2.515 10.8808 2.38167C10.7769 2.2696 10.6517 2.17944 10.5124 2.11647C10.3732 2.0535 10.2228 2.019 10.07 2.015C9.93794 2.00789 9.80549 2.01515 9.675 2.03667ZM13.2425 9.6925L16.4683 15.2833L13.2342 15.2917C11.4558 15.2967 8.54417 15.2967 6.76583 15.2917L3.53167 15.2833L6.7575 9.6925C8.53167 6.6175 9.99083 4.10167 10 4.10167C10.0092 4.10167 11.4683 6.6175 13.2425 9.6925ZM9.7275 6.71917C9.51 6.78583 9.28333 7.0175 9.2175 7.24167C9.14 7.5025 9.14167 10.8825 9.22 11.1117C9.32333 11.4142 9.6775 11.6667 10 11.6667C10.1975 11.6667 10.4283 11.5667 10.5808 11.4142C10.835 11.1592 10.8333 11.1758 10.8333 9.16667C10.8333 7.1575 10.835 7.17417 10.5808 6.91917C10.3483 6.68667 10.0558 6.61833 9.7275 6.71917ZM9.7275 12.5525C9.42 12.6475 9.16667 13.0075 9.16667 13.35C9.16667 13.6792 9.4325 14.0258 9.7575 14.12C9.88848 14.1614 10.0278 14.1694 10.1626 14.1432C10.2975 14.117 10.4236 14.0574 10.5295 13.9699C10.6354 13.8824 10.7177 13.7697 10.7689 13.6422C10.8201 13.5147 10.8385 13.3764 10.8225 13.24C10.8063 13.0839 10.7455 12.9359 10.6471 12.8136C10.5488 12.6914 10.4173 12.6001 10.2683 12.5508C10.0933 12.4892 9.93333 12.4892 9.7275 12.5525Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function BedIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M2.2275 4.21917C2.02417 4.28167 1.79167 4.51167 1.72 4.72167C1.67167 4.8625 1.66667 5.39 1.66667 10C1.66667 15.76 1.64583 15.3075 1.92167 15.5833C2.07167 15.7325 2.30333 15.8333 2.5 15.8333C2.6975 15.8333 2.92833 15.7333 3.08083 15.5808C3.3275 15.3342 3.33333 15.2917 3.33333 13.7942V12.5H16.6667V13.8108C16.6667 15.3083 16.67 15.3317 16.9217 15.5833C17.0717 15.7325 17.3033 15.8333 17.5 15.8333C17.6983 15.8333 17.9283 15.7333 18.0808 15.58C18.3508 15.31 18.3367 15.5517 18.3258 11.48L18.3167 7.88333L18.2325 7.61583C18.108 7.22107 17.8902 6.86216 17.5974 6.56955C17.3047 6.27694 16.9457 6.05927 16.5508 5.935L16.2833 5.85083L13.1042 5.84083C9.49667 5.83 9.68833 5.8175 9.42 6.08583C9.16083 6.345 9.16667 6.28083 9.16667 8.70583V10.8333H3.33333V7.8725C3.33333 4.51917 3.345 4.68417 3.08083 4.41917C2.84833 4.18667 2.55583 4.11833 2.2275 4.21917ZM5.8 5.885C5.0275 6.05083 4.37917 6.705 4.21667 7.48333C4.14557 7.82224 4.16008 8.17352 4.25887 8.50541C4.35766 8.8373 4.53763 9.13933 4.78248 9.38418C5.02734 9.62904 5.32937 9.809 5.66126 9.90779C5.99315 10.0066 6.34443 10.0211 6.68333 9.95C7.79583 9.7175 8.51833 8.60417 8.28333 7.48333C8.05 6.36583 6.92667 5.64333 5.8 5.885ZM6.43667 7.55167C6.48645 7.5769 6.5305 7.61212 6.56609 7.65512C6.60167 7.69812 6.62802 7.74799 6.6435 7.80161C6.65898 7.85524 6.66325 7.91148 6.65606 7.96683C6.64886 8.02217 6.63034 8.07545 6.60167 8.12333C6.56642 8.18555 6.5153 8.23731 6.45352 8.27332C6.39174 8.30933 6.32151 8.3283 6.25 8.3283C6.17849 8.3283 6.10826 8.30933 6.04648 8.27332C5.9847 8.23731 5.93358 8.18555 5.89833 8.12333C5.86988 8.07751 5.85103 8.02638 5.84293 7.97305C5.83483 7.91972 5.83764 7.86531 5.8512 7.8131C5.86476 7.76089 5.88878 7.71198 5.92181 7.66933C5.95483 7.62669 5.99618 7.59119 6.04333 7.565C6.10133 7.52682 6.16873 7.50537 6.23813 7.50302C6.30752 7.50067 6.37622 7.5175 6.43667 7.55167ZM16.1083 7.5475C16.2925 7.61333 16.4533 7.74833 16.5575 7.92583L16.65 8.08333L16.66 9.45833L16.6692 10.8333H10.8333V7.5L13.4083 7.50167C15.4725 7.5025 16.0083 7.51167 16.1083 7.5475Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function BlingFilledIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 16.3333 16.3333"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-4', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M7.35408 1.39174C7.18939 1.42236 7.01789 1.52921 6.9369 1.65239C6.89947 1.70887 6.70551 2.12333 6.50679 2.5725C6.08008 3.53685 5.86503 3.96968 5.62411 4.34943C5.02716 5.27875 4.23618 6.06788 3.30546 6.66264C3.18432 6.73818 2.77394 6.97501 2.39351 7.18871C2.0124 7.4024 1.66328 7.60589 1.617 7.6406C1.38153 7.81754 1.30667 8.21362 1.45707 8.48925C1.49816 8.56585 1.55228 8.63471 1.617 8.69274C1.66328 8.72744 2.02601 8.93842 2.42278 9.16096C3.57632 9.80953 4.08606 10.1784 4.68222 10.797C5.20693 11.3415 5.60369 11.89 5.93376 12.529C6.03653 12.7271 6.28901 13.2695 6.49454 13.7336C6.70007 14.1977 6.90287 14.6285 6.94575 14.6912C7.17986 15.0342 7.79236 15.0342 8.02647 14.6912C8.06935 14.6285 8.26671 14.21 8.46543 13.7608C8.89146 12.7978 9.10719 12.3643 9.34811 11.9839C9.86806 11.1773 10.5336 10.4746 11.3108 9.91161C11.5994 9.7054 11.9478 9.49511 12.6719 9.09086C13.0013 8.90643 13.3089 8.72744 13.3552 8.69274C13.4199 8.63471 13.4741 8.56585 13.5152 8.48925C13.5842 8.36038 13.6101 8.21277 13.589 8.0681C13.5679 7.92343 13.501 7.78933 13.3981 7.68551C13.3545 7.64196 13.0265 7.44256 12.6692 7.24179C11.8954 6.8076 11.5225 6.58097 11.2441 6.37613C10.4959 5.81946 9.85375 5.13301 9.34811 4.34943C9.10719 3.969 8.89146 3.53549 8.46543 2.5725C8.26671 2.12333 8.06935 1.70479 8.02647 1.64218C7.89717 1.45231 7.60861 1.34478 7.35408 1.39174ZM12.8319 1.38221C12.8149 1.3931 12.7488 1.50607 12.6856 1.63333C12.366 2.26035 11.8842 2.79027 11.2904 3.16799C10.976 3.36399 10.976 3.44157 11.2904 3.63757C11.8757 4.00932 12.3521 4.52942 12.6713 5.145C12.7978 5.39817 12.838 5.44444 12.9306 5.44444C13.0231 5.44444 13.0633 5.39817 13.1898 5.145C13.4818 4.5604 13.9636 4.03025 14.5503 3.64914C14.6701 3.57087 14.7783 3.48921 14.7912 3.46675C14.8402 3.37896 14.783 3.30001 14.5721 3.16935C14.0004 2.81274 13.4838 2.24924 13.1898 1.66056C13.1485 1.57291 13.1003 1.4887 13.0456 1.40875C13.0027 1.36043 12.887 1.34546 12.8319 1.38221Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function CheckCircleRegularIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.4 1.68667C7.6425 1.84083 6.08417 2.45833 4.76583 3.52083C3.37 4.64667 2.3425 6.25417 1.91917 7.97583C1.73917 8.71 1.68833 9.15083 1.68833 10C1.68833 10.8492 1.73917 11.29 1.91917 12.0242C2.6575 15.03 5.11833 17.4425 8.13333 18.1167C8.83667 18.2742 9.20583 18.3133 10 18.3133C10.7942 18.3133 11.1633 18.2742 11.8667 18.1167C14.8817 17.4425 17.3425 15.03 18.0808 12.0242C18.2583 11.3 18.3108 10.8467 18.3125 10.0167C18.3133 9.20333 18.2767 8.84667 18.1167 8.13333C17.735 6.42583 16.735 4.77917 15.4 3.65917C13.88 2.38333 12.1375 1.725 10.1833 1.68583C9.92227 1.67839 9.66105 1.67866 9.4 1.68667ZM10.6833 3.3675C13.0067 3.62667 14.995 5.02583 16 7.1075C16.4378 8.00938 16.6651 8.99884 16.665 10.0013C16.6648 11.0038 16.4372 11.9932 15.9992 12.895C15.4532 14.0227 14.6012 14.9742 13.5405 15.6409C12.4797 16.3077 11.2529 16.6628 10 16.6658C8.74657 16.6633 7.51916 16.3081 6.45811 15.6408C5.39707 14.9735 4.54522 14.0211 4 12.8925C3.56239 11.9911 3.33502 11.0021 3.33502 10C3.33502 8.99794 3.56239 8.00895 4 7.1075C4.65336 5.74917 5.74917 4.65336 7.1075 4C8.21 3.46667 9.5125 3.23667 10.6833 3.3675ZM13.35 6.76333C13.2754 6.78521 13.2029 6.81366 13.1333 6.84833C13.0692 6.88083 12.0717 7.85083 10.9167 9.00333L8.81583 11.1L7.91667 10.1975C6.90417 9.1825 6.8225 9.12167 6.46667 9.12167C6.225 9.12083 6.08417 9.1775 5.905 9.345C5.77521 9.46678 5.68896 9.62777 5.65945 9.80329C5.62995 9.9788 5.65883 10.1591 5.74167 10.3167C5.855 10.535 8.2475 12.925 8.45667 13.03C8.62833 13.1158 8.97583 13.125 9.15917 13.0483C9.31833 12.9833 14.1725 8.14583 14.2717 7.95417C14.3416 7.81108 14.3706 7.65144 14.3555 7.49289C14.3403 7.33435 14.2816 7.18308 14.1858 7.05583C14.0183 6.83583 13.6142 6.69417 13.35 6.76333Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function DropIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.71167 1.71917C9.30167 1.87 7.39667 3.69583 6.35833 4.93333C4.19417 7.51333 3.16083 10.0308 3.36333 12.235C3.5825 14.6242 5 16.6625 7.15667 17.6892C9.63 18.8675 12.6033 18.3867 14.5925 16.4858C15.3707 15.7465 15.9583 14.8297 16.305 13.8139C16.6517 12.798 16.7472 11.7133 16.5833 10.6525C16.265 8.54667 14.855 6.11167 12.6175 3.8025C11.6875 2.8425 10.645 1.89667 10.3675 1.76C10.1611 1.66711 9.92797 1.6526 9.71167 1.71917ZM10.5675 4.11C11.9575 5.40167 13.2367 6.97667 13.9775 8.30917C15.0083 10.165 15.2475 11.7367 14.7333 13.2725C14.1733 14.9425 12.7683 16.1775 10.9783 16.5725C10.5025 16.6775 9.4975 16.6775 9.02167 16.5725C6.72917 16.0667 5.12167 14.2 5.01167 11.9167C4.9175 9.9575 6.02167 7.73833 8.36083 5.18667C8.76083 4.75083 9.94917 3.6 9.99917 3.6C10.01 3.6 10.265 3.83 10.5675 4.11Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function HeartbeatFilledIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 16.3333 16.3333"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-4', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M5.2589 2.07078C4.35036 2.18444 3.47448 2.64245 2.77691 3.36724C2.05756 4.11381 1.60023 5.04209 1.43077 6.09695C1.37633 6.43383 1.34843 7.01094 1.37361 7.27567L1.39334 7.48664H5.02343L5.62163 6.28342C6.08509 5.35174 6.2457 5.05434 6.33145 4.96723C6.39339 4.90438 6.46719 4.85445 6.54856 4.82033C6.62994 4.7862 6.71728 4.76857 6.80552 4.76844C6.89376 4.76831 6.98114 4.7857 7.06262 4.81959C7.14409 4.85348 7.21803 4.9032 7.28015 4.96587C7.37883 5.06523 7.47955 5.28505 8.18052 6.92178C8.61404 7.93581 8.97541 8.76541 8.98358 8.76541C8.99106 8.76473 9.16256 8.51701 9.36469 8.21416C9.68115 7.73981 9.75056 7.6527 9.86626 7.58192L10.0003 7.50026L12.4687 7.49277L14.9378 7.48528L14.9548 7.31855C15.0147 6.74756 14.9187 5.95267 14.7105 5.29662C14.588 4.90938 14.2606 4.2506 14.0272 3.92053C13.7584 3.54146 13.203 2.99566 12.8396 2.75406C12.3929 2.4469 11.8898 2.23111 11.3594 2.1191C10.9728 2.03539 10.2794 2.03539 9.88872 2.1191C9.29323 2.24705 8.80527 2.47844 8.21795 2.90991C8.1744 2.94121 8.15943 2.94121 8.11587 2.90991C7.52447 2.47503 7.02902 2.2416 6.44511 2.12183C6.12593 2.05649 5.56379 2.03199 5.2589 2.07078ZM6.38862 7.8031C6.1865 8.20735 5.98913 8.57689 5.95034 8.62317C5.89243 8.68331 5.82479 8.73324 5.75026 8.77085L5.62163 8.83414L3.68069 8.84776L1.74043 8.86137L1.94527 9.27446C2.61902 10.6363 3.86172 11.949 5.52636 13.0584C6.53358 13.7294 7.7368 14.2915 8.16691 14.2915C8.59702 14.2915 9.80024 13.7294 10.8075 13.0584C11.8861 12.339 12.8069 11.5169 13.5134 10.6417C13.887 10.1789 14.3545 9.41262 14.5464 8.94984L14.5886 8.84776H10.5713L9.96086 9.76378C9.62534 10.2674 9.31365 10.7077 9.26737 10.7431C9.13701 10.844 8.9744 10.894 8.80987 10.8839C8.64533 10.8738 8.4901 10.8041 8.37312 10.688C8.27512 10.5893 8.17848 10.3804 7.52991 8.86137C7.28067 8.27583 7.02978 7.691 6.77722 7.10689C6.76361 7.08103 6.63294 7.31582 6.38862 7.8031Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function NurseFilledIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 14 14"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-3.5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M2 3.5C2 2.67157 2.67157 2 3.5 2H10.5C11.3284 2 12 2.67157 12 3.5V10.5C12 11.3284 11.3284 12 10.5 12H3.5C2.67157 12 2 11.3284 2 10.5V3.5ZM8 4.5H6V6.5H4V8.5H6V10.5H8V8.5H10V6.5H8V4.5Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function HighKneesIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.5825 1.7C9.12386 1.78163 8.69658 1.98807 8.34759 2.29664C7.99859 2.60521 7.74137 3.00398 7.60417 3.44917C7.535 3.67667 7.5225 3.785 7.5225 4.16667C7.5225 4.54833 7.535 4.65667 7.60417 4.88417C7.72688 5.27903 7.94378 5.63813 8.23616 5.93051C8.52854 6.22289 8.88764 6.43979 9.2825 6.5625C9.51 6.63167 9.61833 6.64417 10 6.64417C10.3817 6.64417 10.49 6.63167 10.7175 6.5625C11.1124 6.43979 11.4715 6.22289 11.7638 5.93051C12.0562 5.63813 12.2731 5.27903 12.3958 4.88417C12.465 4.65667 12.4775 4.54833 12.4775 4.16667C12.4775 3.785 12.465 3.67667 12.3958 3.44917C12.1533 2.6525 11.5033 2.00417 10.7175 1.77417C10.4167 1.68583 9.86 1.65 9.5825 1.7ZM10.4267 3.45583C10.9517 3.77833 10.9617 4.53833 10.4458 4.86583C10.3517 4.92551 10.2465 4.96566 10.1365 4.98388C10.0266 5.00211 9.91405 4.99804 9.80569 4.97192C9.69732 4.9458 9.59531 4.89816 9.50572 4.83184C9.41613 4.76551 9.34079 4.68185 9.28417 4.58583C9.195 4.44083 9.18333 4.3925 9.18333 4.16917C9.18333 3.95333 9.19667 3.89417 9.27583 3.75917C9.35082 3.62027 9.46541 3.50681 9.60504 3.43321C9.74467 3.35962 9.90304 3.3292 10.06 3.34583C10.1901 3.34754 10.3171 3.38565 10.4267 3.45583ZM14.65 5.49667C14.4517 5.58917 14.3642 5.7 13.7033 6.69167C13.3717 7.19167 13.085 7.6 13.0675 7.6C13.0508 7.6 12.8617 7.49417 12.6475 7.365C11.8483 6.8825 11.5208 6.76667 10.9567 6.76667C10.6033 6.7675 7.13833 7.45083 6.88083 7.57083C6.6725 7.66833 6.4025 7.93667 6.30667 8.1425C6.22 8.3275 5.83333 9.8575 5.83333 10.015C5.83333 10.3383 6.09417 10.6892 6.4025 10.7808C6.7125 10.8733 6.95417 10.8283 7.2 10.6333C7.37083 10.4983 7.44 10.3408 7.58333 9.76667C7.64917 9.50083 7.7175 9.22917 7.735 9.1625C7.76583 9.04667 7.775 9.04 7.975 9.00167C8.09 8.98 8.2175 8.95417 8.25833 8.94417L8.33333 8.92583V10.3575C8.33333 11.9683 8.33667 11.9917 8.57083 12.2333L8.7025 12.3692L8.53583 13.5325L8.36917 14.695L7.555 15.9225C7.1075 16.5975 6.72417 17.2008 6.70417 17.2633C6.61417 17.5367 6.7025 17.8733 6.91833 18.0833C7.05921 18.2254 7.24672 18.3118 7.44628 18.3265C7.64584 18.3412 7.84399 18.2833 8.00417 18.1633C8.14167 18.0658 9.84083 15.5042 9.92833 15.2625C9.96917 15.1492 10.0633 14.6025 10.1658 13.8792C10.2592 13.2217 10.3433 12.6425 10.3533 12.5917L10.3717 12.5H10.9358C11.4508 12.5 11.5 12.505 11.4992 12.5583C11.4992 12.59 11.4467 12.9242 11.3833 13.3C11.2175 14.2767 11.2275 14.4392 11.4675 14.7125C11.6383 14.9067 11.8092 14.9817 12.0833 14.9817C12.2575 14.9817 12.3508 14.9633 12.4525 14.91C12.6317 14.815 12.82 14.6025 12.865 14.4442C12.885 14.3742 12.9842 13.8217 13.0858 13.2167C13.2258 12.3825 13.265 12.0725 13.25 11.9333C13.2058 11.5292 12.9008 11.1217 12.5092 10.9425C12.36 10.8742 12.2517 10.8525 11.9933 10.84L11.6667 10.8242V9.77667C11.6667 9.20083 11.6775 8.73583 11.6917 8.74333C11.7058 8.75083 12.0158 8.935 12.3808 9.15333C13.0417 9.5475 13.0458 9.54917 13.2825 9.56167C13.5483 9.575 13.6833 9.53333 13.8633 9.38167C14.0242 9.24583 15.7533 6.64 15.8017 6.46C15.905 6.07667 15.685 5.635 15.3117 5.47917C15.1533 5.41333 14.8108 5.42167 14.65 5.49667Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function Sparkles3FilledIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 16.3333 16.3333"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-4', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M7.92371 1.40807C7.75765 1.4666 7.58615 1.64558 7.52762 1.82185C7.45889 2.02874 7.47794 2.52622 7.56029 2.68411C7.62835 2.81342 7.78351 2.95769 7.91214 3.01146C8.02715 3.05978 8.30618 3.05978 8.42119 3.01146C8.54982 2.95769 8.70499 2.81342 8.77304 2.68411C8.85539 2.52622 8.87444 2.02874 8.80571 1.82185C8.68729 1.46524 8.28917 1.27876 7.92371 1.40807ZM3.19861 2.69228C3.05139 2.72729 2.92042 2.81128 2.82719 2.93047C2.73396 3.04967 2.68399 3.19701 2.68547 3.34833C2.68547 3.64165 2.73107 3.70222 3.61171 4.57878C4.45219 5.41518 4.52365 5.46962 4.7741 5.47099C4.98915 5.47235 5.11778 5.41926 5.26818 5.26818C5.48392 5.05313 5.53496 4.76525 5.40429 4.50392C5.31922 4.33242 3.82881 2.8386 3.65867 2.75353C3.53004 2.68956 3.31771 2.66097 3.19861 2.69228ZM12.8149 2.69568C12.743 2.71695 12.6743 2.74785 12.6107 2.78756C12.4426 2.89576 10.9835 4.38278 10.9188 4.51072C10.8045 4.73939 10.8562 5.08103 11.0352 5.27703C11.2142 5.47371 11.5749 5.53156 11.8294 5.40429C12.0077 5.31582 13.4941 3.82949 13.5859 3.64778C13.6656 3.49125 13.6717 3.21767 13.5995 3.07611C13.5262 2.93952 13.4161 2.82615 13.2817 2.74876C13.1353 2.68332 12.9722 2.66478 12.8149 2.69568ZM7.90601 3.79546C7.70729 3.88189 7.6263 3.99282 7.35068 4.55768C6.96412 5.35053 6.64835 5.79833 6.11887 6.30399C5.64453 6.75724 5.25389 7.01721 4.50528 7.3779C3.86828 7.68415 3.75667 7.80189 3.75667 8.16667C3.75667 8.53144 3.86828 8.64918 4.50528 8.95543C5.25389 9.31612 5.64453 9.5761 6.11887 10.0293C6.64835 10.535 6.96412 10.9828 7.35068 11.7757C7.69096 12.4732 7.79644 12.5767 8.16667 12.5767C8.53689 12.5767 8.64237 12.4732 8.98265 11.7757C9.36921 10.9828 9.68499 10.535 10.2145 10.0293C10.6888 9.5761 11.0794 9.31612 11.8281 8.95543C12.4651 8.64918 12.5767 8.53144 12.5767 8.16667C12.5767 7.80189 12.4651 7.68415 11.8281 7.3779C11.0794 7.01721 10.6888 6.75724 10.2145 6.30399C9.68499 5.79833 9.36921 5.35053 8.98265 4.55768C8.70431 3.98806 8.62468 3.87917 8.42119 3.7941C8.30822 3.74646 8.01558 3.74714 7.90601 3.79546ZM1.79871 7.53171C1.55779 7.6195 1.36111 7.90465 1.36111 8.16667C1.36111 8.44229 1.56051 8.7186 1.82185 8.80571C1.93346 8.84246 2.0301 8.85062 2.26829 8.84178C2.61537 8.82953 2.73243 8.78597 2.88487 8.61243C3.00737 8.47292 3.04889 8.36062 3.04889 8.16667C3.04889 7.97271 3.00737 7.86042 2.88487 7.7209C2.72767 7.54124 2.61742 7.50244 2.24583 7.49496C1.99947 7.48951 1.8899 7.49836 1.79871 7.53171ZM13.7744 7.51129C13.6753 7.54297 13.5838 7.59498 13.5059 7.664C13.428 7.73302 13.3653 7.81753 13.3219 7.91214C13.2736 8.02715 13.2736 8.30618 13.3219 8.42119C13.3756 8.54982 13.5199 8.70499 13.6492 8.77304C13.7391 8.81932 13.8214 8.83361 14.065 8.84178C14.4441 8.85539 14.6013 8.81183 14.7681 8.64442C14.8315 8.58214 14.8818 8.50787 14.9162 8.42593C14.9506 8.34399 14.9684 8.25602 14.9685 8.16715C14.9685 8.07828 14.9509 7.99029 14.9166 7.9083C14.8823 7.82631 14.832 7.75196 14.7687 7.6896C14.6122 7.53307 14.4584 7.48543 14.1168 7.48815C14.0022 7.48674 13.8878 7.49447 13.7744 7.51129ZM4.59919 10.8875C4.45015 10.9324 4.37189 11.0012 3.61171 11.7566C2.73039 12.6318 2.68547 12.6917 2.68547 12.985C2.68547 13.2525 2.82431 13.4709 3.07611 13.5989C3.19181 13.6581 3.45314 13.6649 3.60694 13.6132C3.76007 13.5621 5.30561 12.0288 5.40429 11.8294C5.44336 11.7489 5.46592 11.6614 5.47064 11.572C5.47535 11.4827 5.46213 11.3933 5.43175 11.3091C5.40137 11.225 5.35444 11.1477 5.29374 11.082C5.23304 11.0162 5.15979 10.9633 5.07831 10.9263C4.92748 10.86 4.75873 10.8463 4.59919 10.8875ZM11.255 10.9243C10.9086 11.0903 10.7623 11.4959 10.929 11.8294C10.978 11.9288 11.2122 12.1799 11.807 12.772C12.5937 13.5553 12.6223 13.5805 12.7767 13.6247C13.1068 13.7207 13.4294 13.5805 13.5914 13.2708C13.6724 13.1163 13.6696 12.8502 13.5859 12.6856C13.5097 12.5352 12.0479 11.0543 11.8737 10.9515C11.7795 10.8999 11.6748 10.8706 11.5675 10.8659C11.4603 10.8612 11.3533 10.8811 11.255 10.9243ZM7.90601 13.3232C7.78147 13.3777 7.62631 13.5233 7.56029 13.6492C7.47794 13.8071 7.45889 14.3046 7.52762 14.5115C7.61474 14.7728 7.89104 14.9722 8.16667 14.9722C8.44229 14.9722 8.7186 14.7728 8.80571 14.5115C8.87444 14.3046 8.85539 13.8071 8.77304 13.6492C8.70499 13.5199 8.54982 13.3756 8.42119 13.3219C8.30822 13.2742 8.01558 13.2749 7.90601 13.3232Z"
        fill="currentColor"
      />
    </svg>
  )
}

export function VoiceIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn('size-5', className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M9.7275 2.5525C9.51 2.61917 9.28333 2.85083 9.2175 3.075C9.1725 3.225 9.16667 4.05167 9.16667 10.0167C9.16667 17.625 9.14333 16.9717 9.42167 17.25C9.57167 17.3992 9.80333 17.5 10 17.5C10.335 17.5 10.6892 17.24 10.7825 16.925C10.8275 16.775 10.8333 15.95 10.8333 10C10.8333 2.41 10.855 3.02667 10.5808 2.7525C10.3483 2.52 10.0558 2.45167 9.7275 2.5525ZM6.39417 5.0525C6.19083 5.115 5.95833 5.345 5.88667 5.555C5.83917 5.69583 5.83333 6.155 5.83333 10C5.83333 14.8258 5.81417 14.4758 6.08833 14.75C6.23833 14.8992 6.47 15 6.66667 15C7.00167 15 7.35583 14.74 7.44917 14.425C7.49333 14.2767 7.5 13.7117 7.5 10C7.5 5.2025 7.51667 5.5225 7.2475 5.2525C7.015 5.02 6.7225 4.95167 6.39417 5.0525ZM13.0608 5.0525C12.8575 5.115 12.625 5.345 12.5533 5.555C12.5058 5.69583 12.5 6.155 12.5 10C12.5 14.8258 12.4808 14.4758 12.755 14.75C12.905 14.8992 13.1367 15 13.3333 15C13.6683 15 14.0225 14.74 14.1158 14.425C14.16 14.2767 14.1667 13.7117 14.1667 10C14.1667 5.2025 14.1833 5.5225 13.9142 5.2525C13.6817 5.02 13.3892 4.95167 13.0608 5.0525ZM3.06083 7.5525C2.8575 7.615 2.625 7.845 2.55333 8.055C2.50667 8.19083 2.5 8.4475 2.5 10C2.5 12.03 2.49583 11.99 2.755 12.25C2.905 12.3992 3.13667 12.5 3.33333 12.5C3.53083 12.5 3.76167 12.4 3.91417 12.2475C4.16833 11.9925 4.16667 12.0092 4.16667 10C4.16667 7.99083 4.16833 8.0075 3.91417 7.7525C3.68167 7.52 3.38917 7.45167 3.06083 7.5525ZM16.3942 7.5525C16.1908 7.615 15.9583 7.845 15.8867 8.055C15.84 8.19083 15.8333 8.4475 15.8333 10C15.8333 12.03 15.8292 11.99 16.0883 12.25C16.2383 12.3992 16.47 12.5 16.6667 12.5C16.8642 12.5 17.095 12.4 17.2475 12.2475C17.5017 11.9925 17.5 12.0092 17.5 10C17.5 7.99083 17.5017 8.0075 17.2475 7.7525C17.015 7.52 16.7225 7.45167 16.3942 7.5525Z"
        fill="currentColor"
      />
    </svg>
  )
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/logo.tsx`

```tsx
import { useId, type SVGProps } from 'react'

export function BionisLogo({ className, ...props }: SVGProps<SVGSVGElement>) {
  const reactId = useId().replace(/:/g, '')
  const gradientA = `bionis-logo-a-${reactId}`
  const gradientB = `bionis-logo-b-${reactId}`

  return (
    <svg
      viewBox="0 0 1024 1024"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={className}
      {...props}
    >
      <path
        d="M904.886 439.002c43.208-45.218-30.146-116.562-78.379-74.359l-85.413 76.369-75.364-85.413-89.432 79.384 94.456 105.51c35.17 32.155 85.413 34.165 127.617 0z"
        fill={`url(#${gradientA})`}
      />
      <path
        d="m487.643 675.145-103.5-72.35-76.369 101.491-181.879 133.645c-52.253 41.199 8.041 127.617 71.345 92.447l189.917-127.617c16.078-11.053 28.136-25.121 37.18-38.184z"
        fill={`url(#${gradientB})`}
      />
      <path
        d="M220.581 366.654c-31.152 47.228 50.241 113.549 94.457 53.257l60.291-77.373 92.446 31.15-83.402 114.554c-36.177 53.257-32.158 103.5 6.029 138.67l170.825 125.606-95.461 149.724c-29.143 48.233 53.255 112.548 98.476 63.306l128.621-171.83c29.139-41.199 21.1-99.481-12.058-128.622L555.198 570.64l96.466-128.622c40.193-61.296 22.105-164.796-106.515-188.913L389.397 222.96c-38.186-5.025-70.342 8.039-86.418 30.145z"
        fill="#0886fd"
      />
      <circle cx="692.861" cy="148.601" r="108.524" fill="#0886fd" />
      <defs>
        <linearGradient
          id={gradientA}
          x1="733.055"
          y1="471.159"
          x2="576.298"
          y2="446.038"
          gradientUnits="userSpaceOnUse"
        >
          <stop stopColor="#0886fd" />
          <stop offset="1" stopColor="#00509b" />
        </linearGradient>
        <linearGradient
          id={gradientB}
          x1="354.225"
          y1="747.494"
          x2="446.671"
          y2="621.887"
          gradientUnits="userSpaceOnUse"
        >
          <stop stopColor="#0886fd" />
          <stop offset="1" stopColor="#00509b" />
        </linearGradient>
      </defs>
    </svg>
  )
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/navigation.tsx`

```tsx
import {
  createContext,
  useContext,
  useMemo,
  useState,
  type AnchorHTMLAttributes,
  type MouseEvent,
  type ReactNode,
} from 'react'

type DashboardNavigation = {
  pathname: string
  navigate: (pathname: string) => void
}

const DashboardNavigationContext = createContext<DashboardNavigation | null>(null)

export function DashboardNavigationProvider({ children }: { children: ReactNode }) {
  const [pathname, setPathname] = useState('/')
  const value = useMemo(
    () => ({ pathname, navigate: setPathname }),
    [pathname],
  )

  return (
    <DashboardNavigationContext.Provider value={value}>
      {children}
    </DashboardNavigationContext.Provider>
  )
}

export function useDashboardNavigation() {
  const context = useContext(DashboardNavigationContext)

  if (!context) {
    throw new Error('useDashboardNavigation must be used within DashboardNavigationProvider')
  }

  return context
}

export function DashboardLink({
  href,
  onClick,
  ...props
}: AnchorHTMLAttributes<HTMLAnchorElement> & { href: string }) {
  const { navigate } = useDashboardNavigation()

  function handleClick(event: MouseEvent<HTMLAnchorElement>) {
    onClick?.(event)

    if (
      event.defaultPrevented ||
      event.button !== 0 ||
      event.metaKey ||
      event.ctrlKey ||
      event.shiftKey ||
      event.altKey
    ) {
      return
    }

    event.preventDefault()
    navigate(href)
  }

  return <a href={href} onClick={handleClick} {...props} />
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/shared.tsx`

```tsx
import {
  useEffect,
  useId,
  useMemo,
  useState,
  type ComponentType,
  type HTMLAttributes,
  type ReactNode,
  type SVGProps,
} from 'react'
import {
  Area,
  AreaChart,
  Bar,
  BarChart,
  CartesianGrid,
  Cell,
  Pie,
  PieChart,
  ResponsiveContainer,
  Scatter,
  ScatterChart,
  Tooltip,
  XAxis,
  YAxis,
} from 'recharts'
import {
  AlertDiamondIcon,
  AlertTriangleIcon,
  BatteryChargingIcon,
  BedIcon,
  BlingFilledIcon,
  CalendarIcon,
  HeartbeatFilledIcon,
  HeartbeatIcon,
  MoonStarsIcon,
  MoreVerticalIcon,
  NurseFilledIcon,
  TrendUpIcon,
  WalkIcon,
  WarningFilledIcon,
} from './icons'
import { Button } from '@/components/ui/button'
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import {
  heatmapDateLabels,
  recoveryFactors,
  recoveryHeatmapData,
  type ActivityTrendPoint,
  type HeatmapColumn,
  type HeatmapTile,
  type KeyMetric,
  type KeyMetricIcon,
  type RecoveryFactor,
  type SleepBreakdownPoint,
  type SleepRecoveryTrendPoint,
} from '../../data'
import { cn } from '@/lib/utils'

export const CHART_THEME_COLORS = {
  recovery: 'var(--chart-steps)',
  sleep: 'var(--chart-sleep)',
  prediction: 'var(--insight-prediction)',
  actions: 'var(--insight-actions)',
  improving: 'var(--live)',
  outlook: 'var(--chart-period)',
  tooltipBg: 'var(--chart-tooltip-bg)',
  heatmap: {
    low: 'var(--heatmap-low)',
    med: 'var(--heatmap-med)',
    high: 'var(--heatmap-high)',
  },
} as const

const metricIcons: Record<
  KeyMetricIcon,
  ComponentType<SVGProps<SVGSVGElement>>
> = {
  heart: HeartbeatIcon,
  walk: WalkIcon,
  moon: MoonStarsIcon,
  battery: BatteryChargingIcon,
  heartbeat: HeartbeatFilledIcon,
  nurse: NurseFilledIcon,
}

const metricIconBgMap: Record<KeyMetricIcon, string> = {
  heart: 'var(--metric-heart)',
  walk: 'var(--metric-steps)',
  moon: 'var(--metric-sleep)',
  battery: 'var(--metric-recovery)',
  heartbeat: 'var(--bionis-blue)',
  nurse: 'var(--metric-recovery)',
}

export function KeyMetricCard({
  metric,
  className,
}: {
  metric: KeyMetric
  className?: string
}) {
  const Icon = metricIcons[metric.icon]
  const isUp = metric.trend.direction === 'up'

  return (
    <article
      className={cn(
        'flex min-h-37.5 min-w-0 flex-col justify-between rounded-2xl border p-4',
        className,
      )}
    >
      <div className="flex items-center justify-between gap-2">
        <div className="flex min-w-0 items-center gap-2">
          <span
            className="flex size-7 shrink-0 items-center justify-center rounded-md text-white"
            style={{ backgroundColor: metricIconBgMap[metric.icon] }}
          >
            <Icon className="size-3.5" />
          </span>
          <p className="truncate text-sm font-medium tracking-tight">
            {metric.label}
          </p>
        </div>
        <DropdownMenu>
          <DropdownMenuTrigger asChild>
            <Button
              type="button"
              variant="outline"
              size="icon-sm"
              className="shrink-0 border-border/50"
              aria-label={`More about ${metric.label}`}
            >
              <MoreVerticalIcon className="size-4" />
            </Button>
          </DropdownMenuTrigger>
          <DropdownMenuContent
            align="end"
            className="bionis-dashboard min-w-max"
          >
            <DropdownMenuItem>
              View details
            </DropdownMenuItem>
            <DropdownMenuItem>
              View trend
            </DropdownMenuItem>
            <DropdownMenuItem>
              Compare periods
            </DropdownMenuItem>
          </DropdownMenuContent>
        </DropdownMenu>
      </div>

      <div className="flex flex-col gap-3">
        <p className="leading-none">
          <span className="text-2.5xl font-medium">{metric.value}</span>{' '}
          <span className="font-normal">{metric.unit}</span>
        </p>
        <div className="flex items-center gap-2">
          <TrendUpIcon
            className={cn(
              isUp ? 'text-(--trend)' : 'rotate-180 text-destructive',
            )}
          />
          <p className="text-xs">
            <span className="font-medium">{metric.trend.emphasis}</span>{' '}
            <span className="text-muted-foreground">{metric.trend.label}</span>
          </p>
        </div>
      </div>
    </article>
  )
}

type ScoreDonutProps = HTMLAttributes<HTMLDivElement> & {
  value: number
  max?: number
  label?: string
}

const CHART_ANIMATION_MS = 900
const AXIS_TICK = {
  fill: 'var(--muted-foreground)',
  fontSize: 10,
  fontFamily: 'Geist, sans-serif',
} as const

export function ScoreDonut({
  value,
  max = 100,
  label = 'Score',
  className,
  style,
  ...props
}: ScoreDonutProps) {
  const chartColor = 'var(--score)'
  const progress = Math.min(Math.max(value / max, 0), 1)

  const pieData = [
    { name: 'Score', value: progress },
    { name: 'Remaining', value: Math.max(1 - progress, 0) },
  ]

  return (
    <div
      className={cn('relative size-28.5 shrink-0', className)}
      style={style}
      {...props}
    >
      <ResponsiveContainer width="100%" height="100%">
        <PieChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>
          <Pie
            data={[{ value: 1 }]}
            cx="50%"
            cy="50%"
            innerRadius="90%"
            outerRadius="100%"
            startAngle={90}
            endAngle={-270}
            dataKey="value"
            stroke="none"
            isAnimationActive={false}
          >
            <Cell fill={chartColor} fillOpacity={0.05} />
          </Pie>
          <Pie
            data={[{ value: 1 }]}
            cx="50%"
            cy="50%"
            innerRadius="82%"
            outerRadius="90%"
            startAngle={90}
            endAngle={-270}
            dataKey="value"
            stroke="none"
            isAnimationActive={false}
          >
            <Cell fill={chartColor} fillOpacity={0.1} />
          </Pie>
          <Pie
            data={pieData}
            cx="50%"
            cy="50%"
            innerRadius="82%"
            outerRadius="90%"
            startAngle={90}
            endAngle={-270}
            dataKey="value"
            stroke="none"
            cornerRadius={10}
            isAnimationActive
            animationDuration={CHART_ANIMATION_MS}
            animationEasing="ease-out"
          >
            <Cell key="score" fill={chartColor} />
            <Cell key="remaining" fill="transparent" />
          </Pie>
        </PieChart>
      </ResponsiveContainer>
      <div className="absolute inset-0 flex flex-col items-center justify-center">
        <span className="text-xs leading-[1.4] text-muted-foreground">
          {label}
        </span>
        <span className="text-2.5xl font-medium leading-[1.4] tabular-nums">
          {value}
        </span>
      </div>
    </div>
  )
}

type ChartTooltipItemProps = {
  label: string
  value: ReactNode
  color?: string
}

function ChartTooltipItem({
  label,
  value,
  color = 'var(--foreground)',
}: ChartTooltipItemProps) {
  return (
    <div className="flex items-center justify-between gap-3 rounded-md border border-border/40 bg-background px-2 py-1.5">
      <div className="flex items-center gap-1.5 min-w-0">
        <span
          className="size-1.5 rounded-xs shrink-0"
          style={{ backgroundColor: color }}
        />
        <span className="truncate text-xxs font-medium text-foreground">
          {label}
        </span>
      </div>
      <span className="text-xxs font-medium text-foreground shrink-0">
        {value}
      </span>
    </div>
  )
}

type ChartTooltipFrameProps = {
  title?: ReactNode
  icon?: ComponentType<SVGProps<SVGSVGElement>>
  children: ReactNode
}

function ChartTooltipFrame({
  title,
  icon: Icon,
  children,
}: ChartTooltipFrameProps) {
  return (
    <div className="bionis-dashboard flex min-w-36 flex-col gap-1 rounded-lg border bg-(--chart-tooltip-bg)! p-1.5 text-xs shadow-md">
      {title ? (
        <div className="flex items-center gap-1.5 px-2 py-1 text-muted-foreground">
          {Icon ? (
            <Icon className="size-3 text-muted-foreground shrink-0" />
          ) : null}
          <span className="text-xxs font-normal text-muted-foreground">
            {title}
          </span>
        </div>
      ) : null}
      {children}
    </div>
  )
}

export type ChartTooltipItemConfig = {
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  label: string | ((point?: any) => string)
  dataKey: string
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  formatValue?: (value: any, point?: any) => ReactNode
  color?: string
}

export type ChartTooltipProps = {
  active?: boolean
  payload?: Array<{
    name?: string
    dataKey?: string | number
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    value?: any
    color?: string
    fill?: string
    stroke?: string
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    payload?: Record<string, any>
  }>
  label?: ReactNode
  icon?: ComponentType<SVGProps<SVGSVGElement>>
  items?: ChartTooltipItemConfig[]
}

export function ChartTooltip({
  active,
  payload,
  label,
  icon,
  items,
}: ChartTooltipProps) {
  if (!active || !payload?.length) return null
  const point = payload[0]?.payload
  const titleText = point?.fullDate ?? point?.label ?? label ?? '—'

  if (items && items.length > 0) {
    return (
      <ChartTooltipFrame title={titleText} icon={icon}>
        {items.map((item) => {
          const val =
            point?.[item.dataKey] ??
            payload.find((p) => p.dataKey === item.dataKey)?.value
          const displayLabel =
            typeof item.label === 'function' ? item.label(point) : item.label
          const displayVal = item.formatValue
            ? item.formatValue(val, point)
            : (val ?? '—')

          return (
            <ChartTooltipItem
              key={item.dataKey}
              label={displayLabel}
              value={displayVal}
              color={item.color}
            />
          )
        })}
      </ChartTooltipFrame>
    )
  }

  return (
    <ChartTooltipFrame title={titleText} icon={icon}>
      {payload.map((p, idx) => (
        <ChartTooltipItem
          key={String(p.dataKey ?? idx)}
          label={String(p.name ?? p.dataKey ?? '')}
          value={String(p.value ?? '—')}
          color={p.color ?? p.fill ?? p.stroke}
        />
      ))}
    </ChartTooltipFrame>
  )
}

type SleepBarShapeProps = {
  x?: number
  y?: number
  width?: number
  height?: number
  active?: boolean
}

function SleepBarShape({
  x = 0,
  y = 0,
  width = 0,
  height = 0,
  active = false,
}: SleepBarShapeProps) {
  if (height <= 0) return null
  const cap = 3
  const bodyHeight = Math.max(height - cap, 0)

  return (
    <g>
      {active ? (
        <rect
          x={x - 1}
          y={y - 1}
          width={width + 2}
          height={height + 1}
          rx={2}
          fill="var(--chart-sleep)"
          opacity={0.12}
        />
      ) : null}
      <rect
        x={x}
        y={y + cap}
        width={width}
        height={bodyHeight}
        fill={active ? 'var(--chart-sleep)' : 'var(--chart-sleep-fill)'}
        opacity={active ? 0.28 : 1}
      />
      <rect
        x={x}
        y={y}
        width={width}
        height={cap}
        fill="var(--chart-sleep)"
      />
    </g>
  )
}

function SleepAxisTick({
  x,
  y,
  index,
  data,
}: {
  x?: number | string
  y?: number | string
  index?: number
  data: SleepBreakdownPoint[]
}) {
  const point = typeof index === 'number' ? data[index] : undefined
  if (!point || x == null || y == null) return null

  const tickX = typeof x === 'number' ? x : Number(x)
  const tickY = typeof y === 'number' ? y : Number(y)
  if (Number.isNaN(tickX) || Number.isNaN(tickY)) return null

  const lines = point.labelLines
  const lineHeight = 12

  return (
    <text
      x={tickX}
      y={tickY + 8}
      textAnchor="middle"
      fill="var(--muted-foreground)"
      fontSize={10}
      fontFamily="Geist, sans-serif"
    >
      {lines.map((line, lineIndex) => (
        <tspan
          key={`${point.label}-${lineIndex}`}
          x={tickX}
          dy={lineIndex === 0 ? 0 : lineHeight}
        >
          {line}
        </tspan>
      ))}
    </text>
  )
}

export function SleepBreakdownChart({
  data,
  flaggedNights,
  className,
}: {
  data: SleepBreakdownPoint[]
  flaggedNights: number
  className?: string
}) {
  return (
    <article
      className={cn(
        'flex min-h-106.5 flex-col gap-8 rounded-2xl border bg-background p-4',
        className,
      )}
    >
      <div className="flex flex-wrap items-center justify-between gap-x-3 gap-y-2">
        <div className="flex items-center gap-3">
          <span
            className="flex size-8 shrink-0 items-center justify-center rounded-lg text-white"
            style={{ backgroundColor: CHART_THEME_COLORS.prediction }}
          >
            <MoonStarsIcon className="size-4.5" />
          </span>
          <h3 className="text-lg font-medium">Sleep breakdown</h3>
        </div>
        {flaggedNights > 0 ? (
          <span className="h-8 inline-flex shrink-0 items-center gap-2 rounded-xl bg-(--chart-warn-bg) py-1 pr-4 pl-3 text-sm font-medium text-(--chart-warn)">
            <WarningFilledIcon className="size-5" />
            {flaggedNights} {flaggedNights === 1 ? 'night' : 'nights'} flagged
          </span>
        ) : null}
      </div>

      <div className="h-82.5 w-full min-w-0">
        <ResponsiveContainer width="100%" height="100%">
          <BarChart
            data={data}
            margin={{ top: 8, right: 8, left: 0, bottom: 18 }}
            barCategoryGap="18%"
          >
            <CartesianGrid
              vertical={false}
              stroke="var(--chart-grid)"
              strokeDasharray="4 4"
            />
            <XAxis
              dataKey="label"
              axisLine={false}
              tickLine={false}
              interval={0}
              tick={(props) => <SleepAxisTick {...props} data={data} />}
              height={36}
            />
            <YAxis
              domain={[0, 10]}
              ticks={[0, 2, 4, 6, 8, 10]}
              tickFormatter={(value: number) => `${value}h`}
              axisLine={false}
              tickLine={false}
              tick={AXIS_TICK}
              width={36}
            />
            <Tooltip
              cursor={false}
              content={
                <ChartTooltip
                  items={[
                    {
                      label: (point) =>
                        typeof point?.label === 'string' && point.label.includes('–')
                          ? 'Avg sleep'
                          : 'Sleep',
                      dataKey: 'hours',
                      formatValue: (v) => (typeof v === 'number' ? `${v}h` : '—'),
                      color: CHART_THEME_COLORS.sleep,
                    },
                  ]}
                />
              }
            />
            <Bar
              dataKey="hours"
              shape={<SleepBarShape />}
              activeBar={<SleepBarShape active />}
              isAnimationActive
              animationDuration={CHART_ANIMATION_MS}
              animationEasing="ease-out"
            />
          </BarChart>
        </ResponsiveContainer>
      </div>
    </article>
  )
}

function ActivityAxisTick({
  x,
  y,
  index,
  data,
}: {
  x?: number | string
  y?: number | string
  index?: number
  data: ActivityTrendPoint[]
}) {
  const point = typeof index === 'number' ? data[index] : undefined
  if (!point?.showTick || x == null || y == null) return null

  const tickX = typeof x === 'number' ? x : Number(x)
  const tickY = typeof y === 'number' ? y : Number(y)
  if (Number.isNaN(tickX) || Number.isNaN(tickY)) return null

  return (
    <text
      x={tickX}
      y={tickY + 10}
      textAnchor="middle"
      fill="var(--muted-foreground)"
      fontSize={10}
      fontFamily="Geist, sans-serif"
    >
      {point.label}
    </text>
  )
}

export function ActivityTrendChart({
  data,
  periodLabel,
  className,
}: {
  data: ActivityTrendPoint[]
  periodLabel: string
  className?: string
}) {
  const reactId = useId().replace(/:/g, '')
  const stepsGradientId = `steps-fill-${reactId}`
  const recoveryGradientId = `recovery-fill-${reactId}`

  return (
    <article
      className={cn(
        'flex min-h-106.5 flex-col gap-4 rounded-2xl border bg-background p-4',
        className,
      )}
    >
      <div className="flex flex-wrap items-center justify-between gap-x-3 gap-y-2">
        <div className="flex items-center gap-3">
          <span className="flex size-8 shrink-0 items-center justify-center rounded-lg bg-(--chart-sleep) text-white">
            <HeartbeatIcon className="size-4.5" />
          </span>
          <h3 className="text-lg font-medium">Activity & HRV trend</h3>
        </div>
        <span className="h-8 inline-flex shrink-0 items-center rounded-xl bg-(--chart-period-bg) px-3 py-1 text-sm font-medium text-(--chart-period)">
          {periodLabel}
        </span>
      </div>

      <div className="flex flex-wrap items-center justify-center gap-3.5 sm:justify-end">
        <div className="flex items-center gap-2 text-sm font-medium text-(--chart-axis)">
          <span className="size-2 rounded-full bg-(--chart-steps)" />
          Steps (÷1000)
        </div>
        <div className="flex items-center gap-2 text-sm font-medium text-(--chart-axis)">
          <span className="size-2 rounded-full bg-(--chart-recovery)" />
          Recovery score (÷10)
        </div>
      </div>

      <div className="h-75 w-full min-w-0">
        <ResponsiveContainer width="100%" height="100%">
          <AreaChart
            data={data}
            margin={{ top: 8, right: 12, left: 0, bottom: 0 }}
          >
            <defs>
              <linearGradient id={stepsGradientId} x1="0" y1="0" x2="0" y2="1">
                <stop
                  offset="0%"
                  stopColor="var(--chart-steps)"
                  stopOpacity={0.88}
                />
                <stop
                  offset="50%"
                  stopColor="var(--chart-steps)"
                  stopOpacity={0}
                />
              </linearGradient>
              <linearGradient
                id={recoveryGradientId}
                x1="0"
                y1="0"
                x2="0"
                y2="1"
              >
                <stop
                  offset="0%"
                  stopColor="var(--chart-recovery)"
                  stopOpacity={0.88}
                />
                <stop
                  offset="50%"
                  stopColor="var(--chart-recovery)"
                  stopOpacity={0}
                />
              </linearGradient>
            </defs>
            <CartesianGrid
              vertical={false}
              stroke="var(--chart-grid)"
              strokeDasharray="4 4"
            />
            <XAxis
              dataKey="dateKey"
              axisLine={false}
              tickLine={false}
              interval={0}
              minTickGap={0}
              tick={(props) => <ActivityAxisTick {...props} data={data} />}
            />
            <YAxis
              domain={[0, 100]}
              ticks={[0, 20, 40, 60, 80, 100]}
              axisLine={false}
              tickLine={false}
              tick={AXIS_TICK}
              width={36}
            />
            <Tooltip
              cursor={{
                stroke: 'var(--foreground)',
                strokeWidth: 1,
                strokeDasharray: '4 4',
                strokeOpacity: 0.35,
              }}
              content={
                <ChartTooltip
                  icon={CalendarIcon}
                  items={[
                    {
                      label: 'Steps',
                      dataKey: 'steps',
                      formatValue: (v) =>
                        typeof v === 'number'
                          ? `${(Math.round(v * 10) / 10).toFixed(1)}k`
                          : '—',
                      color: CHART_THEME_COLORS.recovery,
                    },
                    {
                      label: 'Recovery',
                      dataKey: 'recovery',
                      formatValue: (v) =>
                        typeof v === 'number' ? Math.round(v * 10) : '—',
                      color: CHART_THEME_COLORS.sleep,
                    },
                  ]}
                />
              }
            />
            <Area
              type="monotone"
              dataKey="steps"
              stroke="var(--chart-steps)"
              strokeWidth={2}
              fill={`url(#${stepsGradientId})`}
              isAnimationActive
              animationDuration={CHART_ANIMATION_MS}
              animationEasing="ease-out"
              dot={false}
              activeDot={{ r: 4 }}
            />
            <Area
              type="monotone"
              dataKey="recovery"
              stroke="var(--chart-recovery)"
              strokeWidth={2}
              fill={`url(#${recoveryGradientId})`}
              isAnimationActive
              animationDuration={CHART_ANIMATION_MS}
              animationEasing="ease-out"
              dot={false}
              activeDot={{ r: 4 }}
            />
          </AreaChart>
        </ResponsiveContainer>
      </div>
    </article>
  )
}

function SleepRecoveryAxisTick({
  x,
  y,
  index,
  data,
}: {
  x?: number | string
  y?: number | string
  index?: number
  data: SleepRecoveryTrendPoint[]
}) {
  const point = typeof index === 'number' ? data[index] : undefined
  if (!point?.showTick || x == null || y == null) return null

  const tickX = typeof x === 'number' ? x : Number(x)
  const tickY = typeof y === 'number' ? y : Number(y)
  if (Number.isNaN(tickX) || Number.isNaN(tickY)) return null

  return (
    <text
      x={tickX}
      y={tickY + 10}
      textAnchor="middle"
      fill="var(--muted-foreground)"
      fontSize={10}
      fontFamily="Geist, sans-serif"
    >
      {point.formattedDate}
    </text>
  )
}

export function SleepRecoveryTrendChart({
  data,
  className,
}: {
  data: SleepRecoveryTrendPoint[]
  className?: string
}) {
  const reactId = useId().replace(/:/g, '')
  const sleepGradientId = `sleep-trend-fill-${reactId}`

  return (
    <article
      className={cn(
        'flex min-h-110 flex-col gap-5 rounded-2xl border bg-background p-4 md:p-6',
        className,
      )}
    >
      <div className="flex flex-wrap items-center justify-between gap-x-3 gap-y-2">
        <div className="flex items-center gap-3">
          <span
            className="flex size-8 shrink-0 items-center justify-center rounded-lg text-white"
            style={{ backgroundColor: CHART_THEME_COLORS.prediction }}
          >
            <MoonStarsIcon className="size-4.5" />
          </span>
          <h3 className="text-lg font-medium tracking-tight">
            Sleep & recovery over time
          </h3>
        </div>
        <span className="h-8 inline-flex shrink-0 items-center rounded-xl bg-(--live)/10 px-3 py-1 text-sm font-medium text-(--live)">
          Improving
        </span>
      </div>

      <div className="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
        <p className="text-sm text-muted-foreground">
          Nightly hours and recovery score for the last 30 days
        </p>
        <div className="flex flex-wrap items-center gap-4 text-sm font-medium text-muted-foreground">
          <div className="flex items-center gap-2">
            <span
              className="size-2 rounded-full"
              style={{ backgroundColor: CHART_THEME_COLORS.recovery }}
            />
            <span>Sleep (hrs)</span>
          </div>
          <div className="flex items-center gap-2">
            <span
              className="size-2 rounded-full"
              style={{ backgroundColor: CHART_THEME_COLORS.sleep }}
            />
            <span>Recovery score</span>
          </div>
        </div>
      </div>

      <div className="h-80 w-full min-w-0 pt-2">
        <ResponsiveContainer width="100%" height="100%">
          <AreaChart
            data={data}
            margin={{ top: 8, right: 12, left: 0, bottom: 0 }}
          >
            <defs>
              <linearGradient id={sleepGradientId} x1="0" y1="0" x2="0" y2="1">
                <stop
                  offset="0%"
                  stopColor={CHART_THEME_COLORS.recovery}
                  stopOpacity={0.35}
                />
                <stop
                  offset="100%"
                  stopColor={CHART_THEME_COLORS.recovery}
                  stopOpacity={0.0}
                />
              </linearGradient>
            </defs>
            <CartesianGrid
              vertical={false}
              stroke="var(--chart-grid)"
              strokeDasharray="4 4"
            />
            <XAxis
              dataKey="dateKey"
              axisLine={false}
              tickLine={false}
              interval={0}
              minTickGap={0}
              tick={(props) => <SleepRecoveryAxisTick {...props} data={data} />}
            />
            <YAxis
              domain={[0, 100]}
              ticks={[0, 20, 40, 60, 80, 100]}
              axisLine={false}
              tickLine={false}
              tick={AXIS_TICK}
              width={36}
            />
            <Tooltip
              cursor={{
                stroke: 'var(--foreground)',
                strokeWidth: 1,
                strokeDasharray: '4 4',
                strokeOpacity: 0.35,
              }}
              content={
                <ChartTooltip
                  icon={CalendarIcon}
                  items={[
                    {
                      label: 'Sleep',
                      dataKey: 'sleepHrs',
                      formatValue: (v) => (typeof v === 'number' ? `${v}h` : '—'),
                      color: CHART_THEME_COLORS.recovery,
                    },
                    {
                      label: 'Recovery',
                      dataKey: 'recoveryScore',
                      formatValue: (v) => (typeof v === 'number' ? `${v}%` : '—'),
                      color: CHART_THEME_COLORS.sleep,
                    },
                  ]}
                />
              }
            />
            <Area
              type="monotone"
              dataKey="sleepPlot"
              stroke={CHART_THEME_COLORS.recovery}
              strokeWidth={2.5}
              fill={`url(#${sleepGradientId})`}
              isAnimationActive
              animationDuration={CHART_ANIMATION_MS}
              animationEasing="ease-out"
              dot={false}
              activeDot={{
                r: 4,
                fill: CHART_THEME_COLORS.recovery,
                stroke: 'var(--background)',
                strokeWidth: 2,
              }}
            />
            <Area
              type="monotone"
              dataKey="recoveryPlot"
              stroke={CHART_THEME_COLORS.sleep}
              strokeWidth={1.5}
              strokeDasharray="14 10"
              fill="none"
              isAnimationActive
              animationDuration={CHART_ANIMATION_MS}
              animationEasing="ease-out"
              dot={false}
              activeDot={{
                r: 4,
                fill: CHART_THEME_COLORS.sleep,
                stroke: 'var(--background)',
                strokeWidth: 2,
              }}
            />
          </AreaChart>
        </ResponsiveContainer>
      </div>
    </article>
  )
}

const factorIcons: Record<
  'moon' | 'walk' | 'warning' | 'alert' | 'bed',
  ComponentType<SVGProps<SVGSVGElement>>
> = {
  moon: MoonStarsIcon,
  walk: WalkIcon,
  warning: AlertTriangleIcon,
  alert: AlertDiamondIcon,
  bed: BedIcon,
}

const factorColorMap: Record<string, string> = {
  sleep: 'var(--metric-vital)',
  steps: 'var(--bionis-blue)',
  stress: 'var(--prediction-warn)',
  screen: 'var(--prediction-danger)',
  bedtime: 'var(--vital-good)',
}

export function RecoveryFactorsCard({
  factors = recoveryFactors,
  className,
}: {
  factors?: RecoveryFactor[]
  className?: string
}) {
  const [mounted, setMounted] = useState(false)

  useEffect(() => {
    const frame = requestAnimationFrame(() => setMounted(true))
    return () => cancelAnimationFrame(frame)
  }, [])

  return (
    <article
      className={cn(
        'flex min-h-90 flex-1 flex-col justify-between rounded-2xl border p-4 md:p-5',
        className,
      )}
      style={{
        background: `linear-gradient(180deg, color-mix(in srgb, ${CHART_THEME_COLORS.actions} 12%, transparent) 0%, transparent 42%)`,
      }}
    >
      <div className="flex items-center justify-between gap-2 mb-4">
        <div className="flex items-center gap-2">
          <span
            className="flex size-7 items-center justify-center rounded-lg text-white shadow-2xs"
            style={{ backgroundColor: CHART_THEME_COLORS.actions }}
          >
            <BlingFilledIcon className="size-4" />
          </span>
          <h3 className="font-medium tracking-tight">
            Recovery factors
          </h3>
        </div>
        <span
          className="inline-flex shrink-0 items-center rounded-xl bg-background px-2.5 py-2 text-xs font-medium dark:bg-card"
          style={{ color: CHART_THEME_COLORS.outlook }}
        >
          7 days outlook
        </span>
      </div>

      <div className="flex flex-col gap-3">
        {factors.map((factor, idx) => {
          const Icon = factorIcons[factor.icon]
          const factorColor = factorColorMap[factor.id] || 'var(--bionis-blue)'
          return (
            <div
              key={factor.id}
              className="flex items-center justify-between gap-3 rounded-xl bg-muted/50 p-3"
            >
              <div className="flex items-center gap-2.5 min-w-0 flex-1">
                <Icon
                  className="size-5 shrink-0"
                  style={{ color: factorColor }}
                />
                <span className="truncate font-medium tracking-tight">
                  {factor.label}
                </span>
              </div>

              <div className="flex items-center gap-2 shrink-0 w-48 sm:w-52 justify-end">
                <div className="relative h-4 w-32 sm:w-36 rounded-lg bg-muted overflow-hidden">
                  <div
                    className="h-full rounded-lg transition-all duration-700 ease-out"
                    style={{
                      width: mounted ? `${factor.fillPercentage}%` : '0%',
                      transitionDelay: `${idx * 100}ms`,
                      backgroundColor: factorColor,
                    }}
                  />
                </div>
                <span className="w-11 text-right font-medium tracking-tight">
                  {factor.value}
                </span>
              </div>
            </div>
          )
        })}
      </div>
    </article>
  )
}

const tileDotColorMap: Record<HeatmapTile, string> = {
  low: CHART_THEME_COLORS.heatmap.low,
  med: CHART_THEME_COLORS.heatmap.med,
  high: CHART_THEME_COLORS.heatmap.high,
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
function HeatmapScatterTooltip({ active, payload }: any) {
  if (!active || !payload?.length) return null
  const tile = payload[0]?.payload
  if (!tile) return null

  return (
    <ChartTooltipFrame title={tile.date} icon={CalendarIcon}>
      <ChartTooltipItem
        label={tile.status}
        value={`${tile.score}%`}
        color={tileDotColorMap[tile.level as HeatmapTile]}
      />
    </ChartTooltipFrame>
  )
}

export function RecoveryHeatmapCard({
  data = recoveryHeatmapData,
  dateLabels = heatmapDateLabels,
  className,
}: {
  data?: HeatmapColumn[]
  dateLabels?: string[]
  className?: string
}) {
  const scatterData = useMemo(() => {
    const points: Array<{
      x: number
      y: number
      id: string
      level: HeatmapTile
      score: number
      date: string
      status: string
    }> = []

    data.forEach((col, colIdx) => {
      col.tiles.forEach((tile, rowIdx) => {
        points.push({
          x: colIdx,
          y: 4 - rowIdx,
          id: tile.id,
          level: tile.level,
          score: tile.score,
          date: tile.date,
          status: tile.status,
        })
      })
    })
    return points
  }, [data])

  return (
    <article
      className={cn(
        'flex min-h-90 flex-1 flex-col justify-between rounded-2xl border p-4 md:p-5',
        className,
      )}
      style={{
        background: `linear-gradient(180deg, color-mix(in srgb, ${CHART_THEME_COLORS.heatmap.med} 12%, transparent) 0%, transparent 42%)`,
      }}
    >
      <div className="flex items-center justify-between gap-2 mb-3">
        <div className="flex items-center gap-2">
          <span
            className="flex size-7 items-center justify-center rounded-lg text-white shadow-2xs"
            style={{ backgroundColor: CHART_THEME_COLORS.heatmap.med }}
          >
            <BatteryChargingIcon className="size-4" />
          </span>
          <h3 className="font-medium tracking-tight">
            Recovery heatmap
          </h3>
        </div>

        <div className="flex items-center gap-3 text-sm font-medium text-muted-foreground">
          <span>Low</span>
          <div className="flex items-center gap-0.5">
            <span
              className="size-3 rounded-xs"
              style={{ backgroundColor: CHART_THEME_COLORS.heatmap.low }}
            />
            <span
              className="size-3 rounded-xs"
              style={{ backgroundColor: CHART_THEME_COLORS.heatmap.med }}
            />
            <span
              className="size-3 rounded-xs"
              style={{ backgroundColor: CHART_THEME_COLORS.heatmap.high }}
            />
          </div>
          <span>High</span>
        </div>
      </div>

      <div className="h-64 w-full min-w-0">
        <ResponsiveContainer width="100%" height="100%">
          <ScatterChart margin={{ top: 8, right: 8, left: 8, bottom: 12 }}>
            <XAxis
              type="number"
              dataKey="x"
              domain={[-0.5, 6.5]}
              ticks={[0, 2, 4, 6]}
              tickFormatter={(val: number) =>
                dateLabels[Math.round(val / 2)] || ''
              }
              axisLine={false}
              tickLine={false}
              tick={AXIS_TICK}
            />
            <YAxis
              type="number"
              dataKey="y"
              domain={[-0.5, 4.5]}
              hide
            />
            <Tooltip cursor={false} content={<HeatmapScatterTooltip />} />
            <Scatter
              data={scatterData}
              // eslint-disable-next-line @typescript-eslint/no-explicit-any
              shape={(props: any) => {
                const { xAxis, yAxis, cx, cy, payload } = props
                if (typeof cx !== 'number' || typeof cy !== 'number') return <g />
                const colW = (xAxis?.width ?? 0) / 7
                const rowH = (yAxis?.height ?? 0) / 5
                const w = Math.max(colW - 6, 8)
                const h = Math.max(rowH - 4, 8)

                return (
                  <rect
                    x={cx - w / 2}
                    y={cy - h / 2}
                    width={w}
                    height={h}
                    rx={6}
                    className="transition-opacity duration-200 hover:opacity-75 cursor-pointer"
                    fill={tileDotColorMap[payload.level as HeatmapTile]}
                  />
                )
              }}
              isAnimationActive
              animationDuration={CHART_ANIMATION_MS}
            />
          </ScatterChart>
        </ResponsiveContainer>
      </div>
    </article>
  )
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/sidebar.tsx`

```tsx
import { useState } from 'react'
import {
  BookOpenIcon,
  CreditCardIcon,
  LogOutIcon,
  MessageCircleIcon,
  SettingsIcon,
  UserIcon as LucideUserIcon,
} from 'lucide-react'
import {
  ArrowRightIcon,
  CloseIcon,
  QuestionIcon,
  SidebarCollapseIcon,
  ToggleIcon,
  UserIcon,
} from './icons'
import { BionisLogo } from './logo'
import { DashboardLink, useDashboardNavigation } from './navigation'
import { useTheme } from './theme-provider'
import { Button } from '@/components/ui/button'
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import {
  Sidebar,
  SidebarContent,
  SidebarFooter,
  SidebarGroup,
  SidebarGroupContent,
  SidebarGroupLabel,
  SidebarHeader,
  SidebarMenu,
  SidebarMenuBadge,
  SidebarMenuButton,
  SidebarMenuItem,
  useSidebar,
} from '@/components/ui/sidebar'
import { currentUser, navigationGroups, type NavigationItem } from '../../data'
import { cn } from '@/lib/utils'

const menuButtonClassName = cn(
  'h-12 gap-2.5 rounded-xl border border-transparent px-3 text-base tracking-tight text-muted-foreground transition-colors',
  'aria-[current=page]:border-border aria-[current=page]:bg-background aria-[current=page]:font-medium aria-[current=page]:text-sidebar-accent-foreground aria-[current=page]:shadow-[1px_2px_12px_rgba(158,158,158,0.08)]',
  'dark:aria-[current=page]:border-transparent dark:aria-[current=page]:bg-sidebar-accent dark:aria-[current=page]:shadow-[1px_2px_12px_rgba(0,0,0,0.25)]',
  'hover:bg-sidebar-accent data-open:bg-background data-open:text-sidebar-accent-foreground dark:data-open:bg-sidebar-accent',
  '[&_svg]:size-5!',
  'group-data-[collapsible=icon]:size-11! group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0! group-data-[collapsible=icon]:[&>span]:hidden',
)

function NavItem({ item }: { item: NavigationItem }) {
  const { isMobile, setOpenMobile } = useSidebar()
  const { pathname } = useDashboardNavigation()
  const isActive =
    item.href === '/'
      ? pathname === item.href
      : pathname === item.href || pathname.startsWith(`${item.href}/`)

  return (
    <SidebarMenuButton
      asChild
      isActive={isActive}
      tooltip={item.name}
      className={menuButtonClassName}
    >
      <DashboardLink
        href={item.href}
        aria-current={isActive ? 'page' : undefined}
        onClick={() => {
          if (isMobile) setOpenMobile(false)
        }}
      >
        <item.icon />
        <span>{item.name}</span>
        {item.badge ? (
          <SidebarMenuBadge className="sidebar-badge-shadow static ml-auto rounded bg-background px-2 py-1.5 text-sm text-muted-foreground group-aria-[current=page]/menu-button:font-medium group-aria-[current=page]/menu-button:text-sidebar-accent-foreground">
            {item.badge}
          </SidebarMenuBadge>
        ) : null}
      </DashboardLink>
    </SidebarMenuButton>
  )
}

function HelpItem() {
  return (
    <SidebarMenuItem>
      <DropdownMenu>
        <DropdownMenuTrigger asChild>
          <SidebarMenuButton className={menuButtonClassName}>
            <QuestionIcon />
            <span>Help</span>
          </SidebarMenuButton>
        </DropdownMenuTrigger>
        <DropdownMenuContent
          side="top"
          align="start"
          className="bionis-dashboard w-56"
        >
          <DropdownMenuLabel className="font-normal">
            <p className="text-sm font-medium text-foreground">Need help?</p>
            <p>Guides, docs, and support for Bionis.</p>
          </DropdownMenuLabel>
          <DropdownMenuSeparator />
          <DropdownMenuGroup>
            <DropdownMenuItem asChild>
              <a href="https://docs.bionis.com" target="_blank" rel="noreferrer">
                <BookOpenIcon />
                Documentation
              </a>
            </DropdownMenuItem>
            <DropdownMenuItem asChild>
              <a
                href="https://bionis.com/support"
                target="_blank"
                rel="noreferrer"
              >
                <MessageCircleIcon />
                Contact support
              </a>
            </DropdownMenuItem>
          </DropdownMenuGroup>
        </DropdownMenuContent>
      </DropdownMenu>
    </SidebarMenuItem>
  )
}

function DarkModeItem() {
  const { resolvedTheme, setTheme } = useTheme()
  const isDark = resolvedTheme === 'dark'
  const label = isDark ? 'Light Mode' : 'Dark Mode'

  return (
    <SidebarMenuItem>
      <SidebarMenuButton
        tooltip={label}
        className={menuButtonClassName}
        onClick={() => setTheme(isDark ? 'light' : 'dark')}
      >
        <ToggleIcon pressed={isDark} />
        <span>{label}</span>
      </SidebarMenuButton>
    </SidebarMenuItem>
  )
}

function ProfileItem() {
  return (
    <SidebarMenuItem>
      <DropdownMenu>
        <DropdownMenuTrigger asChild>
          <SidebarMenuButton tooltip="Profile" className={menuButtonClassName}>
            <UserIcon />
            <span>Profile</span>
          </SidebarMenuButton>
        </DropdownMenuTrigger>
        <DropdownMenuContent
          side="top"
          align="start"
          className="bionis-dashboard w-56"
        >
          <DropdownMenuLabel className="font-normal">
            <div className="leading-tight">
              <p className="text-sm font-medium text-foreground">
                {currentUser.name}
              </p>
              <p>{currentUser.email}</p>
            </div>
          </DropdownMenuLabel>
          <DropdownMenuSeparator />
          <DropdownMenuGroup>
            <DropdownMenuItem>
              <LucideUserIcon />
              Account
            </DropdownMenuItem>
            <DropdownMenuItem>
              <SettingsIcon />
              Preferences
            </DropdownMenuItem>
            <DropdownMenuItem>
              <CreditCardIcon />
              Billing
            </DropdownMenuItem>
          </DropdownMenuGroup>
          <DropdownMenuSeparator />
          <DropdownMenuItem variant="destructive">
            <LogOutIcon />
            Log out
          </DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>
    </SidebarMenuItem>
  )
}

function CollapseControl({
  collapsed,
  onToggle,
}: {
  collapsed: boolean
  onToggle: () => void
}) {
  if (!collapsed) {
    return (
      <button
        type="button"
        onClick={onToggle}
        className="flex size-9.5 shrink-0 items-center justify-center rounded-lg hover:bg-sidebar-accent transition-colors"
        aria-label="Collapse sidebar"
      >
        <SidebarCollapseIcon className="-rotate-90" />
      </button>
    )
  }

  return (
    <div className="relative size-11 shrink-0">
      <div className="pointer-events-none absolute inset-0 flex items-center justify-center transition-all ease-linear group-hover:scale-75 group-hover:opacity-0">
        <BionisLogo className="size-6" />
      </div>
      <div className="pointer-events-none absolute inset-0 flex scale-75 items-center justify-center opacity-0 transition-all ease-linear group-hover:pointer-events-auto group-hover:scale-100 group-hover:opacity-100">
        <button
          type="button"
          onClick={onToggle}
          className="flex size-11 items-center justify-center rounded-lg hover:bg-sidebar-accent transition-colors"
          aria-label="Expand sidebar"
        >
          <SidebarCollapseIcon className="rotate-90" />
        </button>
      </div>
    </div>
  )
}

function HealthCoachCard() {
  const [open, setOpen] = useState(true)

  if (!open) return null

  return (
    <div
      className={cn(
        'relative flex flex-col gap-8 rounded-2xl border p-4',
        'bg-[linear-gradient(347deg,var(--promo-gradient-from)_47.58%,var(--promo-gradient-to)_306.43%)]',
        'group-data-[collapsible=icon]:hidden',
      )}
    >
      <div className="flex items-start justify-between gap-2">
        <span className="rounded-xl bg-primary px-2.5 py-1.5 text-xs font-medium tracking-tight text-primary-foreground">
          New
        </span>
        <button
          type="button"
          onClick={() => setOpen(false)}
          className="flex size-6 shrink-0 items-center justify-center rounded -md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
          aria-label="Dismiss AI Health Coach"
        >
          <CloseIcon className="size-4" />
        </button>
      </div>

      <div className="flex flex-col gap-4">
        <div className="flex flex-col gap-1.5">
          <p className="font-semibold tracking-tight">
            AI Health Coach
          </p>
          <p className="text-sm tracking-tight text-muted-foreground">
            Get personalised tips based on your data
          </p>
        </div>

        <Button
          type="button"
          className="h-11 w-full gap-1 rounded-xl pr-2 pl-3 text-sm tracking-tight"
        >
          Try Now
          <ArrowRightIcon className="size-5" />
        </Button>
      </div>
    </div>
  )
}

export function DashboardSidebar() {
  const { state, toggleSidebar } = useSidebar()
  const collapsed = state === 'collapsed'

  return (
    <Sidebar collapsible="icon" className="h-full border-none">
      <SidebarHeader
        className={cn(
          'h-16 flex-row items-center border-b border-sidebar-border transition-[padding] md:h-20',
          collapsed ? 'justify-start px-3' : 'justify-between gap-4.75 px-4',
        )}
      >
        {!collapsed && (
          <div className="flex min-w-0 flex-1 items-center gap-2">
            <BionisLogo className="size-5.5 shrink-0" />
            <span className="truncate text-xl font-semibold tracking-tight">
              Bionis
            </span>
          </div>
        )}
        <CollapseControl collapsed={collapsed} onToggle={toggleSidebar} />
      </SidebarHeader>

      <SidebarContent className="gap-4 overflow-x-hidden overflow-y-auto px-3 py-4 group-data-[collapsible=icon]:overflow-y-auto!">
        {navigationGroups.map((group) => (
          <SidebarGroup key={group.label} className="gap-2 p-0">
            <SidebarGroupLabel className="h-auto px-3 py-1 text-base font-normal tracking-tight text-muted-foreground">
              {group.label}
            </SidebarGroupLabel>
            <SidebarGroupContent>
              <SidebarMenu className="gap-2">
                {group.items.map((item) => (
                  <SidebarMenuItem key={item.name}>
                    <NavItem item={item} />
                  </SidebarMenuItem>
                ))}
              </SidebarMenu>
            </SidebarGroupContent>
          </SidebarGroup>
        ))}
      </SidebarContent>

      <SidebarFooter className="gap-6 border-t border-sidebar-border px-3 py-3">
        <HealthCoachCard />
        <SidebarMenu className="gap-2">
          <HelpItem />
          <DarkModeItem />
          <ProfileItem />
        </SidebarMenu>
      </SidebarFooter>
    </Sidebar>
  )
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/theme-provider.tsx`

```tsx
import {
  createContext,
  useCallback,
  useContext,
  useEffect,
  useMemo,
  useState,
  type ReactNode,
} from 'react'

export type Theme = 'dark' | 'light' | 'system'

type ThemeProviderProps = {
  children: ReactNode
  defaultTheme?: Theme
  storageKey?: string
}

type ThemeProviderState = {
  theme: Theme
  resolvedTheme: 'dark' | 'light'
  setTheme: (theme: Theme) => void
  toggleTheme: () => void
}

const ThemeProviderContext = createContext<ThemeProviderState | null>(null)

function getSystemTheme(): 'dark' | 'light' {
  if (typeof window === 'undefined') return 'light'
  return window.matchMedia('(prefers-color-scheme: dark)').matches
    ? 'dark'
    : 'light'
}

export function ThemeProvider({
  children,
  defaultTheme = 'light',
  storageKey = 'bionis-theme',
}: ThemeProviderProps) {
  const [theme, setThemeState] = useState<Theme>(() => {
    if (typeof window === 'undefined') return defaultTheme
    const stored = localStorage.getItem(storageKey) as Theme | null
    return stored ?? defaultTheme
  })

  const resolvedTheme = useMemo(
    () => (theme === 'system' ? getSystemTheme() : theme),
    [theme],
  )

  useEffect(() => {
    if (typeof window === 'undefined') return
    const root = window.document.documentElement
    root.classList.remove('light', 'dark')
    root.classList.add(resolvedTheme)
  }, [resolvedTheme])

  const setTheme = useCallback(
    (next: Theme) => {
      if (typeof window !== 'undefined') {
        localStorage.setItem(storageKey, next)
      }
      setThemeState(next)
    },
    [storageKey],
  )

  const toggleTheme = useCallback(() => {
    const nextTheme = resolvedTheme === 'dark' ? 'light' : 'dark'
    setTheme(nextTheme)
  }, [resolvedTheme, setTheme])

  const value = useMemo(
    () => ({ theme, resolvedTheme, setTheme, toggleTheme }),
    [theme, resolvedTheme, setTheme, toggleTheme],
  )

  return (
    <ThemeProviderContext.Provider value={value}>
      {children}
    </ThemeProviderContext.Provider>
  )
}

export function useTheme() {
  const context = useContext(ThemeProviderContext)
  if (!context) {
    throw new Error('useTheme must be used within a ThemeProvider')
  }
  return context
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/topbar.tsx`

```tsx
import { useEffect, useRef, useState, type ComponentType, type SVGProps } from 'react'
import {
  ActivityIcon,
  AlertTriangleIcon,
  BatteryChargingIcon,
  BellIcon,
  CheckCircleRegularIcon,
  CloseIcon,
  HeartbeatFilledIcon,
  HeartbeatIcon,
  MoonStarsIcon,
  NurseFilledIcon,
  SearchIcon,
  WalkIcon,
} from './icons'
import { DashboardLink, useDashboardNavigation } from './navigation'
import { Button } from '@/components/ui/button'
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import {
  InputGroup,
  InputGroupAddon,
  InputGroupInput,
} from '@/components/ui/input-group'
import { SidebarTrigger } from '@/components/ui/sidebar'
import {
  currentUser,
  keyMetricsByTimeline,
  navigationGroups,
  notifications,
  profileHealthSummary,
  type KeyMetricIcon,
  type NotificationIcon,
  type NotificationTone,
} from '../../data'
import { cn } from '@/lib/utils'

const profileMetricIcons: Record<
  KeyMetricIcon,
  ComponentType<SVGProps<SVGSVGElement>>
> = {
  heart: HeartbeatIcon,
  walk: WalkIcon,
  moon: MoonStarsIcon,
  battery: BatteryChargingIcon,
  heartbeat: HeartbeatFilledIcon,
  nurse: NurseFilledIcon,
}

const profileMetricIconBgMap: Record<KeyMetricIcon, string> = {
  heart: 'var(--metric-heart)',
  walk: 'var(--metric-steps)',
  moon: 'var(--metric-sleep)',
  battery: 'var(--metric-recovery)',
  heartbeat: 'var(--metric-vital)',
  nurse: 'var(--metric-vital)',
}

const notificationIcons: Record<
  NotificationIcon,
  ComponentType<SVGProps<SVGSVGElement>>
> = {
  moon: MoonStarsIcon,
  check: CheckCircleRegularIcon,
  heart: HeartbeatIcon,
  alert: AlertTriangleIcon,
  activity: ActivityIcon,
  battery: BatteryChargingIcon,
}

const notificationToneClass: Record<
  NotificationTone,
  { icon: string; bg: string }
> = {
  warning: {
    icon: '!text-(--prediction-warn) [&_*]:!text-(--prediction-warn)',
    bg: 'bg-(--chart-warn-bg)',
  },
  success: {
    icon: '!text-(--vital-good) [&_*]:!text-(--vital-good)',
    bg: 'bg-(--vital-good)/10',
  },
  info: {
    icon: '!text-(--chart-period) [&_*]:!text-(--chart-period)',
    bg: 'bg-(--chart-period-bg)',
  },
  danger: {
    icon: '!text-(--prediction-danger) [&_*]:!text-(--prediction-danger)',
    bg: 'bg-(--prediction-danger)/10',
  },
}

function useCurrentNavItem() {
  const { pathname } = useDashboardNavigation()
  return (
    navigationGroups
      .flatMap((group) => group.items)
      .find((item) => item.href === pathname) ?? navigationGroups[0].items[0]
  )
}

export function DashboardTopbar() {
  const currentNavItem = useCurrentNavItem()
  const PageIcon = currentNavItem.icon
  const [searchQuery, setSearchQuery] = useState('')
  const [isMobileSearchOpen, setIsMobileSearchOpen] = useState(false)
  const searchInputRef = useRef<HTMLInputElement>(null)
  const mobileSearchInputRef = useRef<HTMLInputElement>(null)

  const openMobileSearch = () => {
    setIsMobileSearchOpen(true)
    requestAnimationFrame(() => {
      mobileSearchInputRef.current?.focus()
    })
  }

  const closeMobileSearch = () => {
    setIsMobileSearchOpen(false)
  }

  useEffect(() => {
    const handleKeyDown = (event: KeyboardEvent) => {
      if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {
        event.preventDefault()

        if (window.matchMedia('(width < 48rem)').matches) {
          setIsMobileSearchOpen(true)
          requestAnimationFrame(() => {
            mobileSearchInputRef.current?.focus()
          })
          return
        }

        searchInputRef.current?.focus()
      }

      if (event.key === 'Escape') {
        setIsMobileSearchOpen(false)
      }
    }

    window.addEventListener('keydown', handleKeyDown)
    return () => window.removeEventListener('keydown', handleKeyDown)
  }, [])

  return (
    <header className="flex h-16 shrink-0 items-center justify-between gap-3 border-b py-4 px-4 md:h-20 md:pr-8 md:pl-6">
      {isMobileSearchOpen ? (
        <div className="flex w-full items-center gap-2 md:hidden">
          <InputGroup className="h-11 flex-1 border-none bg-secondary py-1 pr-2 pl-3">
            <InputGroupAddon className="pl-0 text-muted-foreground">
              <SearchIcon />
            </InputGroupAddon>
            <InputGroupInput
              ref={mobileSearchInputRef}
              className="h-full px-1.5! text-sm tracking-tight placeholder:text-muted-foreground"
              aria-label="Search"
              placeholder="search insights, goals, records..."
              value={searchQuery}
              onChange={(event) => setSearchQuery(event.target.value)}
            />
          </InputGroup>
          <Button
            type="button"
            variant="outline"
            size="icon-lg"
            className="size-11 shrink-0"
            aria-label="Close search"
            onClick={closeMobileSearch}
          >
            <CloseIcon />
          </Button>
        </div>
      ) : (
        <>
          <div className="flex min-w-0 flex-1 items-center gap-2">
            <SidebarTrigger className="size-11 shrink-0 md:hidden [&_svg]:size-5!" />
            <div className="flex items-center gap-3">
              <PageIcon className="hidden size-5 shrink-0 md:block" />
              <p className="truncate text-lg font-medium">
                {currentNavItem.name}
              </p>
            </div>
          </div>

          <div className="flex shrink-0 items-center gap-2">
            <InputGroup className="hidden h-11 w-70 max-w-full border-none bg-secondary py-1 pr-2 pl-3 md:flex">
              <InputGroupAddon className="pl-0 text-muted-foreground">
                <SearchIcon />
              </InputGroupAddon>
              <InputGroupInput
                ref={searchInputRef}
                className="h-full px-1.5! text-sm tracking-tight placeholder:text-muted-foreground"
                aria-label="Search"
                placeholder="search insights, goals, records..."
                value={searchQuery}
                onChange={(event) => setSearchQuery(event.target.value)}
              />
            </InputGroup>

            <Button
              type="button"
              variant="outline"
              size="icon-lg"
              className="size-11 rounded-lg md:hidden"
              aria-label="Open search"
              onClick={openMobileSearch}
            >
              <SearchIcon className="size-4" />
            </Button>

            <DropdownMenu>
              <DropdownMenuTrigger asChild>
                <Button
                  type="button"
                  variant="outline"
                  size="icon-lg"
                  className="relative size-11"
                  aria-label="Notifications"
                >
                  <BellIcon className="size-6!" />
                  {notifications.some((item) => item.unread) ? (
                    <svg
                      aria-hidden
                      viewBox="0 0 10 10"
                      className="pointer-events-none absolute top-2 right-2 size-2.5 overflow-visible"
                    >
                      <circle cx="5" cy="5" r="5" className="fill-background" />
                      <circle
                        cx="5"
                        cy="5"
                        r="2.75"
                        fill="none"
                        className="stroke-destructive"
                        strokeWidth="2"
                      />
                    </svg>
                  ) : null}
                </Button>
              </DropdownMenuTrigger>
              <DropdownMenuContent
                align="end"
                className="bionis-dashboard ml-3 w-80 p-0"
              >
                <div className="flex items-center justify-between gap-3 border-b px-3.5 py-3">
                  <p className="text-sm font-medium">Notifications</p>
                  <p className="text-xs text-muted-foreground">
                    {notifications.filter((item) => item.unread).length} unread
                  </p>
                </div>

                <div className="p-1.5">
                  {notifications.slice(0, 3).map((notification) => {
                    const Icon = notificationIcons[notification.icon]
                    const tone = notificationToneClass[notification.tone]

                    return (
                      <DropdownMenuItem
                        key={notification.id}
                        className="cursor-pointer items-start gap-3 rounded-xl px-2.5 py-2.5 [&_svg]:!text-inherit"
                      >
                        <span
                          className={cn(
                            'mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg',
                            tone.bg,
                            tone.icon,
                          )}
                        >
                          <Icon className="size-4" />
                        </span>
                        <div className="min-w-0 flex-1 space-y-1">
                          <div className="flex items-start justify-between gap-2">
                            <p className="text-sm font-medium leading-snug">
                              {notification.title}
                            </p>
                            {notification.unread ? (
                              <span
                                aria-label="Unread"
                                className="mt-1.5 size-1.5 shrink-0 rounded-full bg-(--live)"
                              />
                            ) : null}
                          </div>
                          <p className="truncate text-xs leading-relaxed text-muted-foreground">
                            {notification.description}
                          </p>
                          <p className="text-xs text-muted-foreground/80">
                            {notification.time}
                          </p>
                        </div>
                      </DropdownMenuItem>
                    )
                  })}
                </div>

                <div className="border-t px-3.5 py-2.5 text-center">
                  <DashboardLink
                    href="/notifications"
                    className="text-sm font-medium text-muted-foreground underline-offset-4 hover:text-foreground hover:underline"
                  >
                    View all
                  </DashboardLink>
                </div>
              </DropdownMenuContent>
            </DropdownMenu>

            <DropdownMenu>
              <DropdownMenuTrigger asChild>
                <Button
                  type="button"
                  variant="ghost"
                  className="h-auto gap-2 px-0 aria-expanded:bg-transparent hover:bg-transparent"
                  aria-label="Health profile"
                >
                  <img
                    src={currentUser.avatar}
                    alt=""
                    className="size-11 rounded-lg bg-muted object-cover"
                  />
                  <div className="hidden flex-col items-start gap-1 text-left md:flex">
                    <span className="text-base font-medium leading-none">
                      {currentUser.name}
                    </span>
                    <span className="flex items-center gap-1.5 text-sm leading-none text-muted-foreground">
                      Age: {currentUser.age}
                      <span
                        aria-hidden
                        className="block size-1.5 shrink-0 rounded-full bg-muted-foreground/50"
                      />
                      <span className="text-(--live)">
                        {currentUser.planStatus}
                      </span>
                    </span>
                  </div>
                </Button>
              </DropdownMenuTrigger>
              <DropdownMenuContent
                align="end"
                className="bionis-dashboard w-72 p-0"
              >
                <div className="space-y-3 p-3">
                  <div className="space-y-2">
                    <div className="flex items-start justify-between gap-3">
                      <div className="min-w-0 space-y-1">
                        <p className="truncate text-sm font-medium">
                          {currentUser.name}
                        </p>
                        <p className="truncate text-xs text-muted-foreground">
                          {currentUser.email}
                        </p>
                        <p className="flex items-center gap-1.5 text-xs text-muted-foreground">
                          Age: {currentUser.age}
                          <span
                            aria-hidden
                            className="block size-1.5 shrink-0 rounded-full bg-muted-foreground/50"
                          />
                          <span className="text-(--live)">
                            {currentUser.planStatus}
                          </span>
                        </p>
                      </div>
                      <div className="shrink-0 text-right">
                        <p className="text-xs text-muted-foreground">Score</p>
                        <p className="text-lg font-medium leading-none">
                          {profileHealthSummary.wellnessScore}
                        </p>
                      </div>
                    </div>
                    <span className="inline-flex rounded-full bg-(--live)/10 px-2 py-0.5 text-xs font-medium text-(--live)">
                      {profileHealthSummary.condition}
                    </span>
                    <p className="text-xs leading-relaxed text-muted-foreground">
                      {profileHealthSummary.summary.before}
                      <span className="font-medium text-foreground">
                        {profileHealthSummary.summary.highlight}
                      </span>
                      {profileHealthSummary.summary.after}
                    </p>
                  </div>

                  <div className="grid grid-cols-2 gap-2">
                    {keyMetricsByTimeline['7d'].map((metric) => {
                      const Icon = profileMetricIcons[metric.icon]
                      return (
                        <div
                          key={metric.id}
                          className="flex items-center gap-2 rounded-lg bg-muted p-2"
                        >
                          <span
                            className="flex size-6 shrink-0 items-center justify-center rounded-md text-white"
                            style={{ backgroundColor: profileMetricIconBgMap[metric.icon] }}
                          >
                            <Icon className="size-3" />
                          </span>
                          <p className="min-w-0 truncate text-sm font-medium tabular-nums">
                            {metric.value}
                            <span className="ml-0.5 text-xs font-normal text-muted-foreground">
                              {metric.unit}
                            </span>
                          </p>
                        </div>
                      )
                    })}
                  </div>

                  <div className="flex items-center justify-between gap-2 rounded-lg border px-2.5 py-2">
                    {profileHealthSummary.vitals.map((vital) => (
                      <div key={vital.label} className="text-center">
                        <p className="text-xs text-muted-foreground">
                          {vital.label}
                        </p>
                        <p
                          className={cn(
                            'text-xs font-semibold tabular-nums',
                            vital.tone === 'good' && 'text-(--vital-good)',
                            vital.tone === 'warn' && 'text-(--chart-warn)',
                          )}
                        >
                          {vital.value}
                        </p>
                      </div>
                    ))}
                  </div>
                </div>
              </DropdownMenuContent>
            </DropdownMenu>
          </div>
        </>
      )}
    </header>
  )
}
```

### `src/components/dashboards/bionis-dashboard/components/bionis/trends-content.tsx`

```tsx
import { useState } from 'react'
import { CalendarIcon } from './icons'
import {
  KeyMetricCard,
  RecoveryFactorsCard,
  RecoveryHeatmapCard,
  SleepRecoveryTrendChart,
} from './shared'
import { Button } from '@/components/ui/button'
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import {
  getRecoveryHeatmap,
  getSleepRecoveryTrend,
  recoveryFactorsByTimeline,
  timelineOptions,
  trendsMetricsByTimeline,
  type TimelineOptionValue,
} from '../../data'

export function TrendsContent() {
  const [timeline, setTimeline] = useState<TimelineOptionValue>('7d')
  const selectedLabel =
    timelineOptions.find((option) => option.value === timeline)?.label ??
    'Last 7 days'
  const metrics = trendsMetricsByTimeline[timeline]
  const trendData = getSleepRecoveryTrend(timeline)
  const factors = recoveryFactorsByTimeline[timeline]
  const heatmap = getRecoveryHeatmap(timeline)

  return (
    <div className="flex flex-col gap-8">
      <div className="flex items-center justify-between gap-3">
        <div className="flex flex-col gap-1 min-w-0">
          <h1 className="truncate text-xl font-medium tracking-tight md:text-2xl">
            Trends
          </h1>
          <p className="text-sm text-muted-foreground md:text-base">
            How your key metrics have moved over time
          </p>
        </div>

        <DropdownMenu>
          <DropdownMenuTrigger asChild>
            <Button
              type="button"
              variant="outline"
              className="h-10 shrink-0 gap-1.5 rounded-lg px-3.5 text-sm font-normal tracking-tight shadow-[0_2px_4px_rgba(0,0,0,0.05)]"
            >
              <CalendarIcon className="size-4" />
              <span>{selectedLabel}</span>
            </Button>
          </DropdownMenuTrigger>
          <DropdownMenuContent align="end" className="bionis-dashboard min-w-40">
            <DropdownMenuRadioGroup
              value={timeline}
              onValueChange={(value) =>
                setTimeline(value as TimelineOptionValue)
              }
            >
              {timelineOptions.map((option) => (
                <DropdownMenuRadioItem
                  key={option.value}
                  value={option.value}
                  className="font-normal text-muted-foreground data-[state=checked]:font-medium data-[state=checked]:text-foreground"
                >
                  {option.label}
                </DropdownMenuRadioItem>
              ))}
            </DropdownMenuRadioGroup>
          </DropdownMenuContent>
        </DropdownMenu>
      </div>

      <section className="grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4">
        {metrics.map((metric) => (
          <KeyMetricCard key={metric.id} metric={metric} />
        ))}
      </section>

      <section>
        <SleepRecoveryTrendChart key={`trend-${timeline}`} data={trendData} />
      </section>

      <section className="grid grid-cols-1 gap-4 xl:grid-cols-2">
        <RecoveryFactorsCard key={`factors-${timeline}`} factors={factors} />
        <RecoveryHeatmapCard
          key={`heatmap-${timeline}`}
          data={heatmap.columns}
          dateLabels={heatmap.dateLabels}
        />
      </section>
    </div>
  )
}
```

### `src/components/dashboards/bionis-dashboard/dashboard-layout.tsx`

```tsx
import type { CSSProperties, ReactNode } from 'react'
import { DashboardSidebar } from './components/bionis/sidebar'
import { DashboardTopbar } from './components/bionis/topbar'
import { SidebarProvider } from '@/components/ui/sidebar'
import './dashboard.css'

type DashboardLayoutProps = {
  children: ReactNode
}

export default function DashboardLayout({ children }: DashboardLayoutProps) {
  return (
    <SidebarProvider
      defaultOpen
      className="bionis-dashboard h-svh overflow-hidden no-scrollbar"
      style={
        {
          '--sidebar-width': '18.125rem',
          '--sidebar-width-icon': '4.25rem',
        } as CSSProperties
      }
    >
      <DashboardSidebar />

      <main className="flex flex-1 flex-col overflow-hidden">
        <DashboardTopbar />
        <div className="flex-1 overflow-y-auto px-4 py-6 md:px-8 md:py-10">
          {children}
        </div>
      </main>
    </SidebarProvider>
  )
}
```

### `src/components/dashboards/bionis-dashboard/dashboard.css`

```css
@import url("https://cdn.jsdelivr.net/npm/@fontsource/geist@5/400.css");
@import url("https://cdn.jsdelivr.net/npm/@fontsource/geist@5/500.css");
@import url("https://cdn.jsdelivr.net/npm/@fontsource/geist@5/600.css");
@import url("https://cdn.jsdelivr.net/npm/@fontsource/instrument-serif@5/400.css");
@import url("https://cdn.jsdelivr.net/npm/@fontsource/geist-mono@5/500.css");

.bionis-dashboard,
body:has(.bionis-dashboard) [data-slot="sidebar"][data-mobile="true"],
body:has(.bionis-dashboard) [data-slot="dropdown-menu-content"],
body:has(.bionis-dashboard) [data-slot="sheet-content"],
body:has(.bionis-dashboard) [data-slot="tooltip-content"] {
  --radius: 0.625rem;
  --background: oklch(1 0 0);
  --foreground: oklch(0.2271 0.0625 260.828);
  --card: oklch(0.97 0 0);
  --card-foreground: oklch(0.2271 0.0625 260.828);
  --popover: oklch(1 0 0);
  --popover-foreground: oklch(0.2271 0.0625 260.828);
  --primary: oklch(0 0 0);
  --primary-foreground: oklch(0.985 0 0);
  --secondary: oklch(0.9761 0 0);
  --secondary-foreground: oklch(0.2271 0.0625 260.828);
  --muted: oklch(0.9761 0 0);
  --muted-foreground: oklch(0.5138 0 0);
  --accent: oklch(0.97 0 0);
  --accent-foreground: oklch(0.2271 0.0625 260.828);
  --destructive: oklch(0.574 0.232 29.36);
  --border: oklch(0.9401 0 0);
  --input: oklch(0.9401 0 0);
  --ring: oklch(0.708 0 0);
  --chart-1: oklch(0.87 0 0);
  --chart-2: oklch(0.556 0 0);
  --chart-3: oklch(0.439 0 0);
  --chart-4: oklch(0.371 0 0);
  --chart-5: oklch(0.269 0 0);
  --sidebar: #fafafa;
  --sidebar-foreground: oklch(0.2271 0.0625 260.828);
  --sidebar-primary: oklch(0.2271 0.0625 260.828);
  --sidebar-primary-foreground: oklch(0.985 0 0);
  --sidebar-accent: var(--background);
  --sidebar-accent-foreground: oklch(0.2271 0.0625 260.828);
  --sidebar-border: #eeefe9;
  --sidebar-ring: oklch(0.708 0 0);
  --sidebar-muted: oklch(0.6993 0 0);
  --sidebar-muted-foreground: oklch(0.5138 0 0);
  --promo-gradient-from: #f7f9fc;
  --promo-gradient-to: #4d8dff;
  --bionis-blue: #1975f2;
  --live: #00b153;
  --score: var(--bionis-blue);
  --chart-sleep: var(--bionis-blue);
  --chart-sleep-fill: color-mix(in srgb, var(--bionis-blue) 10%, transparent);
  --chart-steps: #19c035;
  --chart-recovery: var(--bionis-blue);
  --chart-axis: #485066;
  --chart-grid: #e5e7eb;
  --chart-warn: #c57d00;
  --chart-warn-bg: #fef6e7;
  --chart-period: color-mix(in srgb, var(--bionis-blue) 85%, white);
  --chart-period-bg: color-mix(in srgb, var(--bionis-blue) 8%, transparent);
  --chart-tooltip-bg: #fafafa;
  --insight-prediction: #6366f1;
  --insight-vitals: #f72e2e;
  --insight-actions: #14b8a6;
  --vital-good: #269b6a;
  --prediction-warn: #9e6400;
  --prediction-danger: #dd524d;
  --status-processing: #2762ea;
  --status-completed: #16a34a;
  --status-exception: #dc2627;
  --source-oracle: #5946f9;
  --source-sharepoint: #09aff7;
  --source-concur: #ff4fa3;
  --trend: #2c9c5d;
  --metric-heart: #f72e2e;
  --metric-steps: #19c035;
  --metric-sleep: #6366f1;
  --metric-recovery: #22d3ee;
  --metric-vital: #269b6a;
  --metric-warn: #f59e0b;
  --heatmap-base: #22d3ee;
  --heatmap-med: var(--heatmap-base);
  --heatmap-low: color-mix(in srgb, var(--heatmap-base) 20%, white);
  --heatmap-high: color-mix(in srgb, var(--heatmap-base) 75%, black);
  --font-serif: "Instrument Serif", serif;
  --font-mono: "Geist Mono", ui-monospace, monospace;
}

.bionis-dashboard,
body:has(.bionis-dashboard),
body:has(.bionis-dashboard) [data-mobile="true"][data-sidebar="sidebar"] {
  --font-sans: "Geist", sans-serif;
  font-family: "Geist", sans-serif;
  font-weight: 400;
}

.bionis-dashboard {
  background-color: var(--background);
  color: var(--foreground);
}

.bionis-dashboard.dark,
.dark .bionis-dashboard,
.dark body:has(.bionis-dashboard) [data-slot="sidebar"][data-mobile="true"],
.dark body:has(.bionis-dashboard) [data-slot="dropdown-menu-content"],
.dark body:has(.bionis-dashboard) [data-slot="sheet-content"],
.dark body:has(.bionis-dashboard) [data-slot="tooltip-content"] {
  --background: #000000;
  --foreground: oklch(0.985 0 0);
  --card: oklch(0.281 0 0);
  --card-foreground: oklch(0.985 0 0);
  --popover: oklch(0.205 0 0);
  --popover-foreground: oklch(0.985 0 0);
  --primary: oklch(0.922 0 0);
  --primary-foreground: oklch(0.205 0 0);
  --secondary: oklch(0.269 0 0);
  --secondary-foreground: oklch(0.985 0 0);
  --muted: oklch(0.269 0 0);
  --muted-foreground: oklch(0.708 0 0);
  --accent: oklch(0.269 0 0);
  --accent-foreground: oklch(0.985 0 0);
  --destructive: oklch(0.574 0.232 29.36);
  --border: oklch(1 0 0 / 12%);
  --input: oklch(1 0 0 / 15%);
  --ring: oklch(0.556 0 0);
  --chart-1: oklch(0.87 0 0);
  --chart-2: oklch(0.556 0 0);
  --chart-3: oklch(0.439 0 0);
  --chart-4: oklch(0.371 0 0);
  --chart-5: oklch(0.269 0 0);
  --sidebar: #111111;
  --sidebar-foreground: oklch(0.985 0 0);
  --sidebar-primary: oklch(0.922 0 0);
  --sidebar-primary-foreground: oklch(0.205 0 0);
  --sidebar-accent: #1a1a1a;
  --sidebar-accent-foreground: oklch(0.985 0 0);
  --sidebar-border: oklch(1 0 0 / 10%);
  --sidebar-ring: oklch(0.556 0 0);
  --sidebar-muted: oklch(0.535 0 0);
  --sidebar-muted-foreground: oklch(0.725 0 0);
  --promo-gradient-from: #090d16;
  --promo-gradient-to: #1d4ed8;
  --bionis-blue: #4d8dff;
  --score: var(--bionis-blue);
  --chart-sleep: var(--bionis-blue);
  --chart-sleep-fill: color-mix(in srgb, var(--bionis-blue) 18%, transparent);
  --chart-steps: #19c035;
  --chart-recovery: var(--bionis-blue);
  --chart-axis: oklch(0.708 0 0);
  --chart-grid: oklch(1 0 0 / 12%);
  --chart-warn: #f0b429;
  --chart-warn-bg: rgb(240 180 41 / 12%);
  --chart-period: color-mix(in srgb, var(--bionis-blue) 90%, white);
  --chart-period-bg: color-mix(in srgb, var(--bionis-blue) 15%, transparent);
  --chart-tooltip-bg: #171717;
  --insight-prediction: #818cf8;
  --insight-vitals: #f87171;
  --insight-actions: #2dd4bf;
  --vital-good: #34d399;
  --prediction-warn: #f0b429;
  --prediction-danger: #f87171;
  --metric-heart: #f87171;
  --metric-steps: #34d399;
  --metric-sleep: #818cf8;
  --metric-recovery: #38bdf8;
  --metric-vital: #34d399;
  --metric-warn: #f0b429;
}

.bionis-dashboard .font-serif {
  font-family: var(--font-serif);
}

.bionis-dashboard .font-mono {
  font-family: var(--font-mono);
}

/* custom classes */
.text-2\.5xl {
  font-size: 1.75rem;
}

.text-xxs {
  font-size: 0.6875rem;
}

.sidebar-badge-shadow {
  filter: drop-shadow(0 0.0125rem 0.125rem rgba(0, 0, 0, 0.05));
}

@keyframes live-dot-pulse {
  0% {
    transform: scale(1);
    opacity: 0.55;
  }
  100% {
    transform: scale(2.75);
    opacity: 0;
  }
}

.live-dot-pulse {
  position: relative;
}

.live-dot-pulse::before,
.live-dot-pulse::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: inherit;
  pointer-events: none;
  transform-origin: center;
  animation: live-dot-pulse 1.5s ease-out infinite;
}

.live-dot-pulse::after {
  animation-delay: 0.75s;
}

.no-scrollbar,
.no-scrollbar * {
  -ms-overflow-style: none;
  scrollbar-width: none;
}

.no-scrollbar::-webkit-scrollbar,
.no-scrollbar *::-webkit-scrollbar {
  display: none;
}

body:has(.bionis-dashboard) [data-slot='tooltip-content'] {
  background-color: var(--foreground) !important;
  color: var(--background) !important;
}

body:has(.bionis-dashboard) [data-slot='tooltip-content'] > svg {
  background-color: var(--foreground) !important;
  fill: var(--foreground) !important;
}

[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-item"],
[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-sub-trigger"] {
  padding-inline: 0.625rem;
  padding-block: 0.625rem;
}

[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-checkbox-item"],
[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-radio-item"] {
  padding-block: 0.625rem;
  padding-left: 0.625rem;
  padding-right: 2rem;
}
```

### `src/components/dashboards/bionis-dashboard/data.ts`

Left out to keep this page a readable size (39,357 characters). It is in the registry item above.

### `src/components/dashboards/bionis-dashboard/demo.tsx`

```tsx
import DashboardLayout from './dashboard-layout'
import { DashboardContent } from './components/bionis/dashboard-content'
import { TrendsContent } from './components/bionis/trends-content'
import {
  DashboardNavigationProvider,
  useDashboardNavigation,
} from './components/bionis/navigation'
import { ThemeProvider } from './components/bionis/theme-provider'

function DashboardRoute() {
  const { pathname } = useDashboardNavigation()

  return (
    <DashboardLayout>
      {pathname === '/trends' ? <TrendsContent /> : <DashboardContent />}
    </DashboardLayout>
  )
}

export default function BionisDashboardDemo() {
  return (
    <ThemeProvider>
      <DashboardNavigationProvider>
        <DashboardRoute />
      </DashboardNavigationProvider>
    </ThemeProvider>
  )
}
```
