diff --git a/package-lock.json b/package-lock.json index 7ad6170..8a389c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "@antv/g2": "^5.4.8", + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -1601,6 +1602,42 @@ } } }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-direction": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", diff --git a/package.json b/package.json index 99e101c..1101df7 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@antv/g2": "^5.4.8", + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", diff --git a/src/components/ui/glass-card.tsx b/src/components/ui/glass-card.tsx new file mode 100644 index 0000000..7750224 --- /dev/null +++ b/src/components/ui/glass-card.tsx @@ -0,0 +1,39 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" +import { cn } from "@/lib/utils" + +const glassCardVariants = cva( + "rounded-xl border backdrop-blur-xl text-[var(--color-text-primary)] transition-all duration-300", + { + variants: { + variant: { + default: + "border-[var(--color-border-primary)] bg-[var(--color-bg-tertiary)]/80 hover:border-[var(--color-tech-blue)] hover:shadow-[0_0_30px_rgba(0,217,255,0.15)] hover:-translate-y-1", + elevated: + "border-[var(--color-border-primary)] bg-[var(--color-bg-tertiary)]/80 shadow-lg hover:border-[var(--color-tech-blue)] hover:shadow-xl hover:shadow-[0_0_30px_rgba(0,217,255,0.15)] hover:-translate-y-1", + outline: + "border-[var(--color-border-primary)] bg-transparent hover:border-[var(--color-tech-blue)] hover:bg-[var(--color-bg-tertiary)]/50", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface GlassCardProps + extends React.HTMLAttributes, + VariantProps {} + +const GlassCard = React.forwardRef( + ({ className, variant, ...props }, ref) => ( +
+ ) +) +GlassCard.displayName = "GlassCard" + +export { GlassCard, glassCardVariants } diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index c889981..21a019f 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -1,22 +1,48 @@ import * as React from "react" - import { cn } from "@/lib/utils" -function Input({ className, type, ...props }: React.ComponentProps<"input">) { - return ( - - ) +export interface InputProps extends React.InputHTMLAttributes { + label?: string + error?: string } +const Input = React.forwardRef( + ({ className, type, label, error, id, ...props }, ref) => { + const inputId = id || React.useId() + + return ( +
+ {label && ( + + )} + + {error && ( +

{error}

+ )} +
+ ) + } +) +Input.displayName = "Input" + export { Input } diff --git a/src/components/ui/textarea.tsx b/src/components/ui/textarea.tsx index 7f21b5e..9e7b052 100644 --- a/src/components/ui/textarea.tsx +++ b/src/components/ui/textarea.tsx @@ -1,18 +1,47 @@ import * as React from "react" - import { cn } from "@/lib/utils" -function Textarea({ className, ...props }: React.ComponentProps<"textarea">) { - return ( -