···44import { formatDistance } from "date-fns";
5566import type { Ping } from "@openstatus/tinybird";
77-88-import { Badge } from "@/components/ui/badge";
99-import { Button } from "@/components/ui/button";
107import {
88+ Badge,
99+ Button,
1110 Table,
1211 TableBody,
1312 TableCaption,
···1514 TableHead,
1615 TableHeader,
1716 TableRow,
1818-} from "@/components/ui/table";
1717+} from "@openstatus/ui";
1818+1919import { cn } from "@/lib/utils";
20202121export function EventTable({ events }: { events: Ping[] }) {
+2-2
apps/web/src/app/_components/hero-form.tsx
···11"use client";
2233-import { Input } from "@/components/ui/input";
44-import { toast } from "@/components/ui/use-toast";
33+import { Input, toast } from "@openstatus/ui";
44+55import { addToWaitlist, sendWaitingListEmail } from "../action";
66import { SubmitButton } from "./submit-button";
77
+1-2
apps/web/src/app/_components/input-search.tsx
···44import { Command as CommandPrimitive, useCommandState } from "cmdk";
5566import type { Ping } from "@openstatus/tinybird";
77-87import {
98 Command,
109 CommandEmpty,
1110 CommandGroup,
1211 CommandItem,
1313-} from "@/components/ui/command";
1212+} from "@openstatus/ui";
14131514// TODO: once stable, use the shallow route to store the search params inside of the search params
1615
+2-1
apps/web/src/app/_components/submit-button.tsx
···2233import { experimental_useFormStatus as useFormStatus } from "react-dom";
4455+import { Button } from "@openstatus/ui";
66+57import { LoadingAnimation } from "@/components/loading-animation";
66-import { Button } from "@/components/ui/button";
7889export function SubmitButton() {
910 const { pending } = useFormStatus();
···11import Link from "next/link";
2233+import { Button } from "@openstatus/ui";
44+35import { EmptyState as DefaultEmptyState } from "@/components/dashboard/empty-state";
44-import { Button } from "@/components/ui/button";
5667export function EmptyState() {
78 return (
···2233import * as React from "react";
4455+import { Badge, Button } from "@openstatus/ui";
66+57import { Container } from "@/components/dashboard/container";
68import { Header } from "@/components/dashboard/header";
77-import { Badge } from "@/components/ui/badge";
88-import { Button } from "@/components/ui/button";
99import { api } from "@/trpc/client";
10101111export default async function IncidentPage({
···11import Link from "next/link";
2233+import { Button } from "@openstatus/ui";
44+35import { EmptyState as DefaultEmptyState } from "@/components/dashboard/empty-state";
44-import { Button } from "@/components/ui/button";
5667export function EmptyState() {
78 return (
···11import { notFound } from "next/navigation";
22import * as z from "zod";
3344+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@openstatus/ui";
55+46import { Header } from "@/components/dashboard/header";
57import { MonitorForm } from "@/components/forms/montitor-form";
68import { api } from "@/trpc/server";
···22import Link from "next/link";
3344import { allPlans } from "@openstatus/plans";
55+import { Badge, ButtonWithDisableTooltip } from "@openstatus/ui";
5667import { Container } from "@/components/dashboard/container";
78import { Header } from "@/components/dashboard/header";
89import { Limit } from "@/components/dashboard/limit";
99-import { Badge } from "@/components/ui/badge";
1010-import { ButtonWithDisableTooltip } from "@/components/ui/button-with-disable-tooltip";
1110import { cn } from "@/lib/utils";
1211import { api } from "@/trpc/server";
1312import { ActionButton } from "./_components/action-button";
···22import type * as z from "zod";
3344import type { allMonitorsSchema } from "@openstatus/db/src/schema";
55+import { Button } from "@openstatus/ui";
5667import { EmptyState as DefaultEmptyState } from "@/components/dashboard/empty-state";
77-import { Button } from "@/components/ui/button";
8899export function EmptyState({
1010 allMonitors,
···22import { notFound } from "next/navigation";
33import * as z from "zod";
4455+import { Button } from "@openstatus/ui";
66+57import { Header } from "@/components/dashboard/header";
68import { MonitorForm } from "@/components/forms/montitor-form";
79import { StatusPageForm } from "@/components/forms/status-page-form";
88-import { Button } from "@/components/ui/button";
910import { api } from "@/trpc/server";
1011import { Description } from "./_components/description";
1112import { Path } from "./_components/path";
+2-1
apps/web/src/app/blog/[slug]/page.tsx
···33import { notFound } from "next/navigation";
44import { allPosts } from "contentlayer/generated";
5566+import { Avatar, AvatarFallback, AvatarImage } from "@openstatus/ui";
77+68import {
79 defaultMetadata,
810 ogMetadata,
···1113import { Mdx } from "@/components/content/mdx";
1214import { Shell } from "@/components/dashboard/shell";
1315import { BackButton } from "@/components/layout/back-button";
1414-import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
1516import { formatDate } from "@/lib/utils";
16171718export const dynamic = "force-static";
+2-1
apps/web/src/app/layout.tsx
···66import { ClerkProvider } from "@clerk/nextjs";
77import PlausibleProvider from "next-plausible";
8899+import { Toaster } from "@openstatus/ui";
1010+911import {
1012 defaultMetadata,
1113 ogMetadata,
1214 twitterMetadata,
1315} from "@/app/shared-metadata";
1416import { TailwindIndicator } from "@/components/tailwind-indicator";
1515-import { Toaster } from "@/components/ui/toaster";
1617import { ClientAnalytics } from "./_components/analytics";
1718import Background from "./_components/background";
1819
+2-1
apps/web/src/app/not-found.tsx
···11import Link from "next/link";
2233+import { Button } from "@openstatus/ui";
44+35import { Header } from "@/components/dashboard/header";
46import { Shell } from "@/components/dashboard/shell";
55-import { Button } from "@/components/ui/button";
6778export default function NotFound() {
89 return (
+4-3
apps/web/src/app/oss-friends/page.tsx
···11import Link from "next/link";
22import { z } from "zod";
3344-import { Icons } from "@/components/icons";
55-import { MarketingLayout } from "@/components/layout/marketing-layout";
64import {
75 Card,
86 CardDescription,
97 CardFooter,
108 CardHeader,
119 CardTitle,
1212-} from "@/components/ui/card";
1010+} from "@openstatus/ui";
1111+1212+import { Icons } from "@/components/icons";
1313+import { MarketingLayout } from "@/components/layout/marketing-layout";
13141415const OSSFriendSchema = z.object({
1516 href: z.string(),
+2-2
apps/web/src/app/page.tsx
···11import Link from "next/link";
22import { ChevronRight } from "lucide-react";
3344+import { Badge, Button } from "@openstatus/ui";
55+46import { Shell } from "@/components/dashboard/shell";
57import { MarketingLayout } from "@/components/layout/marketing-layout";
68import { Cards } from "@/components/marketing/cards";
79import { FAQs } from "@/components/marketing/faqs";
810import { Plans } from "@/components/marketing/plans";
911import { Tracker } from "@/components/tracker";
1010-import { Badge } from "@/components/ui/badge";
1111-import { Button } from "@/components/ui/button";
1212import { getHomeMonitorListData } from "@/lib/tb";
13131414export const revalidate = 600;
···33import Link from "next/link";
44import { usePathname, useSelectedLayoutSegment } from "next/navigation";
5566-import { Button } from "@/components/ui/button";
66+import { Button } from "@openstatus/ui";
7788export default function NavigationLink({
99 slug,
···33import Link from "next/link";
44import { useUser } from "@clerk/nextjs";
5566-import { Button } from "@/components/ui/button";
66+import { Button } from "@openstatus/ui";
7788// Create a button only displayed if you are logged in and are the owner of the status page
99export function UserButton() {
+3-2
apps/web/src/components/dashboard/container.tsx
···55 CardFooter,
66 CardHeader,
77 CardTitle,
88-} from "@/components/ui/card";
88+ Skeleton,
99+} from "@openstatus/ui";
1010+911import { cn } from "@/lib/utils";
1010-import { Skeleton } from "../ui/skeleton";
11121213interface CardProps
1314 extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
+2-1
apps/web/src/components/dashboard/header.tsx
···11+import { Skeleton } from "@openstatus/ui";
22+13import { cn } from "@/lib/utils";
22-import { Skeleton } from "../ui/skeleton";
3445interface HeaderProps extends React.HTMLAttributes<HTMLDivElement> {
56 title: string;
+1-1
apps/web/src/components/data-table/columns.tsx
···44import { format } from "date-fns";
5566import type { Ping } from "@openstatus/tinybird";
77+import { Badge } from "@openstatus/ui";
7888-import { Badge } from "@/components/ui/badge";
99import { regionsDict } from "@/data/regions-dictionary";
1010import { cn } from "@/lib/utils";
1111import { DataTableColumnHeader } from "./data-table-column-header";
···33import type { Table } from "@tanstack/react-table";
44import { X } from "lucide-react";
5566-import { Button } from "@/components/ui/button";
66+import { Button } from "@openstatus/ui";
77+78import { regionsDict } from "@/data/regions-dictionary";
89import { DataTableDateRangePicker } from "./data-table-date-ranger-picker";
910import { DataTableFacetedFilter } from "./data-table-faceted-filter";
+2-1
apps/web/src/components/data-table/data-table.tsx
···2222 TableHead,
2323 TableHeader,
2424 TableRow,
2525-} from "@/components/ui/table";
2525+} from "@openstatus/ui";
2626+2627import { DataTablePagination } from "./data-table-pagination";
2728import { DataTableToolbar } from "./data-table-toolbar";
2829
···11import type * as z from "zod";
2233import type { selectPublicMonitorSchema } from "@openstatus/db/src/schema";
44-55-import { Badge } from "../ui/badge";
44+import { Badge } from "@openstatus/ui";
6576export function AffectedMonitors({
87 monitors,
+4-4
apps/web/src/components/incidents/events.tsx
···66import type * as z from "zod";
7788import type { selectIncidentUpdateSchema } from "@openstatus/db/src/schema";
99-1010-import { Icons } from "@/components/icons";
1111-import { Button } from "@/components/ui/button";
129import {
1010+ Button,
1311 Tooltip,
1412 TooltipContent,
1513 TooltipProvider,
1614 TooltipTrigger,
1717-} from "@/components/ui/tooltip";
1515+} from "@openstatus/ui";
1616+1717+import { Icons } from "@/components/icons";
1818import { statusDict } from "@/data/incidents-dictionary";
1919import { useProcessor } from "@/hooks/use-preprocessor";
2020import { cn } from "@/lib/utils";
···11+import { Badge } from "@openstatus/ui";
22+13import { statusDict } from "@/data/incidents-dictionary";
24import { cn } from "@/lib/utils";
35import { Icons } from "../icons";
44-import { Badge } from "../ui/badge";
5667export function StatusBadge({ status }: { status: keyof typeof statusDict }) {
78 const { label, icon } = statusDict[status];
+2-2
apps/web/src/components/layout/app-header.tsx
···33import Link from "next/link";
44import { UserButton, useUser } from "@clerk/nextjs";
5566+import { Button, Skeleton } from "@openstatus/ui";
77+68import { socialsConfig } from "@/config/socials";
79import { Shell } from "../dashboard/shell";
810import { Icons } from "../icons";
99-import { Button } from "../ui/button";
1010-import { Skeleton } from "../ui/skeleton";
11111212/**
1313 * TODO: work on a better breadcrumb navigation like Vercel
+3-2
apps/web/src/components/layout/app-menu.tsx
···44import { usePathname, useSearchParams } from "next/navigation";
55import { Menu } from "lucide-react";
6677-import { Button } from "../ui/button";
87import {
88+ Button,
99 Sheet,
1010 SheetContent,
1111 SheetHeader,
1212 SheetTitle,
1313 SheetTrigger,
1414-} from "../ui/sheet";
1414+} from "@openstatus/ui";
1515+1516import { AppSidebar } from "./app-sidebar";
16171718export function AppMenu() {
+1-1
apps/web/src/components/layout/back-button.tsx
···22import Link from "next/link";
33import { ChevronLeft } from "lucide-react";
4455-import { Button } from "../ui/button";
55+import { Button } from "@openstatus/ui";
6677interface BackButtonProps extends LinkProps {
88 children?: React.ReactNode;
+1-1
apps/web/src/components/layout/brand-name.tsx
···66 ContextMenuContent,
77 ContextMenuItem,
88 ContextMenuTrigger,
99-} from "@/components/ui/context-menu";
99+} from "@openstatus/ui";
10101111export function BrandName() {
1212 return (
···33import Link from "next/link";
44import { useUser } from "@clerk/nextjs";
5566-import { Button } from "@/components/ui/button";
66+import { Button } from "@openstatus/ui";
77+78import { cn } from "@/lib/utils";
89import { BrandName } from "./brand-name";
910
+1-1
apps/web/src/components/layout/skeleton-tabs.tsx
···11-import { Skeleton } from "@/components/ui/skeleton";
11+import { Skeleton } from "@openstatus/ui";
2233interface SkeletonTabsProps {
44 children?: React.ReactNode;
+2-1
apps/web/src/components/marketing/cards.tsx
···11+import { Badge } from "@openstatus/ui";
22+13import { Shell } from "../dashboard/shell";
24import { Icons } from "../icons";
35import type { ValidIcon } from "../icons";
44-import { Badge } from "../ui/badge";
5667const cardConfig: {
78 icon: ValidIcon;
+1-1
apps/web/src/components/marketing/faqs.tsx
···33 AccordionContent,
44 AccordionItem,
55 AccordionTrigger,
66-} from "@/components/ui/accordion";
66+} from "@openstatus/ui";
7788// REMINDER: we can create a contentlayer document and the faq into it
99const faqsConfig: Record<"q" | "a", string>[] = [
+2-1
apps/web/src/components/marketing/plans.tsx
···11import Link from "next/link";
22import { Check } from "lucide-react";
3344+import { Button } from "@openstatus/ui";
55+46import type { PlanProps } from "@/config/plans";
57import { plansConfig } from "@/config/plans";
68import { cn } from "@/lib/utils";
79import { Shell } from "../dashboard/shell";
810import { LoadingAnimation } from "../loading-animation";
99-import { Button } from "../ui/button";
10111112export function Plans() {
1213 return (
···22import type { z } from "zod";
3344import type { selectPublicMonitorSchema } from "@openstatus/db/src/schema";
55+import { Button } from "@openstatus/ui";
5667import { EmptyState } from "../dashboard/empty-state";
77-import { Button } from "../ui/button";
88import { Monitor } from "./monitor";
991010export const MonitorList = ({
+3-5
apps/web/src/components/tracker.tsx
···77import { Eye, Info } from "lucide-react";
8899import type { Monitor } from "@openstatus/tinybird";
1010-1110import {
1211 HoverCard,
1312 HoverCardContent,
1413 HoverCardTrigger,
1515-} from "@/components/ui/hover-card";
1616-import { Separator } from "@/components/ui/separator";
1717-import {
1414+ Separator,
1815 Tooltip,
1916 TooltipContent,
2017 TooltipProvider,
2118 TooltipTrigger,
2222-} from "@/components/ui/tooltip";
1919+} from "@openstatus/ui";
2020+2321import useWindowSize from "@/hooks/use-window-size";
2422import { blacklistDates, getMonitorList, getStatus } from "@/lib/tracker";
2523
···44import * as DialogPrimitive from "@radix-ui/react-dialog";
55import { X } from "lucide-react";
6677-import { cn } from "@/lib/utils";
77+import { cn } from "../lib/utils";
8899const Dialog = DialogPrimitive.Root;
1010
···33import * as React from "react";
44import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
5566-import { cn } from "@/lib/utils";
66+import { cn } from "../lib/utils";
7788const HoverCard = HoverCardPrimitive.Root;
99
···11import * as React from "react";
2233-import { cn } from "@/lib/utils";
33+import { cn } from "../lib/utils";
4455export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
66
···33import * as React from "react";
44import * as PopoverPrimitive from "@radix-ui/react-popover";
5566-import { cn } from "@/lib/utils";
66+import { cn } from "../lib/utils";
7788const Popover = PopoverPrimitive.Root;
99
···66import type { VariantProps } from "class-variance-authority";
77import { X } from "lucide-react";
8899-import { cn } from "@/lib/utils";
99+import { cn } from "../lib/utils";
10101111const Sheet = SheetPrimitive.Root;
1212
···33import * as React from "react";
44import * as TabsPrimitive from "@radix-ui/react-tabs";
5566-import { cn } from "@/lib/utils";
66+import { cn } from "../lib/utils";
7788const Tabs = TabsPrimitive.Root;
99
···11import * as React from "react";
2233-import { cn } from "@/lib/utils";
33+import { cn } from "../lib/utils";
4455export type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>;
66
···11+"use client";
22+13import * as React from "react";
24import * as ToastPrimitives from "@radix-ui/react-toast";
35import { cva } from "class-variance-authority";
46import type { VariantProps } from "class-variance-authority";
57import { X } from "lucide-react";
6877-import { cn } from "@/lib/utils";
99+import { cn } from "../lib/utils";
810911const ToastProvider = ToastPrimitives.Provider;
1012
···33import * as React from "react";
44import * as TooltipPrimitive from "@radix-ui/react-tooltip";
5566-import { cn } from "@/lib/utils";
66+import { cn } from "../lib/utils";
7788const TooltipProvider = TooltipPrimitive.Provider;
99