This commit is contained in:
ryan
2026-07-13 15:44:03 +08:00
parent 0548a8a5d4
commit 26be762c3a
102 changed files with 909 additions and 490 deletions
@@ -1,13 +1,13 @@
'use client';
import * as React from 'react';
import {cva, type VariantProps} from 'class-variance-authority';
import { cva, type VariantProps } from 'class-variance-authority';
import {
Button as ButtonPrimitive,
type ButtonProps as ButtonPrimitiveProps,
} from '@/components/animate-ui/primitives/buttons/button';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,_color,_background-color,_border-color,_outline-color,_text-decoration-color,_fill,_stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
@@ -1,9 +1,14 @@
'use client';
import * as React from 'react';
import {motion, type Variants} from 'motion/react';
import { motion, type Variants } from 'motion/react';
import {getVariants, type IconProps, IconWrapper, useAnimateIconContext,} from '@/components/animate-ui/icons/icon';
import {
getVariants,
type IconProps,
IconWrapper,
useAnimateIconContext,
} from '@/components/animate-ui/icons/icon';
type CheckProps = IconProps<keyof typeof animations>;
@@ -1,9 +1,14 @@
'use client';
import * as React from 'react';
import {motion, type Variants} from 'motion/react';
import { motion, type Variants } from 'motion/react';
import {getVariants, type IconProps, IconWrapper, useAnimateIconContext,} from '@/components/animate-ui/icons/icon';
import {
getVariants,
type IconProps,
IconWrapper,
useAnimateIconContext,
} from '@/components/animate-ui/icons/icon';
type ChevronDownProps = IconProps<keyof typeof animations>;
@@ -1,9 +1,14 @@
'use client';
import * as React from 'react';
import {motion, type Variants} from 'motion/react';
import { motion, type Variants } from 'motion/react';
import {getVariants, type IconProps, IconWrapper, useAnimateIconContext,} from '@/components/animate-ui/icons/icon';
import {
getVariants,
type IconProps,
IconWrapper,
useAnimateIconContext,
} from '@/components/animate-ui/icons/icon';
type ChevronLeftProps = IconProps<keyof typeof animations>;
@@ -1,9 +1,14 @@
'use client';
import * as React from 'react';
import {motion, type Variants} from 'motion/react';
import { motion, type Variants } from 'motion/react';
import {getVariants, type IconProps, IconWrapper, useAnimateIconContext,} from '@/components/animate-ui/icons/icon';
import {
getVariants,
type IconProps,
IconWrapper,
useAnimateIconContext,
} from '@/components/animate-ui/icons/icon';
type ChevronRightProps = IconProps<keyof typeof animations>;
@@ -1,9 +1,14 @@
'use client';
import * as React from 'react';
import {motion, type Variants} from 'motion/react';
import { motion, type Variants } from 'motion/react';
import {getVariants, type IconProps, IconWrapper, useAnimateIconContext,} from '@/components/animate-ui/icons/icon';
import {
getVariants,
type IconProps,
IconWrapper,
useAnimateIconContext,
} from '@/components/animate-ui/icons/icon';
type CircleCheckProps = IconProps<keyof typeof animations>;
@@ -1,9 +1,12 @@
'use client';
import * as React from 'react';
import {type HTMLMotionProps, motion} from 'motion/react';
import { type HTMLMotionProps, motion } from 'motion/react';
import {Slot, type WithAsChild,} from '@/components/animate-ui/primitives/animate/slot';
import {
Slot,
type WithAsChild,
} from '@/components/animate-ui/primitives/animate/slot';
type ButtonProps = WithAsChild<
HTMLMotionProps<'button'> & {
@@ -1,11 +1,11 @@
'use client';
import * as React from 'react';
import {Collapsible as CollapsiblePrimitive} from 'radix-ui';
import {AnimatePresence, type HTMLMotionProps, motion} from 'motion/react';
import { Collapsible as CollapsiblePrimitive } from 'radix-ui';
import { AnimatePresence, type HTMLMotionProps, motion } from 'motion/react';
import {getStrictContext} from '@/lib/utils/get-strict-context';
import {useControlledState} from '@/hooks/use-controlled-state';
import { getStrictContext } from '@/lib/utils/get-strict-context';
import { useControlledState } from '@/hooks/use-controlled-state';
type CollapsibleContextType = {
isOpen: boolean;
@@ -1,9 +1,9 @@
'use client';
import * as React from 'react';
import {type SpringOptions, useMotionValue, useSpring} from 'motion/react';
import { type SpringOptions, useMotionValue, useSpring } from 'motion/react';
import {useIsInView, type UseIsInViewOptions} from '@/hooks/use-is-in-view';
import { useIsInView, type UseIsInViewOptions } from '@/hooks/use-is-in-view';
type CountingNumberProps = Omit<React.ComponentProps<'span'>, 'children'> & {
number: number;
+4 -4
View File
@@ -1,10 +1,10 @@
'use client';
import type {ReactNode} from 'react';
import {motion} from 'motion/react';
import {WavesIcon} from 'lucide-react';
import type { ReactNode } from 'react';
import { motion } from 'motion/react';
import { WavesIcon } from 'lucide-react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
interface AuthShellProps {
children: ReactNode;
+9 -3
View File
@@ -1,8 +1,14 @@
'use client';
import {useEffect, useRef, useState} from 'react';
import {CheckCircle2, Loader2, ShieldAlert, ShieldCheck, ShieldQuestion,} from 'lucide-react';
import {getCapToken} from '@/lib/cap-solver';
import { useEffect, useRef, useState } from 'react';
import {
CheckCircle2,
Loader2,
ShieldAlert,
ShieldCheck,
ShieldQuestion,
} from 'lucide-react';
import { getCapToken } from '@/lib/cap-solver';
type CapStatus = 'idle' | 'solving' | 'solved' | 'error';
+2 -2
View File
@@ -1,5 +1,5 @@
import {type PolicySection} from './types';
import {CodeBlock} from '@/components/ui/code-block';
import { type PolicySection } from './types';
import { CodeBlock } from '@/components/ui/code-block';
import {
DocsTable,
DocsTableBody,
@@ -1,10 +1,10 @@
'use client';
import * as React from 'react';
import {ImageOff} from 'lucide-react';
import { ImageOff } from 'lucide-react';
import {cn} from '@/lib/utils';
import {getFileUrl, type ImageQuality} from '@/lib/services/upload/utils';
import { cn } from '@/lib/utils';
import { getFileUrl, type ImageQuality } from '@/lib/services/upload/utils';
type FileImagePreviewProps = {
fileId: string | number;
@@ -2,16 +2,33 @@
import * as React from 'react';
import Link from 'next/link';
import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query';
import {motion} from 'motion/react';
import {AlertTriangle, Check, Copy, Info, Key, Loader2, Plus, RefreshCw, Shield, Trash2,} from 'lucide-react';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { motion } from 'motion/react';
import {
AlertTriangle,
Check,
Copy,
Info,
Key,
Loader2,
Plus,
RefreshCw,
Shield,
Trash2,
} from 'lucide-react';
import {Button} from '@/components/ui/button';
import {Card, CardContent, CardDescription, CardHeader, CardTitle,} from '@/components/ui/card';
import {Input} from '@/components/ui/input';
import {Label} from '@/components/ui/label';
import {Badge} from '@/components/ui/badge';
import {Switch} from '@/components/ui/switch';
import { Button } from '@/components/ui/button';
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Badge } from '@/components/ui/badge';
import { Switch } from '@/components/ui/switch';
import {
Dialog,
DialogContent,
@@ -28,10 +45,10 @@ import {
BreadcrumbPage,
BreadcrumbSeparator,
} from '@/components/ui/breadcrumb';
import type {CreateTokenResponse} from '@/lib/services/user';
import {UserService} from '@/lib/services/user';
import {useAuth} from '@/components/providers/auth-provider';
import {toast} from 'sonner';
import type { CreateTokenResponse } from '@/lib/services/user';
import { UserService } from '@/lib/services/user';
import { useAuth } from '@/components/providers/auth-provider';
import { toast } from 'sonner';
export function AccessTokenMain() {
const { user } = useAuth();
@@ -2,12 +2,12 @@
import * as React from 'react';
import Link from 'next/link';
import {Check, Loader2, Monitor, Moon, Sun} from 'lucide-react';
import {useTheme} from 'next-themes';
import {toast} from 'sonner';
import {Button} from '@/components/ui/button';
import {useCustomTheme} from '@/lib/theme';
import {cn} from '@/lib/utils';
import { Check, Loader2, Monitor, Moon, Sun } from 'lucide-react';
import { useTheme } from 'next-themes';
import { toast } from 'sonner';
import { Button } from '@/components/ui/button';
import { useCustomTheme } from '@/lib/theme';
import { cn } from '@/lib/utils';
import {
Breadcrumb,
BreadcrumbItem,
@@ -1,14 +1,20 @@
'use client';
import {useEffect, useState} from 'react';
import {toast} from 'sonner';
import {Button} from '@/components/ui/button';
import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle,} from '@/components/ui/dialog';
import {Input} from '@/components/ui/input';
import {Label} from '@/components/ui/label';
import {Switch} from '@/components/ui/switch';
import { useEffect, useState } from 'react';
import { toast } from 'sonner';
import { Button } from '@/components/ui/button';
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Switch } from '@/components/ui/switch';
import services from '@/lib/services';
import type {AuthSource, AuthSourceRequest} from '@/lib/services/admin';
import type { AuthSource, AuthSourceRequest } from '@/lib/services/admin';
const emptyForm: AuthSourceRequest = {
name: '',
@@ -1,7 +1,7 @@
'use client';
import * as React from 'react';
import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import {
ChevronLeft,
ChevronRight,
@@ -19,12 +19,12 @@ import {
Trash2,
Upload,
} from 'lucide-react';
import {toast} from 'sonner';
import { toast } from 'sonner';
import {Button} from '@/components/ui/button';
import {Input} from '@/components/ui/input';
import {Badge} from '@/components/ui/badge';
import {Card, CardContent} from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent } from '@/components/ui/card';
import {
AlertDialog,
AlertDialogAction,
@@ -36,9 +36,9 @@ import {
AlertDialogTitle,
} from '@/components/ui/alert-dialog';
import {FileImagePreview} from '@/components/common/file-image-preview';
import services, {formatFileSize} from '@/lib/services';
import type {Upload as UploadRecord} from '@/lib/services/upload/types';
import { FileImagePreview } from '@/components/common/file-image-preview';
import services, { formatFileSize } from '@/lib/services';
import type { Upload as UploadRecord } from '@/lib/services/upload/types';
/* ─── 工具函数 ─────────────────────────────────────────── */
@@ -1,9 +1,9 @@
import * as React from 'react';
import Link from 'next/link';
import {cn} from '@/lib/utils';
import {motion} from 'motion/react';
import {Button} from '@/components/ui/button';
import {Book, Check, Copy, Terminal} from 'lucide-react';
import { cn } from '@/lib/utils';
import { motion } from 'motion/react';
import { Button } from '@/components/ui/button';
import { Book, Check, Copy, Terminal } from 'lucide-react';
export interface DeveloperSectionProps {
className?: string;
+2 -2
View File
@@ -1,7 +1,7 @@
import * as React from 'react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
import Link from 'next/link';
import {Github, LucideIcon} from 'lucide-react';
import { Github, LucideIcon } from 'lucide-react';
export interface FooterSectionProps {
className?: string;
@@ -25,8 +25,8 @@
* ```
*/
import {cn} from '@/lib/utils';
import {SnowEffect} from '@/components/ui/snow-effect';
import { cn } from '@/lib/utils';
import { SnowEffect } from '@/components/ui/snow-effect';
/**
* 圣诞树图标组件
+3 -3
View File
@@ -1,8 +1,8 @@
import * as React from 'react';
import {FileTextIcon} from 'lucide-react';
import {Button} from '@/components/ui/button';
import { FileTextIcon } from 'lucide-react';
import { Button } from '@/components/ui/button';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
/**
* 空状态展示组件属性
+3 -3
View File
@@ -1,8 +1,8 @@
import * as React from 'react';
import {AlertCircle} from 'lucide-react';
import {Button} from '@/components/ui/button';
import { AlertCircle } from 'lucide-react';
import { Button } from '@/components/ui/button';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
/**
* 错误展示组件属性
@@ -1,6 +1,6 @@
'use client';
import {useUser} from '@/contexts/user-context';
import { useUser } from '@/contexts/user-context';
/**
* Auth provider bridge hook
+2 -2
View File
@@ -2,9 +2,9 @@
import * as React from 'react';
import * as AccordionPrimitive from '@radix-ui/react-accordion';
import {ChevronDownIcon} from 'lucide-react';
import { ChevronDownIcon } from 'lucide-react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function Accordion({
...props
+2 -2
View File
@@ -3,8 +3,8 @@
import * as React from 'react';
import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
import {cn} from '@/lib/utils';
import {buttonVariants} from '@/components/ui/button';
import { cn } from '@/lib/utils';
import { buttonVariants } from '@/components/ui/button';
function AlertDialog({
...props
+2 -2
View File
@@ -1,6 +1,6 @@
'use client';
import {cn} from '@/lib/utils';
import React, {ReactNode, useEffect, useState} from 'react';
import { cn } from '@/lib/utils';
import React, { ReactNode, useEffect, useState } from 'react';
interface AuroraBackgroundProps extends React.HTMLProps<HTMLDivElement> {
children: ReactNode;
+1 -1
View File
@@ -3,7 +3,7 @@
import * as React from 'react';
import * as AvatarPrimitive from '@radix-ui/react-avatar';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function Avatar({
className,
+3 -3
View File
@@ -1,8 +1,8 @@
import * as React from 'react';
import {Slot} from '@radix-ui/react-slot';
import {cva, type VariantProps} from 'class-variance-authority';
import { Slot } from '@radix-ui/react-slot';
import { cva, type VariantProps } from 'class-variance-authority';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
const badgeVariants = cva(
'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
+3 -3
View File
@@ -1,8 +1,8 @@
import * as React from 'react';
import {Slot} from '@radix-ui/react-slot';
import {ChevronRight, MoreHorizontal} from 'lucide-react';
import { Slot } from '@radix-ui/react-slot';
import { ChevronRight, MoreHorizontal } from 'lucide-react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function Breadcrumb({ ...props }: React.ComponentProps<'nav'>) {
return <nav aria-label='breadcrumb' data-slot='breadcrumb' {...props} />;
+3 -3
View File
@@ -1,8 +1,8 @@
import * as React from 'react';
import {Slot} from '@radix-ui/react-slot';
import {cva, type VariantProps} from 'class-variance-authority';
import { Slot } from '@radix-ui/react-slot';
import { cva, type VariantProps } from 'class-variance-authority';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
const buttonVariants = cva(
"cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+8 -4
View File
@@ -1,11 +1,15 @@
'use client';
import * as React from 'react';
import {ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon,} from 'lucide-react';
import {DayButton, DayPicker, getDefaultClassNames} from 'react-day-picker';
import {
ChevronDownIcon,
ChevronLeftIcon,
ChevronRightIcon,
} from 'lucide-react';
import { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker';
import {cn} from '@/lib/utils';
import {Button, buttonVariants} from '@/components/ui/button';
import { cn } from '@/lib/utils';
import { Button, buttonVariants } from '@/components/ui/button';
function Calendar({
className,
+1 -1
View File
@@ -1,6 +1,6 @@
import * as React from 'react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function Card({ className, ...props }: React.ComponentProps<'div'>) {
return (
+6 -4
View File
@@ -1,11 +1,13 @@
'use client';
import * as React from 'react';
import useEmblaCarousel, {type UseEmblaCarouselType,} from 'embla-carousel-react';
import {ArrowLeft, ArrowRight} from 'lucide-react';
import useEmblaCarousel, {
type UseEmblaCarouselType,
} from 'embla-carousel-react';
import { ArrowLeft, ArrowRight } from 'lucide-react';
import {cn} from '@/lib/utils';
import {Button} from '@/components/ui/button';
import { cn } from '@/lib/utils';
import { Button } from '@/components/ui/button';
type CarouselApi = UseEmblaCarouselType[1];
type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
+1 -1
View File
@@ -3,7 +3,7 @@
import * as React from 'react';
import * as RechartsPrimitive from 'recharts';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
// Format: { THEME_NAME: CSS_SELECTOR }
const THEMES = { light: '', dark: '.dark' } as const;
+2 -2
View File
@@ -2,9 +2,9 @@
import * as React from 'react';
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
import {CheckIcon} from 'lucide-react';
import { CheckIcon } from 'lucide-react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function Checkbox({
className,
+2 -2
View File
@@ -1,8 +1,8 @@
'use client';
import * as React from 'react';
import {Check, Copy} from 'lucide-react';
import {cn} from '@/lib/utils';
import { Check, Copy } from 'lucide-react';
import { cn } from '@/lib/utils';
interface CodeBlockProps extends React.HTMLAttributes<HTMLDivElement> {
code: string;
+1 -1
View File
@@ -1,7 +1,7 @@
'use client';
import * as React from 'react';
import {Collapsible as CollapsiblePrimitive} from 'radix-ui';
import { Collapsible as CollapsiblePrimitive } from 'radix-ui';
function Collapsible({
...props
+11 -5
View File
@@ -1,12 +1,18 @@
'use client';
import * as React from 'react';
import {Command as CommandPrimitive} from 'cmdk';
import {SearchIcon} from 'lucide-react';
import {motion} from 'motion/react';
import { Command as CommandPrimitive } from 'cmdk';
import { SearchIcon } from 'lucide-react';
import { motion } from 'motion/react';
import {cn} from '@/lib/utils';
import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle,} from '@/components/ui/dialog';
import { cn } from '@/lib/utils';
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
function Command({
className,
+2 -2
View File
@@ -2,9 +2,9 @@
import * as React from 'react';
import * as DialogPrimitive from '@radix-ui/react-dialog';
import {XIcon} from 'lucide-react';
import { XIcon } from 'lucide-react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function Dialog({
...props
+1 -1
View File
@@ -1,5 +1,5 @@
import * as React from 'react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
const DocsTable = React.forwardRef<
HTMLTableElement,
+2 -2
View File
@@ -1,9 +1,9 @@
'use client';
import * as React from 'react';
import {Drawer as DrawerPrimitive} from 'vaul';
import { Drawer as DrawerPrimitive } from 'vaul';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function Drawer({
...props
+2 -2
View File
@@ -2,9 +2,9 @@
import * as React from 'react';
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
import {CheckIcon, ChevronRightIcon, CircleIcon} from 'lucide-react';
import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';
import {cn} from '@/lib/utils';
import { cn } from '@/lib/utils';
function DropdownMenu({
...props
+5 -5
View File
@@ -1,11 +1,11 @@
'use client';
import {useMemo} from 'react';
import {cva, type VariantProps} from 'class-variance-authority';
import { useMemo } from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import {cn} from '@/lib/utils';
import {Label} from '@/components/ui/label';
import {Separator} from '@/components/ui/separator';
import { cn } from '@/lib/utils';
import { Label } from '@/components/ui/label';
import { Separator } from '@/components/ui/separator';
function FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {
return (
+1 -1
View File
@@ -1,6 +1,6 @@
'use client';
import {useEffect, useRef} from 'react';
import { useEffect, useRef } from 'react';
interface Particle {
x: number;
+3 -3
View File
@@ -2,7 +2,7 @@
import * as React from 'react';
import * as LabelPrimitive from '@radix-ui/react-label';
import {Slot} from '@radix-ui/react-slot';
import { Slot } from '@radix-ui/react-slot';
import {
Controller,
type ControllerProps,
@@ -13,8 +13,8 @@ import {
useFormState,
} from 'react-hook-form';
import {cn} from '@/lib/utils';
import {Label} from '@/components/ui/label';
import { cn } from '@/lib/utils';
import { Label } from '@/components/ui/label';
const Form = FormProvider;