From 9deffbb0991a7afb223e0e4a111561bcffc70c52 Mon Sep 17 00:00:00 2001 From: Alois Date: Wed, 25 Mar 2026 21:22:53 +0100 Subject: [PATCH] Added new theme (again), updated some homepage stuff --- apps/web/src/components/sidebar.tsx | 2 +- apps/web/src/index.css | 140 +++++++------------- apps/web/src/routes/app/home.tsx | 75 ++++++++++- apps/web/src/routes/layout.tsx | 28 +++- bun.lock | 1 - packages/ttp/src/core.test.ts | 2 +- packages/ttp/src/values.ts | 2 +- packages/ui/components.json | 4 +- packages/ui/src/cmp/avatar.tsx | 52 +------- packages/ui/src/cmp/button.tsx | 41 +++--- packages/ui/src/cmp/card.tsx | 56 ++------ packages/ui/src/cmp/checkbox.tsx | 7 +- packages/ui/src/cmp/context-menu.tsx | 187 ++------------------------- packages/ui/src/cmp/dialog.tsx | 154 ++++++++++++++++++++++ packages/ui/src/cmp/input.tsx | 7 +- packages/ui/src/cmp/label.tsx | 7 +- packages/ui/src/cmp/sonner.tsx | 7 +- 17 files changed, 349 insertions(+), 423 deletions(-) create mode 100644 packages/ui/src/cmp/dialog.tsx diff --git a/apps/web/src/components/sidebar.tsx b/apps/web/src/components/sidebar.tsx index ff6da7f..511b129 100644 --- a/apps/web/src/components/sidebar.tsx +++ b/apps/web/src/components/sidebar.tsx @@ -17,7 +17,7 @@ export default function Sidebar() { }, [load]); return ( -
+
} userId={userId} diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 05872f2..30f037c 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -8,107 +8,63 @@ @source "../../../packages/**/src/**/*.{ts,tsx}"; :root { - --background: oklch(1 0 0); - --foreground: oklch(0.148 0.004 228.8); - --card: oklch(1 0 0); - --card-foreground: oklch(0.148 0.004 228.8); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.148 0.004 228.8); - --primary: oklch(0.511 0.096 186.391); - --primary-foreground: oklch(0.984 0.014 180.72); - --secondary: oklch(0.967 0.001 286.375); - --secondary-foreground: oklch(0.21 0.006 285.885); - --muted: oklch(0.963 0.002 197.1); - --muted-foreground: oklch(0.56 0.021 213.5); - --accent: oklch(0.963 0.002 197.1); - --accent-foreground: oklch(0.218 0.008 223.9); - --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.925 0.005 214.3); - --input: oklch(0.925 0.005 214.3); - --ring: oklch(0.723 0.014 214.4); - --chart-1: oklch(0.855 0.138 181.071); - --chart-2: oklch(0.704 0.14 182.503); - --chart-3: oklch(0.6 0.118 184.704); - --chart-4: oklch(0.511 0.096 186.391); - --chart-5: oklch(0.437 0.078 188.216); + --text: #121212; + --background: #f2f2f2; + --primary: #00786f; + --secondary: #338788; + --accent: #13b9a0; --radius: 0.625rem; - --sidebar: oklch(0.987 0.002 197.1); - --sidebar-foreground: oklch(0.148 0.004 228.8); - --sidebar-primary: oklch(0.6 0.118 184.704); - --sidebar-primary-foreground: oklch(0.984 0.014 180.72); - --sidebar-accent: oklch(0.963 0.002 197.1); - --sidebar-accent-foreground: oklch(0.218 0.008 223.9); - --sidebar-border: oklch(0.925 0.005 214.3); - --sidebar-ring: oklch(0.723 0.014 214.4); } .dark { - --background: oklch(0.148 0.004 228.8); - --foreground: oklch(0.987 0.002 197.1); - --card: oklch(0.218 0.008 223.9); - --card-foreground: oklch(0.987 0.002 197.1); - --popover: oklch(0.218 0.008 223.9); - --popover-foreground: oklch(0.987 0.002 197.1); - --primary: oklch(0.437 0.078 188.216); - --primary-foreground: oklch(0.984 0.014 180.72); - --secondary: oklch(0.274 0.006 286.033); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.275 0.011 216.9); - --muted-foreground: oklch(0.723 0.014 214.4); - --accent: oklch(0.275 0.011 216.9); - --accent-foreground: oklch(0.987 0.002 197.1); - --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.56 0.021 213.5); - --chart-1: oklch(0.855 0.138 181.071); - --chart-2: oklch(0.704 0.14 182.503); - --chart-3: oklch(0.6 0.118 184.704); - --chart-4: oklch(0.511 0.096 186.391); - --chart-5: oklch(0.437 0.078 188.216); - --sidebar: oklch(0.218 0.008 223.9); - --sidebar-foreground: oklch(0.987 0.002 197.1); - --sidebar-primary: oklch(0.704 0.14 182.503); - --sidebar-primary-foreground: oklch(0.277 0.046 192.524); - --sidebar-accent: oklch(0.275 0.011 216.9); - --sidebar-accent-foreground: oklch(0.987 0.002 197.1); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.56 0.021 213.5); + --text: #eeeeee; + --background: #0c0c0c; + --primary: #005f5a; + --secondary: #0b3134; + --accent: #46ecd4; + --radius: 0.625rem; } @theme inline { --font-sans: "Inter Variable", sans-serif; - --color-sidebar-ring: var(--sidebar-ring); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar: var(--sidebar); - --color-chart-5: var(--chart-5); - --color-chart-4: var(--chart-4); - --color-chart-3: var(--chart-3); - --color-chart-2: var(--chart-2); - --color-chart-1: var(--chart-1); - --color-ring: var(--ring); - --color-input: var(--input); - --color-border: var(--border); - --color-destructive: var(--destructive); - --color-accent-foreground: var(--accent-foreground); - --color-accent: var(--accent); - --color-muted-foreground: var(--muted-foreground); - --color-muted: var(--muted); - --color-secondary-foreground: var(--secondary-foreground); - --color-secondary: var(--secondary); - --color-primary-foreground: var(--primary-foreground); - --color-primary: var(--primary); - --color-popover-foreground: var(--popover-foreground); - --color-popover: var(--popover); - --color-card-foreground: var(--card-foreground); - --color-card: var(--card); - --color-foreground: var(--foreground); + --color-background: var(--background); + --color-foreground: var(--text); + + --color-primary: var(--primary); + --color-primary-foreground: var(--text); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--background); + --color-accent: var(--accent); + --color-accent-foreground: var(--background); + + --color-muted: color-mix(in srgb, var(--text) 20%, var(--background)); + --color-muted-foreground: var(--text); + --color-border: color-mix(in srgb, var(--text) 13%, var(--background)); + --color-input: color-mix(in srgb, var(--text) 15%, var(--background)); + --color-ring: color-mix(in srgb, var(--text) 45%, var(--background)); + --color-destructive: hsl(0 84% 60%); + + --color-card: color-mix(in srgb, var(--text) 6%, var(--background)); + --color-card-foreground: var(--text); + --color-popover: color-mix(in srgb, var(--text) 5%, var(--background)); + --color-popover-foreground: var(--text); + + --color-sidebar: color-mix(in srgb, var(--text) 3%, var(--background)); + --color-sidebar-foreground: var(--text); + --color-sidebar-primary: var(--primary); + --color-sidebar-primary-foreground: var(--background); + --color-sidebar-accent: var(--accent); + --color-sidebar-accent-foreground: var(--background); + --color-sidebar-border: var(--border); + --color-sidebar-ring: var(--primary); + + --color-chart-1: var(--primary); + --color-chart-2: var(--secondary); + --color-chart-3: var(--accent); + --color-chart-4: color-mix(in srgb, var(--primary) 70%, white); + --color-chart-5: color-mix(in srgb, var(--secondary) 70%, white); + --radius-sm: calc(var(--radius) * 0.6); --radius-md: calc(var(--radius) * 0.8); --radius-lg: var(--radius); diff --git a/apps/web/src/routes/app/home.tsx b/apps/web/src/routes/app/home.tsx index 59f48c2..f8c5426 100644 --- a/apps/web/src/routes/app/home.tsx +++ b/apps/web/src/routes/app/home.tsx @@ -1,8 +1,81 @@ +import { Input } from "@tensamin/ui/cmp/input"; +import { Button } from "@tensamin/ui/cmp/button"; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@tensamin/ui/cmp/dialog"; +import z from "zod"; +import { toast } from "@tensamin/shared/log"; +import { useSocket } from "@tensamin/ttp/context"; + /** * Executes Page. * @param none This function has no parameters. * @returns unknown. */ export default function Page() { - return
Home
; + const { send } = useSocket(); + + function submit(username: string | null) { + const schema = z + .string() + .min(1, "Username is too short") + .max(15, "Username is too long"); + + const result = schema.safeParse(username?.toLowerCase().trim()); + + if (!result.success) { + toast("error", result.error.issues[0].message); + return; + } + + send("add_conversation", { + chat_partner_name: result.data, + }) + .then(() => toast("success", "Conversation added")) + .catch(() => toast("error", "Failed to add conversation")); + } + + return ( +
+ + Add Conversation} /> + + + New Conversation + + + Add a new conversation. Just enter the username of the person you + want to add as a conversation. + +
{ + event.preventDefault(); + const form = new FormData(event.currentTarget); + const username = form.get("username") as string | null; + submit(username); + }} + > + +
+ Cancel} /> + +
+
+
+
+ +
+ ); } diff --git a/apps/web/src/routes/layout.tsx b/apps/web/src/routes/layout.tsx index a5ed6ad..12620ec 100644 --- a/apps/web/src/routes/layout.tsx +++ b/apps/web/src/routes/layout.tsx @@ -1,4 +1,4 @@ -import type { ReactNode } from "react"; +import { useEffect, useState, type ReactNode } from "react"; import Storage from "@tensamin/storage/context"; import Crypto from "@tensamin/crypto/context"; @@ -13,8 +13,34 @@ import { Toaster } from "@tensamin/ui/cmp/sonner"; * @returns unknown. */ export default function Layout(props: { children: ReactNode }) { + const [pixelRatio, setPixelRatio] = useState(devicePixelRatio); + const [visible, setVisible] = useState(false); + + useEffect(() => { + const handleResize = () => { + setPixelRatio(devicePixelRatio); + setVisible(true); + setTimeout(() => setVisible(false), 1000); + }; + + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); + return ( <> +
+ {visible && ( +
{pixelRatio}
+ )} + + {/* Todo: Make this nicer */} + {pixelRatio !== 1 && ( +
+ Hey! You're zoomed in. +
+ )} +
diff --git a/bun.lock b/bun.lock index 88951de..febc1a5 100644 --- a/bun.lock +++ b/bun.lock @@ -97,7 +97,6 @@ "version": "0.0.0", "dependencies": { "@noble/curves": "^2.0.1", - "@tensamin/ui": "workspace:*", "comlink": "^4.4.2", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/packages/ttp/src/core.test.ts b/packages/ttp/src/core.test.ts index ee8146b..087f9bf 100644 --- a/packages/ttp/src/core.test.ts +++ b/packages/ttp/src/core.test.ts @@ -490,4 +490,4 @@ describe("Core Protocol", () => { }); }); }); -}); \ No newline at end of file +}); diff --git a/packages/ttp/src/values.ts b/packages/ttp/src/values.ts index d44680c..cb808bb 100644 --- a/packages/ttp/src/values.ts +++ b/packages/ttp/src/values.ts @@ -4,4 +4,4 @@ export const RETRY_INTERVAL = 3_000; export const PING_INTERVAL = 3_000; export const TRANSPORT_URL = "https://methanium.net:959"; export const RECONNECT_TRIES = 3; -export const RECONNECT_RESET = 6; \ No newline at end of file +export const RECONNECT_RESET = 6; diff --git a/packages/ui/components.json b/packages/ui/components.json index 0c1a401..4351c1f 100644 --- a/packages/ui/components.json +++ b/packages/ui/components.json @@ -1,12 +1,12 @@ { "$schema": "https://ui.shadcn.com/schema.json", - "style": "base-mira", + "style": "base-nova", "rsc": false, "tsx": true, "tailwind": { "config": "", "css": "src/index.css", - "baseColor": "mist", + "baseColor": "neutral", "cssVariables": true, "prefix": "" }, diff --git a/packages/ui/src/cmp/avatar.tsx b/packages/ui/src/cmp/avatar.tsx index ff7477b..cc32930 100644 --- a/packages/ui/src/cmp/avatar.tsx +++ b/packages/ui/src/cmp/avatar.tsx @@ -3,19 +3,6 @@ import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"; import { cn } from "../lib/utils"; -/** - * Executes Avatar. - * @param { - className, - size = "default", - ...props -} Parameter { - className, - size = "default", - ...props -}. - * @returns unknown. - */ function Avatar({ className, size = "default", @@ -36,11 +23,6 @@ function Avatar({ ); } -/** - * Executes AvatarImage. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) { return ( ) { return ( ) { ); } -/** - * Executes AvatarGroup. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) { return (
) { ); } -/** - * Executes AvatarGroupCount. - * @param { - className, - ...props -} Parameter { - className, - ...props -}. - * @returns unknown. - */ function AvatarGroupCount({ className, ...props @@ -139,7 +89,7 @@ function AvatarGroupCount({
svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", + "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className, )} {...props} diff --git a/packages/ui/src/cmp/button.tsx b/packages/ui/src/cmp/button.tsx index 70ffcb6..27a650a 100644 --- a/packages/ui/src/cmp/button.tsx +++ b/packages/ui/src/cmp/button.tsx @@ -1,16 +1,18 @@ +"use client"; + import { Button as ButtonPrimitive } from "@base-ui/react/button"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "../lib/utils"; const buttonVariants = cva( - "group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-xs/relaxed font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", { variants: { variant: { - default: "bg-primary text-primary-foreground hover:bg-primary/80", + default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", outline: - "border-border hover:bg-input/50 hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:bg-input/30", + "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50", secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", ghost: @@ -21,14 +23,16 @@ const buttonVariants = cva( }, size: { default: - "h-7 gap-1 px-2 text-xs/relaxed has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5", - xs: "h-5 gap-1 rounded-sm px-2 text-[0.625rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-2.5", - sm: "h-6 gap-1 px-2 text-xs/relaxed has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", - lg: "h-8 gap-1 px-2.5 text-xs/relaxed has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-4", - icon: "size-7 [&_svg:not([class*='size-'])]:size-3.5", - "icon-xs": "size-5 rounded-sm [&_svg:not([class*='size-'])]:size-2.5", - "icon-sm": "size-6 [&_svg:not([class*='size-'])]:size-3", - "icon-lg": "size-8 [&_svg:not([class*='size-'])]:size-4", + "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", + sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5", + lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3", + icon: "size-8", + "icon-xs": + "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3", + "icon-sm": + "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg", + "icon-lg": "size-9", }, }, defaultVariants: { @@ -38,21 +42,6 @@ const buttonVariants = cva( }, ); -/** - * Executes Button. - * @param { - className, - variant = "default", - size = "default", - ...props -} Parameter { - className, - variant = "default", - size = "default", - ...props -}. - * @returns unknown. - */ function Button({ className, variant = "default", diff --git a/packages/ui/src/cmp/card.tsx b/packages/ui/src/cmp/card.tsx index 74b4408..85e5ec7 100644 --- a/packages/ui/src/cmp/card.tsx +++ b/packages/ui/src/cmp/card.tsx @@ -2,19 +2,6 @@ import * as React from "react"; import { cn } from "../lib/utils"; -/** - * Executes Card. - * @param { - className, - size = "default", - ...props -} Parameter { - className, - size = "default", - ...props -}. - * @returns unknown. - */ function Card({ className, size = "default", @@ -25,7 +12,7 @@ function Card({ data-slot="card" data-size={size} className={cn( - "group/card flex flex-col gap-4 overflow-hidden rounded-lg bg-card py-4 text-xs/relaxed text-card-foreground ring-1 ring-foreground/10 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 *:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg", + "group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl", className, )} {...props} @@ -33,17 +20,12 @@ function Card({ ); } -/** - * Executes CardHeader. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function CardHeader({ className, ...props }: React.ComponentProps<"div">) { return (
) { ); } -/** - * Executes CardTitle. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function CardTitle({ className, ...props }: React.ComponentProps<"div">) { return (
); } -/** - * Executes CardDescription. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function CardDescription({ className, ...props }: React.ComponentProps<"div">) { return (
); } -/** - * Executes CardAction. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function CardAction({ className, ...props }: React.ComponentProps<"div">) { return (
) { ); } -/** - * Executes CardContent. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function CardContent({ className, ...props }: React.ComponentProps<"div">) { return (
) { ); } -/** - * Executes CardFooter. - * @param { className, ...props } Parameter { className, ...props }. - * @returns unknown. - */ function CardFooter({ className, ...props }: React.ComponentProps<"div">) { return (
; } -/** - * Executes ContextMenuPortal. - * @param { ...props } Parameter { ...props }. - * @returns unknown. - */ function ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props) { return ( ); } -/** - * Executes ContextMenuTrigger. - * @param { - className, - ...props -} Parameter { - className, - ...props -}. - * @returns unknown. - */ function ContextMenuTrigger({ className, ...props @@ -48,25 +29,6 @@ function ContextMenuTrigger({ ); } -/** - * Executes ContextMenuContent. - * @param { - className, - align = "start", - alignOffset = 4, - side = "right", - sideOffset = 0, - ...props -} Parameter { - className, - align = "start", - alignOffset = 4, - side = "right", - sideOffset = 0, - ...props -}. - * @returns unknown. - */ function ContextMenuContent({ className, align = "start", @@ -91,7 +53,7 @@ function ContextMenuContent({ ); } -/** - * Executes ContextMenuLabel. - * @param { - className, - inset, - ...props -} Parameter { - className, - inset, - ...props -}. - * @returns unknown. - */ function ContextMenuLabel({ className, inset, @@ -137,7 +81,7 @@ function ContextMenuLabel({ data-slot="context-menu-label" data-inset={inset} className={cn( - "px-2 py-1.5 text-xs text-muted-foreground data-inset:pl-7.5", + "px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7", className, )} {...props} @@ -145,21 +89,6 @@ function ContextMenuLabel({ ); } -/** - * Executes ContextMenuItem. - * @param { - className, - inset, - variant = "default", - ...props -} Parameter { - className, - inset, - variant = "default", - ...props -}. - * @returns unknown. - */ function ContextMenuItem({ className, inset, @@ -175,7 +104,7 @@ function ContextMenuItem({ data-inset={inset} data-variant={variant} className={cn( - "group/context-menu-item relative flex min-h-7 cursor-default items-center gap-2 rounded-md px-2 py-1 text-xs/relaxed outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 data-[variant=destructive]:*:[svg]:text-destructive", + "group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive", className, )} {...props} @@ -183,32 +112,12 @@ function ContextMenuItem({ ); } -/** - * Executes ContextMenuSub. - * @param { ...props } Parameter { ...props }. - * @returns unknown. - */ function ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props) { return ( ); } -/** - * Executes ContextMenuSubTrigger. - * @param { - className, - inset, - children, - ...props -} Parameter { - className, - inset, - children, - ...props -}. - * @returns unknown. - */ function ContextMenuSubTrigger({ className, inset, @@ -222,7 +131,7 @@ function ContextMenuSubTrigger({ data-slot="context-menu-sub-trigger" data-inset={inset} className={cn( - "flex min-h-7 cursor-default items-center gap-2 rounded-md px-2 py-1 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7.5 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5", + "flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} {...props} @@ -233,15 +142,6 @@ function ContextMenuSubTrigger({ ); } -/** - * Executes ContextMenuSubContent. - * @param { - ...props -} Parameter { - ...props -}. - * @returns unknown. - */ function ContextMenuSubContent({ ...props }: React.ComponentProps) { @@ -255,23 +155,6 @@ function ContextMenuSubContent({ ); } -/** - * Executes ContextMenuCheckboxItem. - * @param { - className, - children, - checked, - inset, - ...props -} Parameter { - className, - children, - checked, - inset, - ...props -}. - * @returns unknown. - */ function ContextMenuCheckboxItem({ className, children, @@ -286,13 +169,13 @@ function ContextMenuCheckboxItem({ data-slot="context-menu-checkbox-item" data-inset={inset} className={cn( - "relative flex min-h-7 cursor-default items-center gap-2 rounded-md py-1.5 pr-8 pl-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5", + "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} checked={checked} {...props} > - + @@ -302,15 +185,6 @@ function ContextMenuCheckboxItem({ ); } -/** - * Executes ContextMenuRadioGroup. - * @param { - ...props -} Parameter { - ...props -}. - * @returns unknown. - */ function ContextMenuRadioGroup({ ...props }: ContextMenuPrimitive.RadioGroup.Props) { @@ -322,21 +196,6 @@ function ContextMenuRadioGroup({ ); } -/** - * Executes ContextMenuRadioItem. - * @param { - className, - children, - inset, - ...props -} Parameter { - className, - children, - inset, - ...props -}. - * @returns unknown. - */ function ContextMenuRadioItem({ className, children, @@ -350,12 +209,12 @@ function ContextMenuRadioItem({ data-slot="context-menu-radio-item" data-inset={inset} className={cn( - "relative flex min-h-7 cursor-default items-center gap-2 rounded-md py-1.5 pr-8 pl-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5", + "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} {...props} > - + @@ -365,17 +224,6 @@ function ContextMenuRadioItem({ ); } -/** - * Executes ContextMenuSeparator. - * @param { - className, - ...props -} Parameter { - className, - ...props -}. - * @returns unknown. - */ function ContextMenuSeparator({ className, ...props @@ -383,23 +231,12 @@ function ContextMenuSeparator({ return ( ); } -/** - * Executes ContextMenuShortcut. - * @param { - className, - ...props -} Parameter { - className, - ...props -}. - * @returns unknown. - */ function ContextMenuShortcut({ className, ...props @@ -408,7 +245,7 @@ function ContextMenuShortcut({ ; +} + +function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) { + return ; +} + +function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) { + return ; +} + +function DialogClose({ ...props }: DialogPrimitive.Close.Props) { + return ; +} + +function DialogOverlay({ + className, + ...props +}: DialogPrimitive.Backdrop.Props) { + return ( + + ); +} + +function DialogContent({ + className, + children, + showCloseButton = true, + ...props +}: DialogPrimitive.Popup.Props & { + showCloseButton?: boolean; +}) { + return ( + + + + {children} + {showCloseButton && ( + + } + > + + Close + + )} + + + ); +} + +function DialogHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function DialogFooter({ + className, + showCloseButton = false, + children, + ...props +}: React.ComponentProps<"div"> & { + showCloseButton?: boolean; +}) { + return ( +
+ {children} + {showCloseButton && ( + }> + Close + + )} +
+ ); +} + +function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) { + return ( + + ); +} + +function DialogDescription({ + className, + ...props +}: DialogPrimitive.Description.Props) { + return ( + + ); +} + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +}; diff --git a/packages/ui/src/cmp/input.tsx b/packages/ui/src/cmp/input.tsx index 4ff8733..ad8e96b 100644 --- a/packages/ui/src/cmp/input.tsx +++ b/packages/ui/src/cmp/input.tsx @@ -3,18 +3,13 @@ import { Input as InputPrimitive } from "@base-ui/react/input"; import { cn } from "../lib/utils"; -/** - * Executes Input. - * @param { className, type, ...props } Parameter { className, type, ...props }. - * @returns unknown. - */ function Input({ className, type, ...props }: React.ComponentProps<"input">) { return ( ) { return (