+
table.getColumn('name')?.setFilterValue(event.target.value)}
className="max-w-sm"
/>
-
+
{table.getHeaderGroups().map((headerGroup) => (
{headerGroup.headers.map((header) => {
diff --git a/site/src/components/ui/card.tsx b/site/src/components/ui/card.tsx
new file mode 100644
index 0000000..afa13ec
--- /dev/null
+++ b/site/src/components/ui/card.tsx
@@ -0,0 +1,79 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+Card.displayName = "Card"
+
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardHeader.displayName = "CardHeader"
+
+const CardTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardTitle.displayName = "CardTitle"
+
+const CardDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardDescription.displayName = "CardDescription"
+
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardContent.displayName = "CardContent"
+
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardFooter.displayName = "CardFooter"
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/site/src/components/ui/command.tsx b/site/src/components/ui/command.tsx
new file mode 100644
index 0000000..d623ee0
--- /dev/null
+++ b/site/src/components/ui/command.tsx
@@ -0,0 +1,153 @@
+import * as React from "react"
+import { type DialogProps } from "@radix-ui/react-dialog"
+import { Command as CommandPrimitive } from "cmdk"
+import { Search } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Dialog, DialogContent } from "@/components/ui/dialog"
+
+const Command = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+Command.displayName = CommandPrimitive.displayName
+
+interface CommandDialogProps extends DialogProps {}
+
+const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
+ return (
+
+ )
+}
+
+const CommandInput = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+))
+
+CommandInput.displayName = CommandPrimitive.Input.displayName
+
+const CommandList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandList.displayName = CommandPrimitive.List.displayName
+
+const CommandEmpty = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>((props, ref) => (
+
+))
+
+CommandEmpty.displayName = CommandPrimitive.Empty.displayName
+
+const CommandGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandGroup.displayName = CommandPrimitive.Group.displayName
+
+const CommandSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+CommandSeparator.displayName = CommandPrimitive.Separator.displayName
+
+const CommandItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandItem.displayName = CommandPrimitive.Item.displayName
+
+const CommandShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+CommandShortcut.displayName = "CommandShortcut"
+
+export {
+ Command,
+ CommandDialog,
+ CommandInput,
+ CommandList,
+ CommandEmpty,
+ CommandGroup,
+ CommandItem,
+ CommandShortcut,
+ CommandSeparator,
+}
diff --git a/site/src/components/ui/dialog.tsx b/site/src/components/ui/dialog.tsx
new file mode 100644
index 0000000..c23630e
--- /dev/null
+++ b/site/src/components/ui/dialog.tsx
@@ -0,0 +1,120 @@
+import * as React from "react"
+import * as DialogPrimitive from "@radix-ui/react-dialog"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Dialog = DialogPrimitive.Root
+
+const DialogTrigger = DialogPrimitive.Trigger
+
+const DialogPortal = DialogPrimitive.Portal
+
+const DialogClose = DialogPrimitive.Close
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+))
+DialogContent.displayName = DialogPrimitive.Content.displayName
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogHeader.displayName = "DialogHeader"
+
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogFooter.displayName = "DialogFooter"
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogTitle.displayName = DialogPrimitive.Title.displayName
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogDescription.displayName = DialogPrimitive.Description.displayName
+
+export {
+ Dialog,
+ DialogPortal,
+ DialogOverlay,
+ DialogClose,
+ DialogTrigger,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription,
+}
diff --git a/site/src/index.css b/site/src/index.css
index 929b866..0fa1f17 100644
--- a/site/src/index.css
+++ b/site/src/index.css
@@ -1,68 +1,51 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
-
@layer base {
:root {
- --background: 0 0% 100%;
- --foreground: 224 71.4% 4.1%;
-
+ --background: 0 7.69% 97.45%;
+ --foreground: 0 0% 0%;
--card: 0 0% 100%;
- --card-foreground: 224 71.4% 4.1%;
-
+ --card-foreground: 240 6.67% 2.94%;
--popover: 0 0% 100%;
- --popover-foreground: 224 71.4% 4.1%;
-
- --primary: 220.9 39.3% 11%;
- --primary-foreground: 210 20% 98%;
-
- --secondary: 220 14.3% 95.9%;
- --secondary-foreground: 220.9 39.3% 11%;
-
- --muted: 220 14.3% 95.9%;
- --muted-foreground: 220 8.9% 46.1%;
-
- --accent: 220 14.3% 95.9%;
- --accent-foreground: 220.9 39.3% 11%;
-
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 210 20% 98%;
-
- --border: 220 13% 91%;
- --input: 220 13% 91%;
- --ring: 224 71.4% 4.1%;
-
- --radius: 0.5rem;
+ --popover-foreground: 240 10% 3.92%;
+ --primary: 240 5.88% 10%;
+ --primary-foreground: 0 0% 100%;
+ --secondary: 240 4.76% 95.88%;
+ --secondary-foreground: 240 5.88% 10%;
+ --muted: 0 5.56% 94%;
+ --muted-foreground: 24 2.79% 35.1%;
+ --accent: 20 23.08% 93%;
+ --accent-foreground: 240 5.88% 10%;
+ --destructive: 0 65.33% 44.12%;
+ --destructive-foreground: 0 0% 98.04%;
+ --border: 30 8.11% 85.49%;
+ --input: 30 4.29% 72.55%;
+ --ring: 30 3.97% 49.41%;
+ --radius: 0.8rem;
}
.dark {
- --background: 224 71.4% 4.1%;
- --foreground: 210 20% 98%;
-
- --card: 224 71.4% 4.1%;
- --card-foreground: 210 20% 98%;
-
- --popover: 224 71.4% 4.1%;
- --popover-foreground: 210 20% 98%;
-
- --primary: 210 20% 98%;
- --primary-foreground: 220.9 39.3% 11%;
-
- --secondary: 215 27.9% 16.9%;
- --secondary-foreground: 210 20% 98%;
-
- --muted: 215 27.9% 16.9%;
- --muted-foreground: 217.9 10.6% 64.9%;
-
- --accent: 215 27.9% 16.9%;
- --accent-foreground: 210 20% 98%;
-
- --destructive: 0 62.8% 30.6%;
- --destructive-foreground: 210 20% 98%;
-
- --border: 215 27.9% 16.9%;
- --input: 215 27.9% 16.9%;
- --ring: 216 12.2% 83.9%;
+ --background: 240 10% 3.92%;
+ --foreground: 0 0% 98.04%;
+ --card: 240 8.57% 6.86%;
+ --card-foreground: 0 0% 98.04%;
+ --popover: 240 10% 3.92%;
+ --popover-foreground: 0 0% 98.04%;
+ --primary: 0 0% 98.04%;
+ --primary-foreground: 240 5.88% 10%;
+ --secondary: 240 3.7% 15.88%;
+ --secondary-foreground: 0 0% 98.04%;
+ --muted: 240 3.7% 15.88%;
+ --muted-foreground: 240 5.03% 64.9%;
+ --accent: 240 3.7% 15.88%;
+ --accent-foreground: 0 0% 98.04%;
+ --destructive: 0 56.48% 42.35%;
+ --destructive-foreground: 0 0% 98.04%;
+ --border: 240 2.86% 13.73%;
+ --input: 240 3.7% 15.88%;
+ --ring: 240 4.88% 83.92%;
+ --radius: 0.8rem;
}
}
diff --git a/site/src/main.tsx b/site/src/main.tsx
index 47c29a2..0497a9e 100644
--- a/site/src/main.tsx
+++ b/site/src/main.tsx
@@ -6,6 +6,8 @@ import { ThemeProvider } from './components/theme-provider.tsx'
import LoginPage from './components/login.tsx'
import { pb } from './lib/stores.ts'
import { ServerDetail } from './components/routes/server.tsx'
+import { ModeToggle } from './components/mode-toggle.tsx'
+import { CommandPalette } from './components/command-dialog.tsx'
// import { ModeToggle } from './components/mode-toggle.tsx'
@@ -19,13 +21,10 @@ console.log('pb.authStore', pb.authStore)
const App = () => {pb.authStore.isValid ? : }
const Main = () => (
-
-
+
+
+
+
{/*
Routes below are matched exclusively -
@@ -39,6 +38,7 @@ const Main = () => (
{/* Default route in a switch */}
404: No such page!
+
)