Skip to content
74 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Workspace names and icons, and a component kit for every control1import { X } from "lucide-react";
2import { Dialog as Primitive } from "radix-ui";
3import type { ComponentProps } from "react";
4
5import { cn } from "../../lib/cn";
6
7// shadcn/ui's dialog, styled with g1t's tokens.
8
9export const Dialog = Primitive.Root;
10export const DialogTrigger = Primitive.Trigger;
11export const DialogClose = Primitive.Close;
12export const DialogPortal = Primitive.Portal;
13
14export function DialogOverlay({ className, ...props }: ComponentProps<typeof Primitive.Overlay>) {
15 return (
16 <Primitive.Overlay
17 className={cn(
18 "fixed inset-0 z-50 bg-black/60 backdrop-blur-[2px]",
19 "data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out motion-reduce:animate-none",
20 className,
21 )}
22 {...props}
23 />
24 );
25}
26
Phones reach every page: each mode's menu from the top bar or by tapping the tab you're on, Docs first in the avatar sheet, a project's pages as a swipeable strip; dialogs as bottom sheets above the keyboard, safe areas, menus kept on screen, 40px targets, touch-visible controls, save bars above the tab bar27/**
28 * The panel, centred. On a phone (below 640px) it is a sheet from the
29 * bottom instead, the full width, clear of the home indicator and sitting
30 * on the keyboard while it is up (`--keyboard-inset`, components/mobile.tsx).
31 */
Workspace names and icons, and a component kit for every control32export const DIALOG_PANEL =
Phones reach every page: each mode's menu from the top bar or by tapping the tab you're on, Docs first in the avatar sheet, a project's pages as a swipeable strip; dialogs as bottom sheets above the keyboard, safe areas, menus kept on screen, 40px targets, touch-visible controls, save bars above the tab bar33 "fixed top-1/2 left-1/2 z-50 grid max-h-[calc(100dvh-2rem)] w-[calc(100vw-2rem)] max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto overscroll-contain rounded-xl border border-line-strong bg-surface p-6 text-fg shadow-2xl shadow-black/60 outline-none data-[state=open]:animate-dialog-in data-[state=closed]:animate-dialog-out motion-reduce:animate-none " +
34 "max-sm:top-auto max-sm:bottom-(--keyboard-inset,0px) max-sm:left-0 max-sm:w-full max-sm:max-w-none max-sm:translate-x-0 max-sm:translate-y-0 max-sm:max-h-[calc(var(--vv-height,100dvh)-env(safe-area-inset-top)-0.5rem)] max-sm:rounded-b-none max-sm:border-x-0 max-sm:border-b-0 max-sm:pb-[calc(1.5rem+env(safe-area-inset-bottom))] max-sm:data-[state=open]:animate-[sheet-in-bottom_0.24s_cubic-bezier(0.16,1,0.3,1)] max-sm:data-[state=closed]:animate-fade-out";
Workspace names and icons, and a component kit for every control35
36export function DialogContent({
37 className,
38 children,
39 showClose = true,
40 ...props
41}: ComponentProps<typeof Primitive.Content> & { showClose?: boolean }) {
42 return (
43 <Primitive.Portal>
44 <DialogOverlay />
45 <Primitive.Content className={cn(DIALOG_PANEL, className)} {...props}>
46 {children}
47 {showClose && (
48 <Primitive.Close
49 aria-label="Close"
Phones reach every page: each mode's menu from the top bar or by tapping the tab you're on, Docs first in the avatar sheet, a project's pages as a swipeable strip; dialogs as bottom sheets above the keyboard, safe areas, menus kept on screen, 40px targets, touch-visible controls, save bars above the tab bar50 className="absolute top-4 right-4 rounded-md p-1 text-faint transition-colors hover:bg-raised hover:text-fg max-sm:top-2.5 max-sm:right-2.5 max-sm:flex max-sm:size-10 max-sm:items-center max-sm:justify-center"
Workspace names and icons, and a component kit for every control51 >
52 <X size={16} />
53 </Primitive.Close>
54 )}
55 </Primitive.Content>
56 </Primitive.Portal>
57 );
58}
59
60export function DialogHeader({ className, ...props }: ComponentProps<"div">) {
61 return <div className={cn("flex flex-col gap-1.5 pr-6", className)} {...props} />;
62}
63
64export function DialogFooter({ className, ...props }: ComponentProps<"div">) {
65 return <div className={cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className)} {...props} />;
66}
67
68export function DialogTitle({ className, ...props }: ComponentProps<typeof Primitive.Title>) {
69 return <Primitive.Title className={cn("text-base font-semibold tracking-tight", className)} {...props} />;
70}
71
72export function DialogDescription({ className, ...props }: ComponentProps<typeof Primitive.Description>) {
73 return <Primitive.Description className={cn("text-sm text-muted", className)} {...props} />;
74}