Openstatus www.openstatus.dev

๐Ÿšง barrel (#964)

* ๐Ÿšง barrel

* ci: apply automated fixes

* ๐Ÿš€ optim

* ๐Ÿš€ optim

* ci: apply automated fixes

* ๐Ÿš€ less modules?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

authored by

Thibault Le Ouay
autofix-ci[bot]
and committed by
GitHub
666e97d6 415d81f2

+293 -192
+1 -1
apps/web/src/app/(content)/_components/pagination.tsx
··· 2 2 import { ChevronLeft, ChevronRight } from "lucide-react"; 3 3 import Link from "next/link"; 4 4 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 export function Pagination({ 8 8 // biome-ignore lint/correctness/noUnusedVariables: <explanation>
+1 -1
apps/web/src/app/(content)/blog/[slug]/page.tsx
··· 68 68 return ( 69 69 <> 70 70 <BackButton href="/blog" /> 71 - <Shell className="md:py-12 sm:py-8"> 71 + <Shell className="sm:py-8 md:py-12"> 72 72 <Article post={post} /> 73 73 </Shell> 74 74 </>
+1 -1
apps/web/src/app/(content)/blog/page.tsx
··· 3 3 import type { Metadata } from "next"; 4 4 import Link from "next/link"; 5 5 6 - import { Button } from "@openstatus/ui"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 7 7 8 8 import { 9 9 defaultMetadata,
+1 -1
apps/web/src/app/(content)/changelog/[slug]/page.tsx
··· 92 92 return ( 93 93 <> 94 94 <BackButton href="/changelog" /> 95 - <Shell className="flex flex-col gap-8 md:gap-12 md:py-12 sm:py-8"> 95 + <Shell className="flex flex-col gap-8 sm:py-8 md:gap-12 md:py-12"> 96 96 <ChangelogCard post={post} /> 97 97 <Separator className="mx-auto max-w-prose" /> 98 98 <Pagination {...{ next, prev }} />
+1 -1
apps/web/src/app/(content)/changelog/page.tsx
··· 2 2 import { Rss } from "lucide-react"; 3 3 import type { Metadata } from "next"; 4 4 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 import { 8 8 defaultMetadata,
+1 -1
apps/web/src/app/(content)/features/_components/banner.tsx
··· 1 1 import { Shell } from "@/components/dashboard/shell"; 2 - import { Button } from "@openstatus/ui"; 2 + import { Button } from "@openstatus/ui/src/components/button"; 3 3 import Link from "next/link"; 4 4 5 5 export function Banner() {
+1 -1
apps/web/src/app/_components/submit-button.tsx
··· 2 2 3 3 import { useFormStatus } from "react-dom"; 4 4 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 import { LoadingAnimation } from "@/components/loading-animation"; 8 8
+1 -1
apps/web/src/app/about/_components/member.tsx
··· 1 1 import Image from "next/image"; 2 2 import Link from "next/link"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 import { cn } from "@openstatus/ui/src/lib/utils"; 6 6 7 7 import { Icons } from "@/components/icons";
+3 -3
apps/web/src/app/about/page.tsx
··· 1 1 import { allUnrelateds } from "contentlayer/generated"; 2 2 3 - import { Separator } from "@openstatus/ui"; 3 + import { Separator } from "@openstatus/ui/src/components/separator"; 4 4 5 5 import { Mdx } from "@/components/content/mdx"; 6 6 import { Shell } from "@/components/dashboard/shell"; ··· 25 25 </p> 26 26 <p className="italic">Made by developers for developers.</p> 27 27 </div> 28 - <ul className="grid grid-cols-2 gap-4 sm:grid-cols-3 md:gap-8 sm:gap-6"> 28 + <ul className="grid grid-cols-2 gap-4 sm:grid-cols-3 sm:gap-6 md:gap-8"> 29 29 {members.map((member) => ( 30 30 <li key={member.name}> 31 31 <Member {...member} /> ··· 34 34 <li /> 35 35 </ul> 36 36 <Separator className="my-2" /> 37 - <Shell className="mx-auto w-auto shadow dark:border-card-foreground/30 md:px-12 sm:px-8 md:py-12 sm:py-8"> 37 + <Shell className="mx-auto w-auto shadow sm:px-8 sm:py-8 md:px-12 md:py-12 dark:border-card-foreground/30"> 38 38 {story ? ( 39 39 <Mdx 40 40 code={story.body.code}
+1 -1
apps/web/src/app/app/(auth)/login/layout.tsx
··· 14 14 15 15 return ( 16 16 <div className="grid min-h-screen grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-5"> 17 - <aside className="col-span-1 flex w-full flex-col gap-4 border border-border p-4 backdrop-blur-[2px] xl:col-span-2 md:p-8"> 17 + <aside className="col-span-1 flex w-full flex-col gap-4 border border-border p-4 backdrop-blur-[2px] md:p-8 xl:col-span-2"> 18 18 <Link href="/" className="relative h-8 w-8"> 19 19 <Image 20 20 src="/icon.png"
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/(overview)/page.tsx
··· 3 3 import { z } from "zod"; 4 4 5 5 import { OSTinybird } from "@openstatus/tinybird"; 6 - import { Button } from "@openstatus/ui"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 7 7 8 8 import { EmptyState } from "@/components/dashboard/empty-state"; 9 9 import { Limit } from "@/components/dashboard/limit";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/details/page.tsx
··· 1 1 import Link from "next/link"; 2 2 import * as z from "zod"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { EmptyState } from "@/components/dashboard/empty-state"; 7 7 import { ResponseDetails } from "@/components/monitor-dashboard/response-details";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/layout.tsx
··· 1 1 import { notFound } from "next/navigation"; 2 2 3 - import { Badge } from "@openstatus/ui"; 3 + import { Badge } from "@openstatus/ui/src/components/badge"; 4 4 5 5 import { Header } from "@/components/dashboard/header"; 6 6 import AppPageWithSidebarLayout from "@/components/layout/app-page-with-sidebar-layout";
+2 -2
apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/overview/loading.tsx
··· 5 5 <div className="grid gap-4"> 6 6 <Skeleton className="h-10 w-[150px]" /> 7 7 <div className="grid gap-6"> 8 - <div className="grid grid-cols-2 gap-4 md:grid-cols-5 sm:grid-cols-4 md:gap-6"> 8 + <div className="grid grid-cols-2 gap-4 sm:grid-cols-4 md:grid-cols-5 md:gap-6"> 9 9 {new Array(4).fill(0).map((_, i) => ( 10 10 // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 11 11 <Skeleton key={i} className="h-16 w-full" /> 12 12 ))} 13 13 </div> 14 14 <div className="grid gap-4"> 15 - <div className="grid grid-cols-2 gap-4 md:grid-cols-5 sm:grid-cols-4 md:gap-6"> 15 + <div className="grid grid-cols-2 gap-4 sm:grid-cols-4 md:grid-cols-5 md:gap-6"> 16 16 {new Array(5).fill(0).map((_, i) => ( 17 17 // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 18 18 <Skeleton key={i} className="h-16 w-full" />
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/_components/refresh-widget.tsx
··· 3 3 import { useRouter } from "next/navigation"; 4 4 import { useEffect, useState } from "react"; 5 5 6 - import { Button } from "@openstatus/ui"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 7 7 8 8 import { api } from "@/trpc/client"; 9 9
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/(overview)/page.tsx
··· 1 1 import Link from "next/link"; 2 2 import * as React from "react"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { EmptyState } from "@/components/dashboard/empty-state"; 7 7 import { Limit } from "@/components/dashboard/limit";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/rum/_components/request-button/request-button.tsx
··· 1 1 "use client"; 2 2 import { auth } from "@/lib/auth"; 3 - import { Button } from "@openstatus/ui"; 3 + import { Button } from "@openstatus/ui/src/components/button"; 4 4 import { Redis } from "@upstash/redis"; 5 5 import { useState } from "react"; 6 6 import { RequestAccessToRum } from "./action";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/rum/_components/rum-metric-card.tsx
··· 10 10 period: "24h", 11 11 }); 12 12 return ( 13 - <div className="grid grid-cols-1 gap-2 lg:grid-cols-5 md:grid-cols-2"> 13 + <div className="grid grid-cols-1 gap-2 md:grid-cols-2 lg:grid-cols-5"> 14 14 <RUMCard event="CLS" value={data?.cls || 0} /> 15 15 <RUMCard event="FCP" value={data?.fcp || 0} /> 16 16 <RUMCard event="INP" value={data?.inp || 0} />
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/rum/overview/_components/path-card.tsx
··· 21 21 return null; 22 22 } 23 23 return ( 24 - <div className="grid grid-cols-1 gap-2 lg:grid-cols-5 md:grid-cols-2"> 24 + <div className="grid grid-cols-1 gap-2 md:grid-cols-2 lg:grid-cols-5"> 25 25 <RUMCard event="CLS" value={data?.cls || 0} /> 26 26 <RUMCard event="FCP" value={data?.fcp || 0} /> 27 27 <RUMCard event="INP" value={data?.inp || 0} />
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/api-token/_components/card.tsx
··· 38 38 } 39 39 > 40 40 {key ? ( 41 - <dl className="grid gap-2 [&_dt]:font-light [&>*]:text-sm [&_dt]:text-muted-foreground"> 41 + <dl className="grid gap-2 [&>*]:text-sm [&_dt]:font-light [&_dt]:text-muted-foreground"> 42 42 <div className="flex min-w-0 items-center justify-between gap-3"> 43 43 <dt>Token</dt> 44 44 <dd className="font-mono">{key.start}...</dd>
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/api-token/_components/submit-button.tsx
··· 2 2 3 3 import { useFormStatus } from "react-dom"; 4 4 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 import { LoadingAnimation } from "@/components/loading-animation"; 8 8
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/appearance/page.tsx
··· 11 11 const { setTheme, theme } = useTheme(); 12 12 13 13 return ( 14 - <div className="grid grid-cols-1 gap-4 md:grid-cols-4 sm:grid-cols-2"> 14 + <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-4"> 15 15 <button type="button" onClick={() => setTheme("light")}> 16 16 <LightModeCard active={theme === "light"} /> 17 17 <span className="mt-2 font-light text-muted-foreground text-sm">
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/billing/_components/customer-portal-button.tsx
··· 3 3 import { useRouter } from "next/navigation"; 4 4 import { useTransition } from "react"; 5 5 6 - import { Button } from "@openstatus/ui"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 7 7 8 8 import { LoadingAnimation } from "@/components/loading-animation"; 9 9 import { api } from "@/trpc/client";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/general/_components/copy-to-clipboard-button.tsx
··· 2 2 3 3 import * as React from "react"; 4 4 5 - import { Button } from "@openstatus/ui"; 6 5 import type { ButtonProps } from "@openstatus/ui"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 7 7 8 8 import { Icons } from "@/components/icons"; 9 9 import { cn, copyToClipboard } from "@/lib/utils";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/(overview)/page.tsx
··· 1 1 import Link from "next/link"; 2 2 import * as React from "react"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { EmptyState } from "@/components/dashboard/empty-state"; 7 7 import { Limit } from "@/components/dashboard/limit";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/layout.tsx
··· 1 1 import Link from "next/link"; 2 2 import { notFound } from "next/navigation"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { getBaseUrl } from "@/app/status-page/[domain]/utils"; 7 7 import { Header } from "@/components/dashboard/header";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/(overview)/page.tsx
··· 2 2 import { columns } from "@/components/data-table/maintenance/columns"; 3 3 import { DataTable } from "@/components/data-table/maintenance/data-table"; 4 4 import { api } from "@/trpc/server"; 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 import Link from "next/link"; 7 7 8 8 export default async function MaintenancePage({
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/(overview)/page.tsx
··· 1 1 import Link from "next/link"; 2 2 import * as React from "react"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { EmptyState } from "@/components/dashboard/empty-state"; 7 7 import { columns } from "@/components/data-table/status-report/columns";
+1 -1
apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/overview/page.tsx
··· 2 2 import { notFound } from "next/navigation"; 3 3 import * as React from "react"; 4 4 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 import { EmptyState } from "@/components/dashboard/empty-state"; 8 8 import { Events } from "@/components/status-update/events";
+1 -1
apps/web/src/app/app/[workspaceSlug]/onboarding/page.tsx
··· 1 1 import Link from "next/link"; 2 2 import { redirect } from "next/navigation"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { Header } from "@/components/dashboard/header"; 7 7 import { MonitorForm } from "@/components/forms/monitor/form";
+1 -1
apps/web/src/app/legal/[slug]/page.tsx
··· 24 24 return ( 25 25 <> 26 26 <BackButton href="/" /> 27 - <Shell className="md:py-12 sm:py-8"> 27 + <Shell className="sm:py-8 md:py-12"> 28 28 <article className="grid gap-8"> 29 29 <div className="mx-auto grid w-full max-w-prose gap-3"> 30 30 <h1 className="mb-5 font-cal text-3xl">{post.title}</h1>
+1 -1
apps/web/src/app/not-found.tsx
··· 3 3 import Link from "next/link"; 4 4 import { useRouter } from "next/navigation"; 5 5 6 - import { Button } from "@openstatus/ui"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 7 7 8 8 import { Shell } from "@/components/dashboard/shell"; 9 9
+1 -1
apps/web/src/app/play/checker/[id]/page.tsx
··· 53 53 <Shell className="my-8 flex flex-col gap-8 md:my-16"> 54 54 <div className="flex justify-between gap-4"> 55 55 <div className="flex max-w-[calc(100%-50px)] flex-col gap-1"> 56 - <h1 className="truncate text-wrap font-semibold text-lg md:text-3xl sm:text-xl"> 56 + <h1 className="truncate text-wrap font-semibold text-lg sm:text-xl md:text-3xl"> 57 57 {data.url} 58 58 </h1> 59 59 <p className="text-muted-foreground text-sm sm:text-base">
+1 -1
apps/web/src/app/play/checker/_components/global-monitoring.tsx
··· 1 1 import Link from "next/link"; 2 2 3 - import { Button } from "@openstatus/ui"; 3 + import { Button } from "@openstatus/ui/src/components/button"; 4 4 5 5 import { Shell } from "@/components/dashboard/shell"; 6 6 import type { ValidIcon } from "@/components/icons";
+1 -1
apps/web/src/app/play/checker/_components/testimonial.tsx
··· 4 4 return ( 5 5 <div className="mx-auto max-w-2xl lg:max-w-4xl"> 6 6 <figure className="grid gap-4"> 7 - <blockquote className="text-center font-semibold text-xl leading-8 after:text-muted-foreground before:text-muted-foreground sm:text-2xl sm:leading-9 after:content-['โ€'] before:content-['โ€œ']"> 7 + <blockquote className="text-center font-semibold text-xl leading-8 before:text-muted-foreground before:content-['โ€œ'] after:text-muted-foreground after:content-['โ€'] sm:text-2xl sm:leading-9"> 8 8 Just don't give up on your users 9 9 </blockquote> 10 10 <figcaption className="flex items-center justify-center space-x-3 text-base">
+1 -1
apps/web/src/app/play/page.tsx
··· 34 34 export default async function PlayPage() { 35 35 return ( 36 36 <> 37 - <div className="my-8 grid w-full grid-cols-1 gap-4 md:my-16 md:grid-cols-3 sm:grid-cols-2"> 37 + <div className="my-8 grid w-full grid-cols-1 gap-4 sm:grid-cols-2 md:my-16 md:grid-cols-3"> 38 38 {playgrounds.map((play, i) => { 39 39 const isFirst = i === 0; 40 40 return (
+2 -2
apps/web/src/app/public/monitors/[id]/loading.tsx
··· 16 16 </Shell> 17 17 <Shell className="grid gap-4"> 18 18 <div className="grid gap-6"> 19 - <div className="grid grid-cols-2 gap-4 md:grid-cols-5 sm:grid-cols-4 md:gap-6"> 19 + <div className="grid grid-cols-2 gap-4 sm:grid-cols-4 md:grid-cols-5 md:gap-6"> 20 20 {new Array(4).fill(0).map((_, i) => ( 21 21 // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 22 22 <Skeleton key={i} className="h-16 w-full" /> 23 23 ))} 24 24 </div> 25 25 <div className="grid gap-4"> 26 - <div className="grid grid-cols-2 gap-4 md:grid-cols-5 sm:grid-cols-4 md:gap-6"> 26 + <div className="grid grid-cols-2 gap-4 sm:grid-cols-4 md:grid-cols-5 md:gap-6"> 27 27 {new Array(5).fill(0).map((_, i) => ( 28 28 // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 29 29 <Skeleton key={i} className="h-16 w-full" />
-2
apps/web/src/app/status-page/[domain]/_components/header.tsx
··· 7 7 import { allPlans } from "@openstatus/db/src/schema/plan/config"; 8 8 import type { WorkspacePlan } from "@openstatus/db/src/schema/workspaces/validation"; 9 9 10 - import { Shell } from "@/components/dashboard/shell"; 11 - import { TabsContainer, TabsLink } from "@/components/dashboard/tabs-link"; 12 10 import { cn } from "@/lib/utils"; 13 11 import Link from "next/link"; 14 12 import { Menu } from "./menu";
+2 -2
apps/web/src/app/status-page/[domain]/_components/menu.tsx
··· 4 4 import { usePathname, useSelectedLayoutSegment } from "next/navigation"; 5 5 import * as React from "react"; 6 6 7 + import { Button } from "@openstatus/ui/src/components/button"; 7 8 import { 8 - Button, 9 9 Sheet, 10 10 SheetContent, 11 11 SheetHeader, 12 12 SheetTitle, 13 13 SheetTrigger, 14 - } from "@openstatus/ui"; 14 + } from "@openstatus/ui/src/components/sheet"; 15 15 16 16 import { AppLink } from "@/components/layout/app-link"; 17 17
+8 -9
apps/web/src/app/status-page/[domain]/_components/password-form.tsx
··· 7 7 import { useForm } from "react-hook-form"; 8 8 import { z } from "zod"; 9 9 10 + import { LoadingAnimation } from "@/components/loading-animation"; 11 + import { useCookieState } from "@/hooks/use-cookie-state"; 12 + import { toast, toastAction } from "@/lib/toast"; 13 + import { wait } from "@/lib/utils"; 14 + import { Button } from "@openstatus/ui/src/components/button"; 10 15 import { 11 - Button, 12 16 Form, 13 17 FormControl, 14 18 FormField, 15 19 FormItem, 16 20 FormLabel, 17 21 FormMessage, 18 - InputWithAddons, 19 - Skeleton, 20 - } from "@openstatus/ui"; 21 - 22 - import { LoadingAnimation } from "@/components/loading-animation"; 23 - import { useCookieState } from "@/hooks/use-cookie-state"; 24 - import { toast, toastAction } from "@/lib/toast"; 25 - import { wait } from "@/lib/utils"; 22 + } from "@openstatus/ui/src/components/form"; 23 + import { InputWithAddons } from "@openstatus/ui/src/components/input-with-addons"; 24 + import { Skeleton } from "@openstatus/ui/src/components/skeleton"; 26 25 import { createProtectedCookieKey } from "../utils"; 27 26 import { handleValidatePassword } from "./actions"; 28 27
+4 -4
apps/web/src/app/status-page/[domain]/_components/subscribe-button.tsx
··· 4 4 import { useFormStatus } from "react-dom"; 5 5 6 6 import { 7 - Button, 8 - Input, 9 - Label, 10 7 Popover, 11 8 PopoverContent, 12 9 PopoverTrigger, 13 - } from "@openstatus/ui"; 10 + } from "@openstatus/ui/src/components/popover"; 14 11 15 12 import { LoadingAnimation } from "@/components/loading-animation"; 16 13 import { toast } from "@/lib/toast"; 17 14 import { wait } from "@/lib/utils"; 15 + import { Button } from "@openstatus/ui/src/components/button"; 16 + import { Input } from "@openstatus/ui/src/components/input"; 17 + import { Label } from "@openstatus/ui/src/components/label"; 18 18 import { handleSubscribe } from "./actions"; 19 19 20 20 interface Props {
+1 -1
apps/web/src/app/status-page/[domain]/events/report/[id]/page.tsx
··· 4 4 import { DateTimeTooltip } from "@/components/status-page/datetime-tooltip"; 5 5 import { StatusReportUpdates } from "@/components/status-page/status-report"; 6 6 import { api } from "@/trpc/server"; 7 - import { Badge } from "@openstatus/ui"; 7 + import { Badge } from "@openstatus/ui/src/components/badge"; 8 8 import { CopyLinkButton } from "./_components/copy-link-button"; 9 9 10 10 export default async function IncidentPage({
+1 -1
apps/web/src/app/status-page/[domain]/loading.tsx
··· 1 - import { Skeleton } from "@openstatus/ui"; 1 + import { Skeleton } from "@openstatus/ui/src/components/skeleton"; 2 2 3 3 import { Container } from "@/components/dashboard/container"; 4 4 import { Header } from "@/components/dashboard/header";
+1 -1
apps/web/src/app/status-page/[domain]/monitors/[id]/page.tsx
··· 5 5 import { flyRegions } from "@openstatus/db/src/schema/constants"; 6 6 import type { Region } from "@openstatus/tinybird"; 7 7 import { OSTinybird } from "@openstatus/tinybird"; 8 - import { Separator } from "@openstatus/ui"; 8 + import { Separator } from "@openstatus/ui/src/components/separator"; 9 9 10 10 import { Header } from "@/components/dashboard/header"; 11 11 import { CombinedChartWrapper } from "@/components/monitor-charts/combined-chart-wrapper";
+1 -1
apps/web/src/app/status-page/[domain]/monitors/page.tsx
··· 4 4 import { z } from "zod"; 5 5 6 6 import { OSTinybird } from "@openstatus/tinybird"; 7 - import { Button } from "@openstatus/ui"; 7 + import { Button } from "@openstatus/ui/src/components/button"; 8 8 9 9 import { EmptyState } from "@/components/dashboard/empty-state"; 10 10 import { Header } from "@/components/dashboard/header";
+1 -1
apps/web/src/components/billing/pro-banner.tsx
··· 5 5 import { useParams } from "next/navigation"; 6 6 import { useEffect, useState } from "react"; 7 7 8 - import { Button } from "@openstatus/ui"; 8 + import { Button } from "@openstatus/ui/src/components/button"; 9 9 10 10 import { api } from "@/trpc/client"; 11 11
+1 -1
apps/web/src/components/content/pre.tsx
··· 1 1 "use client"; 2 2 3 - import { Button } from "@openstatus/ui"; 3 + import { Button } from "@openstatus/ui/src/components/button"; 4 4 import { Clipboard, ClipboardCopy } from "lucide-react"; 5 5 import React from "react"; 6 6
+1 -1
apps/web/src/components/dashboard/tabs.tsx
··· 35 35 return ( 36 36 <ShadcnTabsTrigger 37 37 className={cn( 38 - "relative rounded-none border-b-4 border-b-transparent bg-transparent px-4 pt-2 pb-3 text-muted-foreground shadow-none transition-none data-[state=active]:border-b-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground hover:text-primary data-[state=active]:shadow-none", 38 + "relative rounded-none border-b-4 border-b-transparent bg-transparent px-4 pt-2 pb-3 text-muted-foreground shadow-none transition-none hover:text-primary data-[state=active]:border-b-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none", 39 39 className, 40 40 )} 41 41 {...props}
+1 -1
apps/web/src/components/data-table/data-table-badges.tsx
··· 13 13 14 14 return ( 15 15 <div className="flex items-center gap-2"> 16 - <span className="flex max-w-[150px] gap-2 truncate font-medium lg:max-w-[250px] sm:max-w-[200px] xl:max-w-[350px]"> 16 + <span className="flex max-w-[150px] gap-2 truncate font-medium sm:max-w-[200px] lg:max-w-[250px] xl:max-w-[350px]"> 17 17 <Badge variant="outline">{first}</Badge> 18 18 {second ? <Badge variant="outline">{second}</Badge> : null} 19 19 </span>
+1 -1
apps/web/src/components/data-table/data-table-faceted-input-dropdown.tsx
··· 72 72 </Select> 73 73 <Separator orientation="vertical" className="h-4" /> 74 74 <input 75 - className="w-24 rounded-md bg-background px-3 py-2 disabled:cursor-not-allowed placeholder:text-muted-foreground disabled:opacity-50 focus:outline-none" 75 + className="w-24 rounded-md bg-background px-3 py-2 placeholder:text-muted-foreground focus:outline-none disabled:cursor-not-allowed disabled:opacity-50" 76 76 type="number" 77 77 placeholder="4000" 78 78 min={0}
+1 -1
apps/web/src/components/data-table/data-table-status-badge.tsx
··· 1 1 import type { Ping } from "@openstatus/tinybird"; 2 - import { Badge } from "@openstatus/ui"; 2 + import { Badge } from "@openstatus/ui/src/components/badge"; 3 3 4 4 import { StatusCodeBadge } from "../monitor/status-code-badge"; 5 5
+1 -1
apps/web/src/components/data-table/data-table-toolbar.tsx
··· 4 4 import { X } from "lucide-react"; 5 5 import { useRouter } from "next/navigation"; 6 6 7 - import { Button } from "@openstatus/ui"; 7 + import { Button } from "@openstatus/ui/src/components/button"; 8 8 import { flyRegionsDict } from "@openstatus/utils"; 9 9 10 10 import { codesDict } from "@/data/code-dictionary";
+1 -1
apps/web/src/components/data-table/data-table.tsx
··· 129 129 {row.getIsExpanded() && ( 130 130 <TableRow 131 131 data-state="expanded" 132 - className="data-[state=expanded]:bg-muted/10 hover:bg-muted/10" 132 + className="hover:bg-muted/10 data-[state=expanded]:bg-muted/10" 133 133 > 134 134 {/* 2nd row is a custom 1 cell row */} 135 135 <TableCell colSpan={row.getVisibleCells().length}>
+4 -4
apps/web/src/components/data-table/incident/columns.tsx
··· 35 35 const date = startedAt ? formatDateTime(startedAt) : "-"; 36 36 return ( 37 37 <div className="flex gap-2"> 38 - <span className="max-w-[150px] truncate text-muted-foreground lg:max-w-[250px] sm:max-w-[200px] xl:max-w-[350px]"> 38 + <span className="max-w-[150px] truncate text-muted-foreground sm:max-w-[200px] lg:max-w-[250px] xl:max-w-[350px]"> 39 39 {date} 40 40 </span> 41 41 {incidentScreenshotUrl ? ( ··· 64 64 const date = acknowledgedAt ? formatDateTime(acknowledgedAt) : "-"; 65 65 return ( 66 66 <div className="flex"> 67 - <span className="max-w-[150px] truncate text-muted-foreground lg:max-w-[250px] sm:max-w-[200px] xl:max-w-[350px]"> 67 + <span className="max-w-[150px] truncate text-muted-foreground sm:max-w-[200px] lg:max-w-[250px] xl:max-w-[350px]"> 68 68 {date} 69 69 </span> 70 70 </div> ··· 79 79 const date = resolvedAt ? formatDateTime(resolvedAt) : "-"; 80 80 return ( 81 81 <div className="flex gap-2"> 82 - <span className="max-w-[150px] truncate text-muted-foreground lg:max-w-[250px] sm:max-w-[200px] xl:max-w-[350px]"> 82 + <span className="max-w-[150px] truncate text-muted-foreground sm:max-w-[200px] lg:max-w-[250px] xl:max-w-[350px]"> 83 83 {date} 84 84 </span> 85 85 {recoveryScreenshotUrl ? ( ··· 115 115 ); 116 116 return ( 117 117 <div className="flex"> 118 - <span className="max-w-[150px] truncate text-muted-foreground lg:max-w-[250px] sm:max-w-[200px] xl:max-w-[350px]"> 118 + <span className="max-w-[150px] truncate text-muted-foreground sm:max-w-[200px] lg:max-w-[250px] xl:max-w-[350px]"> 119 119 {duration} 120 120 </span> 121 121 </div>
+1 -1
apps/web/src/components/data-table/invitation/columns.tsx
··· 3 3 import type { ColumnDef } from "@tanstack/react-table"; 4 4 5 5 import type { Invitation, WorkspaceRole } from "@openstatus/db/src/schema"; 6 - import { Badge } from "@openstatus/ui"; 6 + import { Badge } from "@openstatus/ui/src/components/badge"; 7 7 8 8 import { formatDate } from "@/lib/utils"; 9 9 import { DataTableRowActions } from "./data-table-row-actions";
+1 -1
apps/web/src/components/data-table/notification/columns.tsx
··· 3 3 import type { ColumnDef } from "@tanstack/react-table"; 4 4 5 5 import type { Monitor, Notification } from "@openstatus/db/src/schema"; 6 - import { Badge } from "@openstatus/ui"; 6 + import { Badge } from "@openstatus/ui/src/components/badge"; 7 7 8 8 import Link from "next/link"; 9 9 import { z } from "zod";
+1 -1
apps/web/src/components/data-table/user/columns.tsx
··· 3 3 import type { ColumnDef } from "@tanstack/react-table"; 4 4 5 5 import type { User, WorkspaceRole } from "@openstatus/db/src/schema"; 6 - import { Badge } from "@openstatus/ui"; 6 + import { Badge } from "@openstatus/ui/src/components/badge"; 7 7 8 8 import { formatDate } from "@/lib/utils"; 9 9 import { DataTableRowActions } from "./data-table-row-actions";
+1 -1
apps/web/src/components/forms/maintenance/section-connect.tsx
··· 41 41 </span> 42 42 </FormDescription> 43 43 </div> 44 - <div className="grid grid-cols-1 grid-rows-1 gap-6 md:grid-cols-3 sm:grid-cols-2"> 44 + <div className="grid grid-cols-1 grid-rows-1 gap-6 sm:grid-cols-2 md:grid-cols-3"> 45 45 {monitors?.map((item) => ( 46 46 <FormField 47 47 key={item.id}
+1 -1
apps/web/src/components/forms/monitor/section-notifications.tsx
··· 48 48 Select the notification channels you want to be informed. 49 49 </FormDescription> 50 50 </div> 51 - <div className="grid grid-cols-1 grid-rows-1 gap-4 md:grid-cols-3 sm:grid-cols-2"> 51 + <div className="grid grid-cols-1 grid-rows-1 gap-4 sm:grid-cols-2 md:grid-cols-3"> 52 52 {notifications?.map((item) => ( 53 53 <FormField 54 54 key={item.id}
+1 -1
apps/web/src/components/forms/monitor/section-scheduling.tsx
··· 50 50 title="Schedule and Regions" 51 51 description="Customize the period of time and the regions where your endpoint will be monitored." 52 52 /> 53 - <div className="grid md:grid-cols-3 sm:grid-cols-2"> 53 + <div className="grid sm:grid-cols-2 md:grid-cols-3"> 54 54 <FormField 55 55 control={form.control} 56 56 name="periodicity"
+1 -1
apps/web/src/components/forms/monitor/section-status-page.tsx
··· 66 66 Select the pages where you want to display the monitor. 67 67 </FormDescription> 68 68 </div> 69 - <div className="grid grid-cols-1 grid-rows-1 gap-4 md:grid-cols-3 sm:grid-cols-2"> 69 + <div className="grid grid-cols-1 grid-rows-1 gap-4 sm:grid-cols-2 md:grid-cols-3"> 70 70 {pages?.map((item) => ( 71 71 <FormField 72 72 key={item.id}
+1 -1
apps/web/src/components/forms/notification/section-connect.tsx
··· 35 35 Attach the notification to specific monitors. 36 36 </FormDescription> 37 37 </div> 38 - <div className="grid grid-cols-1 grid-rows-1 gap-6 md:grid-cols-3 sm:grid-cols-2"> 38 + <div className="grid grid-cols-1 grid-rows-1 gap-6 sm:grid-cols-2 md:grid-cols-3"> 39 39 {monitors?.map((item) => ( 40 40 <FormField 41 41 key={item.id}
+2 -2
apps/web/src/components/forms/shared/checkbox-label.tsx
··· 36 36 <Label 37 37 htmlFor={`${name}-${id}`} 38 38 className={cn( 39 - "flex h-full items-center gap-1 rounded-md border border-border bg-popover p-4 pr-10 [&:has([data-state=checked])]:border-primary peer-data-[state=checked]:border-primary hover:bg-accent hover:text-accent-foreground", 39 + "flex h-full items-center gap-1 rounded-md border border-border bg-popover p-4 pr-10 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary [&:has([data-state=checked])]:border-primary", 40 40 className, 41 41 )} 42 42 > 43 43 {children} 44 44 </Label> 45 - <div className="absolute inset-y-0 right-4 hidden items-center [&:has([data-state=checked])]:flex peer-data-[state=checked]:flex"> 45 + <div className="absolute inset-y-0 right-4 hidden items-center peer-data-[state=checked]:flex [&:has([data-state=checked])]:flex"> 46 46 <CheckCircle2 className="h-4 w-4" /> 47 47 </div> 48 48 </div>
+1 -1
apps/web/src/components/forms/shared/save-button.tsx
··· 1 1 import React from "react"; 2 2 3 - import { Button } from "@openstatus/ui"; 3 + import { Button } from "@openstatus/ui/src/components/button"; 4 4 5 5 import { Kbd } from "../../kbd"; 6 6 import { LoadingAnimation } from "../../loading-animation";
+1 -1
apps/web/src/components/forms/status-report/section-connect.tsx
··· 41 41 will be displayed on the status page they are attached to. 42 42 </FormDescription> 43 43 </div> 44 - <div className="grid grid-cols-1 grid-rows-1 gap-6 md:grid-cols-3 sm:grid-cols-2"> 44 + <div className="grid grid-cols-1 grid-rows-1 gap-6 sm:grid-cols-2 md:grid-cols-3"> 45 45 {monitors?.map((item) => ( 46 46 <FormField 47 47 key={item.id}
+2 -2
apps/web/src/components/layout/app-menu.tsx
··· 8 8 Collapsible, 9 9 CollapsibleContent, 10 10 CollapsibleTrigger, 11 - } from "@openstatus/ui"; 11 + } from "@openstatus/ui/src/components/collapsible"; 12 12 13 13 import type { Page } from "@/config/pages"; 14 14 import { AppSidebar } from "./app-sidebar"; ··· 30 30 <span className="font-medium text-foreground"> 31 31 {activeChild?.title} 32 32 </span> 33 - <span className="inline-flex h-9 w-9 items-center justify-center rounded-md font-medium text-sm transition-colors disabled:pointer-events-none hover:bg-accent hover:text-accent-foreground disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"> 33 + <span className="inline-flex h-9 w-9 items-center justify-center rounded-md font-medium text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"> 34 34 <ChevronsUpDown className="h-4 w-4" /> 35 35 </span> 36 36 </CollapsibleTrigger>
+1 -1
apps/web/src/components/layout/app-page-with-sidebar-layout.tsx
··· 18 18 19 19 return ( 20 20 <div className="flex w-full flex-1 flex-col gap-6 lg:flex-row lg:gap-8"> 21 - <Shell className="block py-3 lg:hidden md:py-3"> 21 + <Shell className="block py-3 md:py-3 lg:hidden"> 22 22 <AppMenu page={page} /> 23 23 </Shell> 24 24 <Shell className="hidden max-h-[calc(100vh-8rem)] max-w-min shrink-0 lg:sticky lg:top-28 lg:block">
+1 -1
apps/web/src/components/layout/back-button.tsx
··· 2 2 import type { LinkProps } from "next/link"; 3 3 import Link from "next/link"; 4 4 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 interface BackButtonProps extends LinkProps { 8 8 children?: React.ReactNode;
+1 -1
apps/web/src/components/layout/brand-name.tsx
··· 9 9 ContextMenuContent, 10 10 ContextMenuItem, 11 11 ContextMenuTrigger, 12 - } from "@openstatus/ui"; 12 + } from "@openstatus/ui/src/components/context-menu"; 13 13 import Image from "next/image"; 14 14 15 15 export function BrandName() {
+2 -2
apps/web/src/components/layout/login-button.tsx
··· 3 3 import { useSession } from "next-auth/react"; 4 4 import Link from "next/link"; 5 5 6 - import type { ButtonProps } from "@openstatus/ui"; 7 - import { Button } from "@openstatus/ui"; 6 + import type { ButtonProps } from "@openstatus/ui/src/components/button"; 7 + import { Button } from "@openstatus/ui/src/components/button"; 8 8 9 9 import { cn } from "@/lib/utils"; 10 10
+3 -3
apps/web/src/components/layout/marketing-header.tsx
··· 11 11 NavigationMenuList, 12 12 NavigationMenuTrigger, 13 13 navigationMenuTriggerStyle, 14 - } from "@openstatus/ui"; 14 + } from "@openstatus/ui/src/components/navigation-menu"; 15 15 16 16 import { marketingPagesConfig } from "@/config/pages"; 17 17 import { cn } from "@/lib/utils"; ··· 72 72 {title} 73 73 </NavigationMenuTrigger> 74 74 <NavigationMenuContent> 75 - <ul className="grid w-[400px] gap-3 p-4 lg:w-[600px] md:w-[500px] md:grid-cols-2"> 75 + <ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[600px]"> 76 76 {children?.map((item) => { 77 77 const isExternal = item.href.startsWith("http"); 78 78 const _externalProps = isExternal ··· 121 121 <Link 122 122 ref={ref} 123 123 className={cn( 124 - "flex select-none gap-3 space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors focus:bg-accent hover:bg-accent focus:text-accent-foreground hover:text-accent-foreground", 124 + "flex select-none gap-3 space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground", 125 125 className, 126 126 )} 127 127 {...props}
+5 -3
apps/web/src/components/layout/marketing-menu.tsx
··· 9 9 AccordionContent, 10 10 AccordionItem, 11 11 AccordionTrigger, 12 - Button, 12 + } from "@openstatus/ui/src/components/accordion"; 13 + import { Button } from "@openstatus/ui/src/components/button"; 14 + import { 13 15 Sheet, 14 16 SheetContent, 15 17 SheetHeader, 16 18 SheetTitle, 17 19 SheetTrigger, 18 - } from "@openstatus/ui"; 20 + } from "@openstatus/ui/src/components/sheet"; 19 21 20 22 import { marketingPagesConfig } from "@/config/pages"; 21 23 import { socialsConfig } from "@/config/socials"; ··· 131 133 <Link 132 134 ref={ref} 133 135 className={cn( 134 - "flex select-none items-center gap-2 space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors focus:bg-accent hover:bg-accent focus:text-accent-foreground hover:text-accent-foreground", 136 + "flex select-none items-center gap-2 space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground", 135 137 className, 136 138 )} 137 139 {...props}
+1 -1
apps/web/src/components/layout/skeleton-tabs.tsx
··· 1 - import { Skeleton } from "@openstatus/ui"; 1 + import { Skeleton } from "@openstatus/ui/src/components/skeleton"; 2 2 3 3 interface SkeletonTabsProps { 4 4 children?: React.ReactNode;
+1 -1
apps/web/src/components/layout/social-icon-button.tsx
··· 1 1 import Link from "next/link"; 2 2 3 - import { Button } from "@openstatus/ui"; 3 + import { Button } from "@openstatus/ui/src/components/button"; 4 4 5 5 import type { Social } from "@/config/socials"; 6 6 import { Icons } from "../icons";
+2 -2
apps/web/src/components/layout/status-widget-suspense.tsx
··· 3 3 4 4 import type { StatusWidgetProps } from "@openstatus/react"; 5 5 import { StatusWidget } from "@openstatus/react"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 6 7 import { 7 - Button, 8 8 Tooltip, 9 9 TooltipContent, 10 10 TooltipProvider, 11 11 TooltipTrigger, 12 - } from "@openstatus/ui"; 12 + } from "@openstatus/ui/src/components/tooltip"; 13 13 14 14 export function StatusWidgetFallback() { 15 15 return (
+1 -1
apps/web/src/components/marketing/card.tsx
··· 1 - import { Badge } from "@openstatus/ui"; 1 + import { Badge } from "@openstatus/ui/src/components/badge"; 2 2 3 3 import type { FeatureDescription } from "@/config/features"; 4 4 import { cn } from "@/lib/utils";
+1 -1
apps/web/src/components/marketing/faqs.tsx
··· 7 7 AccordionContent, 8 8 AccordionItem, 9 9 AccordionTrigger, 10 - } from "@openstatus/ui"; 10 + } from "@openstatus/ui/src/components/accordion"; 11 11 12 12 import { Mdx } from "../content/mdx"; 13 13 import {
+2 -1
apps/web/src/components/marketing/hero.tsx
··· 2 2 import Link from "next/link"; 3 3 import { Suspense } from "react"; 4 4 5 - import { Badge, Button } from "@openstatus/ui"; 5 + import { Badge } from "@openstatus/ui/src/components/badge"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 6 7 7 8 import { getGitHubStars } from "@/lib/github"; 8 9 import { cn, numberFormatter } from "@/lib/utils";
+1 -1
apps/web/src/components/marketing/in-between-cta.tsx
··· 1 1 import Link from "next/link"; 2 2 3 - import { Button } from "@openstatus/ui"; 3 + import { Button } from "@openstatus/ui/src/components/button"; 4 4 5 5 interface InBetweenCTAProps { 6 6 description: string;
+1 -1
apps/web/src/components/marketing/lastest-changelogs.tsx
··· 1 1 import { allChangelogs } from "contentlayer/generated"; 2 2 import Link from "next/link"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { formatDate } from "@/lib/utils"; 7 7 import {
+1 -1
apps/web/src/components/marketing/monitor/card.tsx
··· 1 1 import Link from "next/link"; 2 2 3 - import { Button } from "@openstatus/ui"; 3 + import { Button } from "@openstatus/ui/src/components/button"; 4 4 5 5 import { cardConfig } from "@/config/features"; 6 6 import {
+1 -1
apps/web/src/components/marketing/pricing/enterprice-plan.tsx
··· 1 - import { Button } from "@openstatus/ui"; 1 + import { Button } from "@openstatus/ui/src/components/button"; 2 2 3 3 export function EnterpricePlan() { 4 4 return (
+6 -2
apps/web/src/components/marketing/pricing/pricing-plan-radio.tsx
··· 2 2 3 3 import { allPlans } from "@openstatus/db/src/schema/plan/config"; 4 4 import { workspacePlans } from "@openstatus/db/src/schema/workspaces/constants"; 5 - import { Label, RadioGroup, RadioGroupItem } from "@openstatus/ui"; 5 + import { Label } from "@openstatus/ui/src/components/label"; 6 + import { 7 + RadioGroup, 8 + RadioGroupItem, 9 + } from "@openstatus/ui/src/components/radio-group"; 6 10 import { useRouter } from "next/navigation"; 7 11 8 12 import useUpdateSearchParams from "@/hooks/use-update-search-params"; ··· 26 30 <Label 27 31 htmlFor={key} 28 32 className={cn( 29 - "flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 [&:has([data-state=checked])]:border-primary peer-data-[state=checked]:border-primary hover:bg-accent hover:text-accent-foreground", 33 + "flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary [&:has([data-state=checked])]:border-primary", 30 34 key === "team" && "bg-muted/50", 31 35 )} 32 36 >
+2 -1
apps/web/src/components/marketing/pricing/pricing-slider.tsx
··· 1 1 "use client"; 2 2 3 3 import { cn } from "@/lib/utils"; 4 - import { InputWithAddons, Slider } from "@openstatus/ui"; 4 + import { InputWithAddons } from "@openstatus/ui/src/components/input-with-addons"; 5 + import { Slider } from "@openstatus/ui/src/components/slider"; 5 6 import { useMemo, useState } from "react"; 6 7 7 8 const MAX_REGIONS = 35;
+3 -3
apps/web/src/components/marketing/pricing/pricing-table.tsx
··· 6 6 7 7 import { workspacePlans } from "@openstatus/db/src/schema/workspaces/constants"; 8 8 import type { WorkspacePlan } from "@openstatus/db/src/schema/workspaces/validation"; 9 + import { Badge } from "@openstatus/ui/src/components/badge"; 10 + import { Button } from "@openstatus/ui/src/components/button"; 9 11 import { 10 - Badge, 11 - Button, 12 12 Table, 13 13 TableBody, 14 14 TableCaption, ··· 16 16 TableHead, 17 17 TableHeader, 18 18 TableRow, 19 - } from "@openstatus/ui"; 19 + } from "@openstatus/ui/src/components/table"; 20 20 import { pricingTableConfig } from "../../../config/pricing-table"; 21 21 22 22 import { LoadingAnimation } from "@/components/loading-animation";
+1 -1
apps/web/src/components/marketing/status-page/tracker-example.tsx
··· 2 2 import { Suspense } from "react"; 3 3 4 4 import { OSTinybird } from "@openstatus/tinybird"; 5 - import { Button } from "@openstatus/ui"; 5 + import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 import { Tracker } from "@/components/tracker/tracker"; 8 8 import { env } from "@/env";
+1 -1
apps/web/src/components/modals/failed-ping-alert-confirmation.tsx
··· 12 12 AlertDialogFooter, 13 13 AlertDialogHeader, 14 14 AlertDialogTitle, 15 - } from "@openstatus/ui"; 15 + } from "@openstatus/ui/src/components/alert-dialog"; 16 16 17 17 import { LoadingAnimation } from "@/components/loading-animation"; 18 18
+1 -1
apps/web/src/components/monitor-charts/region-table.tsx
··· 7 7 TableHead, 8 8 TableHeader, 9 9 TableRow, 10 - } from "@openstatus/ui"; 10 + } from "@openstatus/ui/src/components/table"; 11 11 import { flyRegionsDict } from "@openstatus/utils"; 12 12 13 13 import { formatNumber } from "@/components/monitor-dashboard/metrics-card";
+2 -2
apps/web/src/components/monitor-dashboard/button-reset.tsx
··· 3 3 import { X } from "lucide-react"; 4 4 import { usePathname, useRouter } from "next/navigation"; 5 5 6 + import { Button } from "@openstatus/ui/src/components/button"; 6 7 import { 7 - Button, 8 8 Tooltip, 9 9 TooltipContent, 10 10 TooltipProvider, 11 11 TooltipTrigger, 12 - } from "@openstatus/ui"; 12 + } from "@openstatus/ui/src/components/tooltip"; 13 13 14 14 export function ButtonReset() { 15 15 const router = useRouter();
+3 -3
apps/web/src/components/monitor-dashboard/interval-preset.tsx
··· 3 3 import { HelpCircle } from "lucide-react"; 4 4 import * as React from "react"; 5 5 6 + import { Label } from "@openstatus/ui/src/components/label"; 6 7 import { 7 - Label, 8 8 Popover, 9 9 PopoverContent, 10 10 PopoverTrigger, 11 - Separator, 12 - } from "@openstatus/ui"; 11 + } from "@openstatus/ui/src/components/popover"; 12 + import { Separator } from "@openstatus/ui/src/components/separator"; 13 13 14 14 import { intervals } from "@/lib/monitor/utils"; 15 15 import type { Interval } from "@/lib/monitor/utils";
+1 -1
apps/web/src/components/monitor-dashboard/metrics-card.tsx
··· 2 2 import { cva } from "class-variance-authority"; 3 3 import { ChevronDown, ChevronUp } from "lucide-react"; 4 4 5 - import { Badge } from "@openstatus/ui"; // from @/components/ui/badge 5 + import { Badge } from "@openstatus/ui/src/components/badge"; // from @/components/ui/badge 6 6 7 7 import { cn } from "@/lib/utils"; 8 8
+2 -2
apps/web/src/components/monitor-dashboard/metrics.tsx
··· 44 44 45 45 return ( 46 46 <div className="@container grid gap-6"> 47 - <div className="grid grid-cols-2 gap-4 @3xl:grid-cols-5 @xl:grid-cols-4 @3xl:gap-6"> 47 + <div className="grid @3xl:grid-cols-5 @xl:grid-cols-4 grid-cols-2 @3xl:gap-6 gap-4"> 48 48 <MetricsCard 49 49 title="uptime" 50 50 value={uptime * 100} ··· 76 76 <MetricsCard title="total pings" value={current.count} suffix="#" /> 77 77 </div> 78 78 <div className="grid gap-4"> 79 - <div className="grid grid-cols-2 gap-4 @3xl:grid-cols-5 @xl:grid-cols-4 @3xl:gap-6"> 79 + <div className="grid @3xl:grid-cols-5 @xl:grid-cols-4 grid-cols-2 @3xl:gap-6 gap-4"> 80 80 {metricsOrder.map((key) => { 81 81 const value = current[key]; 82 82 const lastValue = last[key];
+1 -1
apps/web/src/components/monitor-dashboard/pause-button.tsx
··· 5 5 import { useTransition } from "react"; 6 6 7 7 import type { Monitor } from "@openstatus/db/src/schema"; 8 - import { Button } from "@openstatus/ui"; 8 + import { Button } from "@openstatus/ui/src/components/button"; 9 9 10 10 import { LoadingAnimation } from "@/components/loading-animation"; 11 11 import { toastAction } from "@/lib/toast";
+3 -3
apps/web/src/components/monitor-dashboard/quantile-preset.tsx
··· 3 3 import { HelpCircle } from "lucide-react"; 4 4 import * as React from "react"; 5 5 6 + import { Label } from "@openstatus/ui/src/components/label"; 6 7 import { 7 - Label, 8 8 Popover, 9 9 PopoverContent, 10 10 PopoverTrigger, 11 - Separator, 12 - } from "@openstatus/ui"; 11 + } from "@openstatus/ui/src/components/popover"; 12 + import { Separator } from "@openstatus/ui/src/components/separator"; 13 13 14 14 import { quantiles } from "@/lib/monitor/utils"; 15 15 import type { Quantile } from "@/lib/monitor/utils";
+4 -2
apps/web/src/components/monitor-dashboard/region-preset.tsx
··· 5 5 import * as React from "react"; 6 6 7 7 import type { Region } from "@openstatus/tinybird"; 8 + import { Button } from "@openstatus/ui/src/components/button"; 8 9 import { 9 - Button, 10 10 Command, 11 11 CommandEmpty, 12 12 CommandGroup, ··· 14 14 CommandItem, 15 15 CommandList, 16 16 CommandSeparator, 17 + } from "@openstatus/ui/src/components/command"; 18 + import { 17 19 Popover, 18 20 PopoverContent, 19 21 PopoverTrigger, 20 - } from "@openstatus/ui"; 22 + } from "@openstatus/ui/src/components/popover"; 21 23 import { 22 24 type Continent, 23 25 type RegionInfo,
+1 -1
apps/web/src/components/monitor-dashboard/search-params-preset.tsx
··· 6 6 SelectItem, 7 7 SelectTrigger, 8 8 SelectValue, 9 - } from "@openstatus/ui"; 9 + } from "@openstatus/ui/src/components/select"; 10 10 import { usePathname, useRouter } from "next/navigation"; 11 11 import type { ReactNode } from "react"; 12 12
+1 -1
apps/web/src/components/monitor/status-code-badge.tsx
··· 1 - import { Badge } from "@openstatus/ui"; 1 + import { Badge } from "@openstatus/ui/src/components/badge"; 2 2 3 3 import { cn } from "@/lib/utils"; 4 4
+1 -1
apps/web/src/components/monitor/status-dot-with-tooltip.tsx
··· 3 3 TooltipContent, 4 4 TooltipProvider, 5 5 TooltipTrigger, 6 - } from "@openstatus/ui"; 6 + } from "@openstatus/ui/src/components/tooltip"; 7 7 8 8 import type { StatusDotProps } from "./status-dot"; 9 9 import { StatusDot } from "./status-dot";
+2 -2
apps/web/src/components/monitor/tag-badge-with-tooltip.tsx
··· 1 1 import type { MonitorTag } from "@openstatus/db/src/schema"; 2 + import { Badge } from "@openstatus/ui/src/components/badge"; 2 3 import { 3 - Badge, 4 4 Tooltip, 5 5 TooltipContent, 6 6 TooltipProvider, 7 7 TooltipTrigger, 8 - } from "@openstatus/ui"; 8 + } from "@openstatus/ui/src/components/tooltip"; 9 9 10 10 import { TagBadge } from "./tag-badge"; 11 11
+1 -1
apps/web/src/components/monitor/tag-badge.tsx
··· 1 - import { Badge } from "@openstatus/ui"; 1 + import { Badge } from "@openstatus/ui/src/components/badge"; 2 2 3 3 function getStyle(color: string) { 4 4 return {
+1 -1
apps/web/src/components/monitor/visible-icon-with-tooltip.tsx
··· 5 5 TooltipContent, 6 6 TooltipProvider, 7 7 TooltipTrigger, 8 - } from "@openstatus/ui"; 8 + } from "@openstatus/ui/src/components/tooltip"; 9 9 10 10 export function VisibleIconWithTooltip({ visible }: { visible: boolean }) { 11 11 return (
+1 -1
apps/web/src/components/ping-response-analysis/multi-region-table.tsx
··· 8 8 TableHead, 9 9 TableHeader, 10 10 TableRow, 11 - } from "@openstatus/ui"; 11 + } from "@openstatus/ui/src/components/table"; 12 12 13 13 import { 14 14 type ColumnDef,
+1 -1
apps/web/src/components/ping-response-analysis/region-info.tsx
··· 43 43 <p className="text-muted-foreground">Error:</p> 44 44 </div> 45 45 <div className="col-span-3 sm:col-span-6"> 46 - <p className="font-medium text-destructive after:content-['_ยป'] before:content-['ยซ_']"> 46 + <p className="font-medium text-destructive before:content-['ยซ_'] after:content-['_ยป']"> 47 47 {error} 48 48 </p> 49 49 </div>
+1 -1
apps/web/src/components/ping-response-analysis/response-assertion.tsx
··· 11 11 TableHead, 12 12 TableHeader, 13 13 TableRow, 14 - } from "@openstatus/ui"; 14 + } from "@openstatus/ui/src/components/table"; 15 15 16 16 export function ResponseAssertion({ assertions }: { assertions: Assertion[] }) { 17 17 return (
+2 -2
apps/web/src/components/ping-response-analysis/response-header-analysis.tsx
··· 18 18 DialogHeader, 19 19 DialogTitle, 20 20 DialogTrigger, 21 - } from "@openstatus/ui"; 21 + } from "@openstatus/ui/src/components/dialog"; 22 22 23 23 const allowedHeaders = [ 24 24 "Cache-Control", ··· 46 46 47 47 return ( 48 48 <Dialog> 49 - <DialogTrigger className="text-muted-foreground data-[state=open]:text-foreground hover:text-foreground"> 49 + <DialogTrigger className="text-muted-foreground hover:text-foreground data-[state=open]:text-foreground"> 50 50 <Info className="h-4 w-4" /> 51 51 </DialogTrigger> 52 52 <DialogContent className="sm:max-w-2xl">
+1 -1
apps/web/src/components/ping-response-analysis/response-header-table.tsx
··· 6 6 TableHead, 7 7 TableHeader, 8 8 TableRow, 9 - } from "@openstatus/ui"; 9 + } from "@openstatus/ui/src/components/table"; 10 10 11 11 import { CopyToClipboardButton } from "./copy-to-clipboard-button"; 12 12 import { ResponseHeaderAnalysis } from "./response-header-analysis";
+4 -2
apps/web/src/components/ping-response-analysis/response-timing-table.tsx
··· 4 4 Popover, 5 5 PopoverContent, 6 6 PopoverTrigger, 7 + } from "@openstatus/ui/src/components/popover"; 8 + import { 7 9 Table, 8 10 TableBody, 9 11 TableCaption, ··· 11 13 TableHead, 12 14 TableHeader, 13 15 TableRow, 14 - } from "@openstatus/ui"; 16 + } from "@openstatus/ui/src/components/table"; 15 17 16 18 import { timingDict } from "./config"; 17 19 import type { Timing } from "./utils"; ··· 50 52 <p className="text-muted-foreground">{short}</p> 51 53 {!hideInfo ? ( 52 54 <Popover> 53 - <PopoverTrigger className="text-muted-foreground data-[state=open]:text-foreground hover:text-foreground"> 55 + <PopoverTrigger className="text-muted-foreground hover:text-foreground data-[state=open]:text-foreground"> 54 56 <Info className="mr-2 h-4 w-4" /> 55 57 </PopoverTrigger> 56 58 <PopoverContent>
+2 -2
apps/web/src/components/ping-response-analysis/select-region.tsx
··· 4 4 5 5 import type { MonitorFlyRegion } from "@openstatus/db/src/schema/constants"; 6 6 import { flyRegions } from "@openstatus/db/src/schema/constants"; 7 + import { Label } from "@openstatus/ui/src/components/label"; 7 8 import { 8 - Label, 9 9 Select, 10 10 SelectContent, 11 11 SelectItem, 12 12 SelectTrigger, 13 13 SelectValue, 14 - } from "@openstatus/ui"; 14 + } from "@openstatus/ui/src/components/select"; 15 15 16 16 import useUpdateSearchParams from "@/hooks/use-update-search-params"; 17 17 import { regionFormatter } from "./utils";
+2 -2
apps/web/src/components/play/card.tsx
··· 1 1 import type { LucideIcon } from "lucide-react"; 2 2 import Link from "next/link"; 3 3 4 - import { Button } from "@openstatus/ui"; 4 + import { Button } from "@openstatus/ui/src/components/button"; 5 5 6 6 import { Shell } from "@/components/dashboard/shell"; 7 7 import { cn } from "@/lib/utils"; ··· 37 37 return ( 38 38 <Shell 39 39 className={cn( 40 - "group flex flex-col gap-3 hover:dark:border-card-foreground/30 hover:shadow", 40 + "group flex flex-col gap-3 hover:shadow hover:dark:border-card-foreground/30", 41 41 shellClassName, 42 42 className, 43 43 )}
+1 -1
apps/web/src/components/status-page/datetime-tooltip.tsx
··· 6 6 TooltipContent, 7 7 TooltipProvider, 8 8 TooltipTrigger, 9 - } from "@openstatus/ui"; 9 + } from "@openstatus/ui/src/components/tooltip"; 10 10 import { format } from "date-fns"; 11 11 import { formatInTimeZone } from "date-fns-tz"; 12 12 import { useState } from "react";
+2 -1
apps/web/src/components/status-page/day-header.tsx
··· 1 - import { Badge, Separator } from "@openstatus/ui"; 1 + import { Badge } from "@openstatus/ui/src/components/badge"; 2 + import { Separator } from "@openstatus/ui/src/components/separator"; 2 3 import { format } from "date-fns"; 3 4 4 5 export function DayHeader({ date }: { date: Date }) {
+1 -1
apps/web/src/components/status-page/status-report.tsx
··· 8 8 PublicMonitor, 9 9 StatusReportWithUpdates, 10 10 } from "@openstatus/db/src/schema"; 11 - import { Badge } from "@openstatus/ui"; 11 + import { Badge } from "@openstatus/ui/src/components/badge"; 12 12 13 13 import { setPrefixUrl } from "@/app/status-page/[domain]/utils"; 14 14 import { statusDict } from "@/data/incidents-dictionary";
+2 -2
apps/web/src/components/status-update/delete-status-update.tsx
··· 13 13 AlertDialogHeader, 14 14 AlertDialogTitle, 15 15 AlertDialogTrigger, 16 - Button, 17 - } from "@openstatus/ui"; 16 + } from "@openstatus/ui/src/components/alert-dialog"; 17 + import { Button } from "@openstatus/ui/src/components/button"; 18 18 19 19 import { Icons } from "@/components/icons"; 20 20 import { LoadingAnimation } from "@/components/loading-animation";
+2 -2
apps/web/src/components/status-update/edit-status-update.tsx
··· 3 3 import { useState } from "react"; 4 4 5 5 import type { InsertStatusReportUpdate } from "@openstatus/db/src/schema"; 6 + import { Button } from "@openstatus/ui/src/components/button"; 6 7 import { 7 - Button, 8 8 Dialog, 9 9 DialogContent, 10 10 DialogDescription, 11 11 DialogHeader, 12 12 DialogTitle, 13 13 DialogTrigger, 14 - } from "@openstatus/ui"; 14 + } from "@openstatus/ui/src/components/dialog"; 15 15 16 16 import { StatusReportUpdateForm } from "../forms/status-report-update/form"; 17 17 import { Icons } from "../icons";
+2 -2
apps/web/src/components/status-update/events.tsx
··· 4 4 import * as React from "react"; 5 5 6 6 import type { StatusReportUpdate } from "@openstatus/db/src/schema"; 7 - import { Button } from "@openstatus/ui"; 7 + import { Button } from "@openstatus/ui/src/components/button"; 8 8 9 9 import { Icons } from "@/components/icons"; 10 10 import { statusDict } from "@/data/incidents-dictionary"; ··· 59 59 </div> 60 60 <div className="mt-1 grid flex-1"> 61 61 {editable ? ( 62 - <div className="absolute top-2 right-2 hidden gap-2 group-active:flex group-hover:flex"> 62 + <div className="absolute top-2 right-2 hidden gap-2 group-hover:flex group-active:flex"> 63 63 <EditStatusReportUpdateIconButton 64 64 statusReportId={update.statusReportId} 65 65 statusReportUpdate={update}
+1 -1
apps/web/src/components/status-update/status-badge.tsx
··· 1 1 import type { StatusReport } from "@openstatus/db/src/schema"; 2 - import { Badge } from "@openstatus/ui"; 2 + import { Badge } from "@openstatus/ui/src/components/badge"; 3 3 4 4 import { statusDict } from "@/data/incidents-dictionary"; 5 5 import { cn } from "@/lib/utils";
+1 -1
apps/web/src/components/status-update/summary.tsx
··· 5 5 StatusReport, 6 6 StatusReportUpdate, 7 7 } from "@openstatus/db/src/schema"; 8 - import { Badge } from "@openstatus/ui"; 8 + import { Badge } from "@openstatus/ui/src/components/badge"; 9 9 10 10 import { StatusBadge } from "./status-badge"; 11 11
+2 -2
apps/web/src/components/support/bubble.tsx
··· 4 4 import { useState } from "react"; 5 5 6 6 import { 7 - Button, 8 7 Popover, 9 8 PopoverContent, 10 9 PopoverTrigger, 11 - } from "@openstatus/ui"; 10 + } from "@openstatus/ui/src/components/popover"; 12 11 12 + import { Button } from "@openstatus/ui/src/components/button"; 13 13 import { useSession } from "next-auth/react"; 14 14 import { ContactForm } from "./contact-form"; 15 15
+2 -2
apps/web/src/components/theme-toggle.tsx
··· 3 3 import { useTheme } from "next-themes"; 4 4 import * as React from "react"; 5 5 6 + import { Button } from "@openstatus/ui/src/components/button"; 6 7 import { 7 - Button, 8 8 DropdownMenu, 9 9 DropdownMenuContent, 10 10 DropdownMenuItem, 11 11 DropdownMenuTrigger, 12 - } from "@openstatus/ui"; 12 + } from "@openstatus/ui/src/components/dropdown-menu"; 13 13 14 14 import { Icons } from "@/components/icons"; 15 15
+7 -5
apps/web/src/components/tracker/tracker.tsx
··· 20 20 startOfDay, 21 21 } from "@openstatus/tracker"; 22 22 import { 23 - HoverCard, 24 - HoverCardContent, 25 - HoverCardTrigger, 26 - Separator, 27 23 Tooltip, 28 24 TooltipContent, 29 25 TooltipProvider, 30 26 TooltipTrigger, 31 - } from "@openstatus/ui"; 27 + } from "@openstatus/ui/src/components/tooltip"; 32 28 33 29 import { cn } from "@/lib/utils"; 30 + import { 31 + HoverCard, 32 + HoverCardContent, 33 + HoverCardTrigger, 34 + } from "@openstatus/ui/src/components/hover-card"; 35 + import { Separator } from "@openstatus/ui/src/components/separator"; 34 36 35 37 const tracker = cva("h-10 rounded-full flex-1", { 36 38 variants: {
+3 -3
apps/web/src/components/workspace/select-workspace.tsx
··· 6 6 import * as React from "react"; 7 7 8 8 import type { Workspace } from "@openstatus/db/src/schema"; 9 + import { Button } from "@openstatus/ui/src/components/button"; 9 10 import { 10 - Button, 11 11 DropdownMenu, 12 12 DropdownMenuContent, 13 13 DropdownMenuItem, 14 14 DropdownMenuLabel, 15 15 DropdownMenuSeparator, 16 16 DropdownMenuTrigger, 17 - Skeleton, 18 - } from "@openstatus/ui"; 17 + } from "@openstatus/ui/src/components/dropdown-menu"; 18 + import { Skeleton } from "@openstatus/ui/src/components/skeleton"; 19 19 20 20 import { api } from "@/trpc/client"; 21 21
+2 -1
apps/web/src/lib/auth/index.ts
··· 4 4 import { analytics, trackAnalytics } from "@openstatus/analytics"; 5 5 import { db, eq } from "@openstatus/db"; 6 6 import { user } from "@openstatus/db/src/schema"; 7 - import { WelcomeEmail, sendEmail } from "@openstatus/emails"; 7 + import { sendEmail } from "@openstatus/emails/emails/send"; 8 8 9 9 import { identifyUser } from "@/providers/posthog"; 10 + import { WelcomeEmail } from "@openstatus/emails/emails/welcome"; 10 11 import { adapter } from "./adapter"; 11 12 import { GitHubProvider, GoogleProvider, ResendProvider } from "./providers"; 12 13
+2 -1
apps/web/src/middleware.ts
··· 1 1 import { NextResponse } from "next/server"; 2 2 3 - import { db, eq } from "@openstatus/db"; 3 + import { db } from "@openstatus/db/src/db"; 4 4 import { user, usersToWorkspaces, workspace } from "@openstatus/db/src/schema"; 5 5 6 6 import { auth } from "@/lib/auth"; 7 + import { eq } from "@openstatus/db"; 7 8 import { env } from "./env"; 8 9 9 10 export const getValidSubdomain = (host?: string | null) => {
+2 -2
package.json
··· 12 12 "test": "turbo run test" 13 13 }, 14 14 "devDependencies": { 15 - "@biomejs/biome": "1.7.3", 15 + "@biomejs/biome": "1.8.3", 16 16 "@turbo/gen": "1.13.3", 17 17 "@types/node": "20.8.0", 18 - "knip": "^5.16.0", 18 + "knip": "5.16.0", 19 19 "turbo": "1.13.3", 20 20 "typescript": "5.5.2" 21 21 },
+3 -3
packages/react/src/widget.tsx
··· 36 36 37 37 return ( 38 38 <a 39 - className="inline-flex max-w-fit items-center gap-2 rounded-md border border-gray-200 px-3 py-1 text-gray-700 text-sm dark:border-gray-800 dark:hover:bg-gray-900 hover:bg-gray-100 dark:hover:text-white dark:text-gray-300 hover:text-black" 39 + className="inline-flex max-w-fit items-center gap-2 rounded-md border border-gray-200 px-3 py-1 text-gray-700 text-sm hover:bg-gray-100 hover:text-black dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-900 dark:hover:text-white" 40 40 href={href || `https://${slug}.openstatus.dev`} 41 41 target="_blank" 42 42 rel="noreferrer" ··· 45 45 <span className="relative flex h-2 w-2"> 46 46 {status === "operational" ? ( 47 47 <span 48 - // biome-ignore lint/nursery/useSortedClasses: <explanation> 48 + // biome-ignore lint/nursery/useSortedClasses: color is a dynamic value 49 49 className={`absolute inline-flex h-full w-full animate-ping rounded-full ${color} opacity-75 duration-1000`} 50 50 /> 51 51 ) : null} 52 52 <span 53 - // biome-ignore lint/nursery/useSortedClasses: <explanation> 53 + // biome-ignore lint/nursery/useSortedClasses: color is a dynamic value 54 54 className={`relative inline-flex h-2 w-2 rounded-full ${color}`} 55 55 /> 56 56 </span>
packages/ui/src/components/collabsible.tsx packages/ui/src/components/collapsible.tsx
+1 -1
packages/ui/src/index.tsx
··· 34 34 export * from "./components/sheet"; 35 35 export * from "./components/multi-select"; 36 36 export * from "./components/toggle"; 37 - export * from "./components/collabsible"; 37 + export * from "./components/collapsible"; 38 38 export * from "./components/sonner"; 39 39 export * from "./components/sortable"; 40 40 export * from "./components/navigation-menu";
+91 -3
pnpm-lock.yaml
··· 9 9 .: 10 10 devDependencies: 11 11 '@biomejs/biome': 12 - specifier: 1.7.3 13 - version: 1.7.3 12 + specifier: 1.8.3 13 + version: 1.8.3 14 14 '@turbo/gen': 15 15 specifier: 1.13.3 16 16 version: 1.13.3(@types/node@20.8.0)(typescript@5.5.2) ··· 18 18 specifier: 20.8.0 19 19 version: 20.8.0 20 20 knip: 21 - specifier: ^5.16.0 21 + specifier: 5.16.0 22 22 version: 5.16.0(@types/node@20.8.0)(typescript@5.5.2) 23 23 turbo: 24 24 specifier: 1.13.3 ··· 2044 2044 engines: {node: '>=14.21.3'} 2045 2045 hasBin: true 2046 2046 2047 + '@biomejs/biome@1.8.3': 2048 + resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} 2049 + engines: {node: '>=14.21.3'} 2050 + hasBin: true 2051 + 2047 2052 '@biomejs/cli-darwin-arm64@1.7.3': 2048 2053 resolution: {integrity: sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==} 2049 2054 engines: {node: '>=14.21.3'} 2050 2055 cpu: [arm64] 2051 2056 os: [darwin] 2052 2057 2058 + '@biomejs/cli-darwin-arm64@1.8.3': 2059 + resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==} 2060 + engines: {node: '>=14.21.3'} 2061 + cpu: [arm64] 2062 + os: [darwin] 2063 + 2053 2064 '@biomejs/cli-darwin-x64@1.7.3': 2054 2065 resolution: {integrity: sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==} 2055 2066 engines: {node: '>=14.21.3'} 2056 2067 cpu: [x64] 2057 2068 os: [darwin] 2058 2069 2070 + '@biomejs/cli-darwin-x64@1.8.3': 2071 + resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==} 2072 + engines: {node: '>=14.21.3'} 2073 + cpu: [x64] 2074 + os: [darwin] 2075 + 2059 2076 '@biomejs/cli-linux-arm64-musl@1.7.3': 2060 2077 resolution: {integrity: sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==} 2061 2078 engines: {node: '>=14.21.3'} 2062 2079 cpu: [arm64] 2063 2080 os: [linux] 2064 2081 2082 + '@biomejs/cli-linux-arm64-musl@1.8.3': 2083 + resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==} 2084 + engines: {node: '>=14.21.3'} 2085 + cpu: [arm64] 2086 + os: [linux] 2087 + 2065 2088 '@biomejs/cli-linux-arm64@1.7.3': 2066 2089 resolution: {integrity: sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==} 2067 2090 engines: {node: '>=14.21.3'} 2068 2091 cpu: [arm64] 2069 2092 os: [linux] 2070 2093 2094 + '@biomejs/cli-linux-arm64@1.8.3': 2095 + resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==} 2096 + engines: {node: '>=14.21.3'} 2097 + cpu: [arm64] 2098 + os: [linux] 2099 + 2071 2100 '@biomejs/cli-linux-x64-musl@1.7.3': 2072 2101 resolution: {integrity: sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==} 2073 2102 engines: {node: '>=14.21.3'} 2074 2103 cpu: [x64] 2075 2104 os: [linux] 2076 2105 2106 + '@biomejs/cli-linux-x64-musl@1.8.3': 2107 + resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==} 2108 + engines: {node: '>=14.21.3'} 2109 + cpu: [x64] 2110 + os: [linux] 2111 + 2077 2112 '@biomejs/cli-linux-x64@1.7.3': 2078 2113 resolution: {integrity: sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==} 2079 2114 engines: {node: '>=14.21.3'} 2080 2115 cpu: [x64] 2081 2116 os: [linux] 2082 2117 2118 + '@biomejs/cli-linux-x64@1.8.3': 2119 + resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==} 2120 + engines: {node: '>=14.21.3'} 2121 + cpu: [x64] 2122 + os: [linux] 2123 + 2083 2124 '@biomejs/cli-win32-arm64@1.7.3': 2084 2125 resolution: {integrity: sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==} 2126 + engines: {node: '>=14.21.3'} 2127 + cpu: [arm64] 2128 + os: [win32] 2129 + 2130 + '@biomejs/cli-win32-arm64@1.8.3': 2131 + resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==} 2085 2132 engines: {node: '>=14.21.3'} 2086 2133 cpu: [arm64] 2087 2134 os: [win32] 2088 2135 2089 2136 '@biomejs/cli-win32-x64@1.7.3': 2090 2137 resolution: {integrity: sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==} 2138 + engines: {node: '>=14.21.3'} 2139 + cpu: [x64] 2140 + os: [win32] 2141 + 2142 + '@biomejs/cli-win32-x64@1.8.3': 2143 + resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==} 2091 2144 engines: {node: '>=14.21.3'} 2092 2145 cpu: [x64] 2093 2146 os: [win32] ··· 11661 11714 '@biomejs/cli-win32-arm64': 1.7.3 11662 11715 '@biomejs/cli-win32-x64': 1.7.3 11663 11716 11717 + '@biomejs/biome@1.8.3': 11718 + optionalDependencies: 11719 + '@biomejs/cli-darwin-arm64': 1.8.3 11720 + '@biomejs/cli-darwin-x64': 1.8.3 11721 + '@biomejs/cli-linux-arm64': 1.8.3 11722 + '@biomejs/cli-linux-arm64-musl': 1.8.3 11723 + '@biomejs/cli-linux-x64': 1.8.3 11724 + '@biomejs/cli-linux-x64-musl': 1.8.3 11725 + '@biomejs/cli-win32-arm64': 1.8.3 11726 + '@biomejs/cli-win32-x64': 1.8.3 11727 + 11664 11728 '@biomejs/cli-darwin-arm64@1.7.3': 11729 + optional: true 11730 + 11731 + '@biomejs/cli-darwin-arm64@1.8.3': 11665 11732 optional: true 11666 11733 11667 11734 '@biomejs/cli-darwin-x64@1.7.3': 11668 11735 optional: true 11669 11736 11737 + '@biomejs/cli-darwin-x64@1.8.3': 11738 + optional: true 11739 + 11670 11740 '@biomejs/cli-linux-arm64-musl@1.7.3': 11671 11741 optional: true 11672 11742 11743 + '@biomejs/cli-linux-arm64-musl@1.8.3': 11744 + optional: true 11745 + 11673 11746 '@biomejs/cli-linux-arm64@1.7.3': 11747 + optional: true 11748 + 11749 + '@biomejs/cli-linux-arm64@1.8.3': 11674 11750 optional: true 11675 11751 11676 11752 '@biomejs/cli-linux-x64-musl@1.7.3': 11677 11753 optional: true 11678 11754 11755 + '@biomejs/cli-linux-x64-musl@1.8.3': 11756 + optional: true 11757 + 11679 11758 '@biomejs/cli-linux-x64@1.7.3': 11680 11759 optional: true 11681 11760 11761 + '@biomejs/cli-linux-x64@1.8.3': 11762 + optional: true 11763 + 11682 11764 '@biomejs/cli-win32-arm64@1.7.3': 11683 11765 optional: true 11684 11766 11767 + '@biomejs/cli-win32-arm64@1.8.3': 11768 + optional: true 11769 + 11685 11770 '@biomejs/cli-win32-x64@1.7.3': 11771 + optional: true 11772 + 11773 + '@biomejs/cli-win32-x64@1.8.3': 11686 11774 optional: true 11687 11775 11688 11776 '@chronark/zod-bird@0.3.6':