generated from stabledata/surface
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
329 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
import * as React from "react"; | ||
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"; | ||
|
||
import { cn } from "../../lib/utils"; | ||
import { buttonVariants } from "../ui/button"; | ||
|
||
const AlertDialog = AlertDialogPrimitive.Root; | ||
|
||
const AlertDialogTrigger = AlertDialogPrimitive.Trigger; | ||
|
||
const AlertDialogPortal = AlertDialogPrimitive.Portal; | ||
|
||
const AlertDialogOverlay = React.forwardRef< | ||
React.ElementRef<typeof AlertDialogPrimitive.Overlay>, | ||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay> | ||
>(({ className, ...props }, ref) => ( | ||
<AlertDialogPrimitive.Overlay | ||
className={cn( | ||
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", | ||
className | ||
)} | ||
{...props} | ||
ref={ref} | ||
/> | ||
)); | ||
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; | ||
|
||
const AlertDialogContent = React.forwardRef< | ||
React.ElementRef<typeof AlertDialogPrimitive.Content>, | ||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> | ||
>(({ className, ...props }, ref) => ( | ||
<AlertDialogPortal> | ||
<AlertDialogOverlay /> | ||
<AlertDialogPrimitive.Content | ||
ref={ref} | ||
className={cn( | ||
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-neutral-50 dark:bg-neutral-900 p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg", | ||
className | ||
)} | ||
{...props} | ||
/> | ||
</AlertDialogPortal> | ||
)); | ||
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; | ||
|
||
const AlertDialogHeader = ({ | ||
className, | ||
...props | ||
}: React.HTMLAttributes<HTMLDivElement>) => ( | ||
<div | ||
className={cn( | ||
"flex flex-col space-y-2 text-center sm:text-left", | ||
className | ||
)} | ||
{...props} | ||
/> | ||
); | ||
AlertDialogHeader.displayName = "AlertDialogHeader"; | ||
|
||
const AlertDialogFooter = ({ | ||
className, | ||
...props | ||
}: React.HTMLAttributes<HTMLDivElement>) => ( | ||
<div | ||
className={cn( | ||
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", | ||
className | ||
)} | ||
{...props} | ||
/> | ||
); | ||
AlertDialogFooter.displayName = "AlertDialogFooter"; | ||
|
||
const AlertDialogTitle = React.forwardRef< | ||
React.ElementRef<typeof AlertDialogPrimitive.Title>, | ||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title> | ||
>(({ className, ...props }, ref) => ( | ||
<AlertDialogPrimitive.Title | ||
ref={ref} | ||
className={cn("text-lg font-semibold", className)} | ||
{...props} | ||
/> | ||
)); | ||
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; | ||
|
||
const AlertDialogDescription = React.forwardRef< | ||
React.ElementRef<typeof AlertDialogPrimitive.Description>, | ||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description> | ||
>(({ className, ...props }, ref) => ( | ||
<AlertDialogPrimitive.Description | ||
ref={ref} | ||
className={cn("text-sm text-muted-foreground", className)} | ||
{...props} | ||
/> | ||
)); | ||
AlertDialogDescription.displayName = | ||
AlertDialogPrimitive.Description.displayName; | ||
|
||
const AlertDialogAction = React.forwardRef< | ||
React.ElementRef<typeof AlertDialogPrimitive.Action>, | ||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action> | ||
>(({ className, ...props }, ref) => ( | ||
<AlertDialogPrimitive.Action | ||
ref={ref} | ||
className={cn(buttonVariants(), className)} | ||
{...props} | ||
/> | ||
)); | ||
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; | ||
|
||
const AlertDialogCancel = React.forwardRef< | ||
React.ElementRef<typeof AlertDialogPrimitive.Cancel>, | ||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel> | ||
>(({ className, ...props }, ref) => ( | ||
<AlertDialogPrimitive.Cancel | ||
ref={ref} | ||
className={cn( | ||
buttonVariants({ variant: "outline" }), | ||
"mt-2 sm:mt-0", | ||
className | ||
)} | ||
{...props} | ||
/> | ||
)); | ||
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; | ||
|
||
export { | ||
AlertDialog, | ||
AlertDialogPortal, | ||
AlertDialogOverlay, | ||
AlertDialogTrigger, | ||
AlertDialogContent, | ||
AlertDialogHeader, | ||
AlertDialogFooter, | ||
AlertDialogTitle, | ||
AlertDialogDescription, | ||
AlertDialogAction, | ||
AlertDialogCancel, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
import { createContext, useContext, useState, useEffect } from "react"; | ||
|
||
const getPreferredDarkMode = (): Mode => { | ||
if (typeof window !== "undefined") { | ||
const preferredDarkMode = window.matchMedia("(prefers-color-scheme: dark)") | ||
.matches | ||
? "dark" | ||
: "light"; | ||
return preferredDarkMode; | ||
} | ||
return "light"; | ||
}; | ||
|
||
type Mode = "light" | "dark" | "auto"; | ||
type DarkModeContextType = { | ||
mode: Mode; | ||
setDarkMode: (mode: Mode) => void; | ||
}; | ||
|
||
const DarkModeContext = createContext<DarkModeContextType>({ | ||
mode: getPreferredDarkMode() as Mode, | ||
setDarkMode: () => {}, | ||
}); | ||
|
||
export const useDarkMode = () => useContext(DarkModeContext); | ||
|
||
export const DarkModeProvider: React.FC<React.PropsWithChildren> = ({ | ||
children, | ||
}) => { | ||
const [mode, setMode] = useState(getPreferredDarkMode); | ||
|
||
useEffect(() => { | ||
if (mode === "dark") { | ||
document.body.classList.add("dark"); | ||
} else { | ||
document.body.classList.remove("dark"); | ||
} | ||
}, [mode]); | ||
|
||
const setDarkMode = (mode: Mode) => { | ||
setMode(mode); | ||
}; | ||
|
||
return ( | ||
<DarkModeContext.Provider value={{ mode, setDarkMode }}> | ||
{children} | ||
</DarkModeContext.Provider> | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,7 @@ | ||
export { useForm } from "./hooks/use-form.js"; | ||
export { SwitchForm } from "./components/form.js"; | ||
export * from "./types.js"; | ||
|
||
export * from "./components/ui/alert-dialog.js"; | ||
export { Button } from "./components/ui/button.js"; | ||
export { DarkModeProvider, useDarkMode } from "./dark-mode-provider.js"; |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import { | ||
AlertDialog, | ||
AlertDialogAction, | ||
AlertDialogCancel, | ||
AlertDialogContent, | ||
AlertDialogDescription, | ||
AlertDialogFooter, | ||
AlertDialogHeader, | ||
AlertDialogTitle, | ||
AlertDialogTrigger, | ||
} from "switch/components/ui/alert-dialog"; | ||
import { Button } from "switch/components/ui/button"; | ||
|
||
export function AlertDialogDemo() { | ||
return ( | ||
<AlertDialog> | ||
<AlertDialogTrigger asChild> | ||
<Button variant="outline">Show Dialog</Button> | ||
</AlertDialogTrigger> | ||
<AlertDialogContent> | ||
<AlertDialogHeader> | ||
<AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle> | ||
<AlertDialogDescription> | ||
This action cannot be undone. This will permanently delete your | ||
account and remove your data from our servers. | ||
</AlertDialogDescription> | ||
</AlertDialogHeader> | ||
<AlertDialogFooter> | ||
<AlertDialogCancel>Cancel</AlertDialogCancel> | ||
<AlertDialogAction className="bg-red-600 dark:bg-red-700 hover:bg-red-600/95 dark:hover:bg-red-500/85 dark:text-neutral-100"> | ||
Continue | ||
</AlertDialogAction> | ||
</AlertDialogFooter> | ||
</AlertDialogContent> | ||
</AlertDialog> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,50 @@ | ||
import { Link } from "@tanstack/react-router"; | ||
import { Github, RefreshCw } from "lucide-react"; | ||
import { Github, Moon, RefreshCw, Sun } from "lucide-react"; | ||
import { useBusyRouter } from "./hooks/use-busy-router"; | ||
import { useDarkMode } from "switch/dark-mode-provider"; | ||
|
||
const activeProps = { | ||
className: "underline", | ||
}; | ||
|
||
export function Header() { | ||
const isLoading = useBusyRouter(); | ||
const { mode, setDarkMode } = useDarkMode(); | ||
return ( | ||
<div className="header"> | ||
<Link to="/" activeProps={activeProps} activeOptions={{ exact: true }}> | ||
Home | ||
</Link> | ||
|
||
<Link | ||
to="/components" | ||
activeProps={activeProps} | ||
activeOptions={{ exact: true }} | ||
> | ||
Story | ||
</Link> | ||
<Link | ||
to="/input" | ||
activeProps={activeProps} | ||
activeOptions={{ exact: true }} | ||
> | ||
Input | ||
</Link> | ||
|
||
<a href="https://github.com/stabledata/switch"> | ||
<Github size={20} /> | ||
</a> | ||
{isLoading ? ( | ||
<RefreshCw size={20} className="absolute right-4 animate-spin" /> | ||
) : null} | ||
{mode === "dark" ? ( | ||
<a href="#" onClick={() => setDarkMode("light")}> | ||
<Sun /> | ||
</a> | ||
) : ( | ||
<a href="#" onClick={() => setDarkMode("dark")}> | ||
<Moon /> | ||
</a> | ||
)} | ||
</div> | ||
); | ||
} |
Oops, something went wrong.