diff --git a/bun.lockb b/bun.lockb index 7978aa7..56ab733 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/packages/webui/package.json b/packages/webui/package.json index f2bdcce..aa59fe8 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -10,11 +10,10 @@ }, "dependencies": { "@effect/schema": "^0.68.17", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.16.1", "@mui/material": "^5.16.1", + "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.2", "@tanstack/react-query": "4", "@tanstack/react-router": "^1.44.2", "@thilawyn/thilalib": "^0.1.5", @@ -26,10 +25,9 @@ "effect": "^3.4.7", "framer-motion": "^11.3.6", "lodash-es": "^4.17.21", - "lucide-react": "^0.408.0", + "lucide-react": "^0.411.0", "mobx": "^6.13.0", "mobx-react-lite": "^4.0.7", - "primereact": "^10.7.0", "react": "^18.3.1", "react-dom": "^18.3.1", "remeda": "^2.6.0", diff --git a/packages/webui/src/components/ui/card.tsx b/packages/webui/src/components/ui/card.tsx new file mode 100644 index 0000000..afa13ec --- /dev/null +++ b/packages/webui/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/packages/webui/src/components/ui/checkbox.tsx b/packages/webui/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..ddbdd01 --- /dev/null +++ b/packages/webui/src/components/ui/checkbox.tsx @@ -0,0 +1,28 @@ +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/packages/webui/src/components/ui/skeleton.tsx b/packages/webui/src/components/ui/skeleton.tsx new file mode 100644 index 0000000..e8e1132 --- /dev/null +++ b/packages/webui/src/components/ui/skeleton.tsx @@ -0,0 +1,15 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
+ ) +} + +export { Skeleton } diff --git a/packages/webui/src/components/ui/tooltip.tsx b/packages/webui/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..e121f0a --- /dev/null +++ b/packages/webui/src/components/ui/tooltip.tsx @@ -0,0 +1,28 @@ +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/packages/webui/src/lib/Passthrough.tsx b/packages/webui/src/lib/Passthrough.tsx new file mode 100644 index 0000000..595c142 --- /dev/null +++ b/packages/webui/src/lib/Passthrough.tsx @@ -0,0 +1,13 @@ +import type { ReactNode } from "react" + + +export module Passthrough { + export interface Props { + children?: ReactNode + } +} + + +export function Passthrough({ children }: Passthrough.Props) { + return children +} diff --git a/packages/webui/src/main.tsx b/packages/webui/src/main.tsx index 5451a81..d83ab70 100644 --- a/packages/webui/src/main.tsx +++ b/packages/webui/src/main.tsx @@ -1,11 +1,9 @@ import { RouterProvider, createRouter } from "@tanstack/react-router" -import { PrimeReactProvider } from "primereact/api" import React from "react" import ReactDOM from "react-dom/client" import { routeTree } from "./routeTree.gen" import { TRPCClientProvider } from "./trpc/TRPCClientProvider" -import "primereact/resources/themes/lara-light-cyan/theme.css" import "./index.css" @@ -20,10 +18,8 @@ declare module "@tanstack/react-router" { ReactDOM.createRoot(document.getElementById("root")!).render( - - - - - + + + ) diff --git a/packages/webui/src/todo/VTodo.tsx b/packages/webui/src/todo/VTodo.tsx index add8826..8f6140d 100644 --- a/packages/webui/src/todo/VTodo.tsx +++ b/packages/webui/src/todo/VTodo.tsx @@ -1,7 +1,12 @@ +import { Button } from "@/components/ui/button" +import { Card, CardContent } from "@/components/ui/card" +import { Skeleton as UISkeleton } from "@/components/ui/skeleton" +import { Tooltip, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" +import { Passthrough } from "@/lib/Passthrough" import { Schema as S } from "@effect/schema" -import { ArrowDownward, ArrowUpward, Delete } from "@mui/icons-material" +import { TooltipContent } from "@radix-ui/react-tooltip" +import { ChevronDown, ChevronUp, X } from "lucide-react" import { observer } from "mobx-react-lite" -import { Button } from "primereact/button" import { JsonifiableTodo, Todo } from "../data" import { trpc } from "../trpc/trpc" @@ -21,53 +26,88 @@ export const VTodo = observer(({ todo }: VTodo.Props) => { const updateTodo = trpc.todo.update.useMutation() const removeTodo = trpc.todo.remove.useMutation() + const Skeleton = updateTodo.isLoading || removeTodo.isLoading + ? UISkeleton + : Passthrough + return ( -
-

{todo.content}

+ + + +

{todo.content}

-
- + - + - loading={removeTodo.isLoading} - onClick={() => removeTodo.mutate(encodeTodo(todo))} - /> -
-
+ +

Move up

+
+ + + + + + + + + + +

Delete

+
+
+
+
+ + + ) })