haiku-react-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1550 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +177 -0
- package/dist/index.d.ts +177 -0
- package/dist/index.js +1525 -0
- package/dist/index.js.map +1 -0
- package/dist/preset.css +87 -0
- package/dist/styles.css +1409 -0
- package/dist/styles.css.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/Button/button.tsx","../src/components/Avatar/avatar.tsx","../src/components/PlayBoard/playBoard.tsx","../src/components/Bubble/useTyping.ts","../src/components/Bubble/TypingContent.tsx","../src/components/Bubble/bubble.tsx","../src/components/Upload/utils.ts","../src/components/Upload/types.ts","../src/components/Upload/components/UploadTrigger.tsx","../src/components/Upload/components/ButtonUpload.tsx","../src/components/Upload/components/DraggerUpload.tsx","../src/components/Upload/components/ImageUpload.tsx","../src/components/Upload/components/FileList.tsx","../src/components/Upload/index.tsx"],"names":["cva","jsx","Icon","React","jsxs","React3","React4","Fragment","useState","useId","useRef","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport { Icon } from \"@iconify/react\";\n\nconst buttonVariants = cva(\n \"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-300 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-primary-700 dark:focus-visible:ring-offset-zinc-950\",\n {\n variants: {\n variant: {\n primary: \"shadow-sm\",\n default: \"border shadow-sm\",\n dashed: \"border-2 border-dashed shadow-sm\",\n filled: \"\",\n text: \"\",\n link: \"underline-offset-4 hover:underline\",\n },\n color: {\n default: \"\",\n primary: \"\",\n danger: \"\",\n info: \"\",\n success: \"\",\n warning: \"\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 px-6 has-[>svg]:px-4\",\n },\n shape: {\n default: \"rounded-md\",\n rounded: \"rounded-full\",\n square: \"rounded-none\",\n }\n },\n compoundVariants: [\n // primary (solid)\n {\n variant: \"primary\",\n color: \"default\",\n className: \"bg-default text-white hover:bg-default\",\n },\n {\n variant: \"primary\",\n color: \"primary\",\n className: \"bg-primary-900 text-primary-foreground hover:bg-primary-800\",\n },\n {\n variant: \"primary\",\n color: \"danger\",\n className: \"bg-danger text-white hover:bg-danger\",\n },\n {\n variant: \"primary\",\n color: \"info\",\n className: \"bg-info text-white hover:bg-info\",\n },\n {\n variant: \"primary\",\n color: \"success\",\n className: \"bg-success text-white hover:bg-success\",\n },\n {\n variant: \"primary\",\n color: \"warning\",\n className: \"bg-warning text-white hover:bg-warning\",\n },\n\n // default (outline)\n {\n variant: \"default\",\n color: \"default\",\n className:\n \"bg-white text-default border-default hover:bg-default-foreground hover:border-default\",\n },\n {\n variant: \"default\",\n color: \"primary\",\n className:\n \"bg-white text-primary-900 border-primary-300 hover:bg-primary-100/60 \",\n },\n {\n variant: \"default\",\n color: \"danger\",\n className:\n \"bg-white text-danger border-danger-foreground hover:bg-danger-50 hover:bg-danger-foreground/6\",\n },\n {\n variant: \"default\",\n color: \"info\",\n className:\n \"bg-white text-info border-info-300 hover:bg-info-foreground/6 border-info-foreground\",\n },\n {\n variant: \"default\",\n color: \"success\",\n className:\n \"bg-white text-success border-success-300 hover:bg-success-foreground/6 border-success-foreground\",\n },\n {\n variant: \"default\",\n color: \"warning\",\n className:\n \"bg-white text-warning border-warning-300 hover:bg-warning-foreground/6 border-warning-foreground\",\n },\n\n // dashed (dashed outline)\n {\n variant: \"dashed\",\n color: \"default\",\n className:\n \"bg-white text-default border-default hover:bg-default-foreground hover:border-default\",\n },\n {\n variant: \"dashed\",\n color: \"primary\",\n className:\n \"bg-white text-primary-900 border-primary-300 hover:bg-primary-foreground hover:border-primary-400\",\n },\n {\n variant: \"dashed\",\n color: \"danger\",\n className:\n \"bg-white text-danger border-danger-foreground hover:bg-danger-50 hover:border-danger-foreground\",\n },\n {\n variant: \"dashed\",\n color: \"info\",\n className:\n \"bg-white text-blue-700 border-blue-300 hover:bg-blue-50 hover:border-blue-400\",\n },\n {\n variant: \"dashed\",\n color: \"success\",\n className:\n \"bg-white text-emerald-700 border-emerald-300 hover:bg-emerald-50 hover:border-emerald-400\",\n },\n {\n variant: \"dashed\",\n color: \"warning\",\n className:\n \"bg-white text-amber-800 border-amber-300 hover:bg-amber-50 hover:border-amber-400\",\n },\n\n // filled (tinted)\n {\n variant: \"filled\",\n color: \"default\",\n className: \"bg-zinc-100 text-zinc-900 hover:bg-zinc-200\",\n },\n {\n variant: \"filled\",\n color: \"primary\",\n className: \"bg-primary-100 text-primary-900 hover:bg-primary-200\",\n },\n {\n variant: \"filled\",\n color: \"danger\",\n className: \"bg-red-50 text-red-700 hover:bg-red-100\",\n },\n {\n variant: \"filled\",\n color: \"info\",\n className: \"bg-blue-50 text-blue-700 hover:bg-blue-100\",\n },\n {\n variant: \"filled\",\n color: \"success\",\n className: \"bg-emerald-50 text-emerald-700 hover:bg-emerald-100\",\n },\n {\n variant: \"filled\",\n color: \"warning\",\n className: \"bg-amber-50 text-amber-800 hover:bg-amber-100\",\n },\n\n // text (no border/bg)\n {\n variant: \"text\",\n color: \"default\",\n className: \"text-zinc-900 hover:bg-zinc-100\",\n },\n {\n variant: \"text\",\n color: \"primary\",\n className: \"text-primary-900 hover:bg-primary-100\",\n },\n {\n variant: \"text\",\n color: \"danger\",\n className: \"text-red-700 hover:bg-red-50\",\n },\n {\n variant: \"text\",\n color: \"info\",\n className: \"text-blue-700 hover:bg-blue-50\",\n },\n {\n variant: \"text\",\n color: \"success\",\n className: \"text-emerald-700 hover:bg-emerald-50\",\n },\n {\n variant: \"text\",\n color: \"warning\",\n className: \"text-amber-800 hover:bg-amber-50\",\n },\n\n // link (no border/bg)\n {\n variant: \"link\",\n color: \"default\",\n className: \"text-zinc-900 hover:text-zinc-700\",\n },\n {\n variant: \"link\",\n color: \"primary\",\n className: \"text-primary-900 hover:text-primary-800\",\n },\n {\n variant: \"link\",\n color: \"danger\",\n className: \"text-red-700 hover:text-red-600\",\n },\n {\n variant: \"link\",\n color: \"info\",\n className: \"text-blue-700 hover:text-blue-600\",\n },\n {\n variant: \"link\",\n color: \"success\",\n className: \"text-emerald-700 hover:text-emerald-600\",\n },\n {\n variant: \"link\",\n color: \"warning\",\n className: \"text-amber-800 hover:text-amber-700\",\n },\n ],\n defaultVariants: {\n variant: \"default\",\n color: \"default\",\n size: \"default\",\n shape: \"default\",\n },\n }\n)\n\ninterface ButtonOwnProps {\n color?: \"default\" | \"primary\" | \"danger\" | \"info\" | \"success\" | \"warning\";\n loading?: boolean;\n icon?: React.ReactNode | string;\n disabled?: boolean;\n}\n\ntype ButtonBaseProps = VariantProps<typeof buttonVariants> & ButtonOwnProps\n\ntype ButtonAsButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &\n ButtonBaseProps & {\n as?: \"button\";\n }\n\ntype ButtonAsLabelProps = React.LabelHTMLAttributes<HTMLLabelElement> &\n ButtonBaseProps & {\n as?: \"label\";\n }\n\nexport type ButtonProps = ButtonAsButtonProps | ButtonAsLabelProps\n\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n color,\n shape = \"default\",\n loading = false,\n disabled,\n children,\n icon,\n as = \"button\",\n ...props\n}: ButtonProps) {\n const resolvedColor = color ?? (variant === \"primary\" ? \"primary\" : \"default\")\n const isDisabled = disabled || loading\n const isLabel = as === \"label\" || \"htmlFor\" in props\n const baseClassName = cn(\n buttonVariants({ color: resolvedColor, variant, size, shape, className }),\n loading && \"disabled:cursor-wait opacity-70\",\n isDisabled && \"cursor-not-allowed opacity-50\"\n )\n\n if (isLabel) {\n const { disabled: _disabled, ...labelProps } =\n props as React.LabelHTMLAttributes<HTMLLabelElement> & {\n disabled?: boolean;\n }\n return (\n <label\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n data-shape={shape}\n data-color={resolvedColor}\n data-loading={loading ? \"\" : undefined}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n className={baseClassName}\n {...labelProps}\n >\n {loading ? (\n <span\n aria-hidden=\"true\"\n className=\"size-4 animate-spin rounded-full border-2 border-current border-t-transparent\"\n />\n ) : icon ? (\n typeof icon === \"string\" ? (\n <Icon icon={icon} width=\"16\" height=\"16\" />\n ) : (\n icon\n )\n ) : null}\n {children}\n </label>\n )\n }\n\n return (\n <button\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n data-shape={shape}\n data-color={resolvedColor}\n data-loading={loading ? \"\" : undefined}\n aria-busy={loading || undefined}\n disabled={isDisabled}\n className={baseClassName}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {loading ? (\n <span\n aria-hidden=\"true\"\n className=\"size-4 animate-spin rounded-full border-2 border-current border-t-transparent\"\n />\n ) : icon ? (\n typeof icon === \"string\" ? (\n <Icon icon={icon} width=\"16\" height=\"16\" />\n ) : (\n icon\n )\n ) : null}\n {children}\n </button>\n )\n}\n\nexport { Button, buttonVariants }\n","\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"@iconify/react\";\nimport React from \"react\";\n\nconst avatarVariants = cva(\n \"inline-flex items-center justify-center overflow-hidden align-middle text-primary-foreground\",\n {\n variants: {\n variant: {\n default: \"bg-muted-foreground \",\n ghost: \"text-white\",\n primary: \"bg-primary-900 text-primary-foreground\",\n info: \"bg-info text-info-foreground\",\n success: \"bg-success text-success-foreground\",\n warning: \"bg-warning text-warning-foreground\",\n danger: \"bg-danger text-danger-foreground\",\n\n },\n shape: {\n rounded: \"rounded-full\",\n square: \"rounded-md\",\n },\n size: {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n }\n },\n defaultVariants: {\n shape: \"rounded\",\n size: \"md\",\n variant: \"default\",\n }\n }\n);\n\ninterface AvatarProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof avatarVariants> {\n alt?: string;\n icon?: React.ReactNode | string;\n url?: string;\n}\n\nexport default function Avatar({\n alt,\n icon,\n shape,\n size,\n variant,\n className,\n url,\n ...props\n}: AvatarProps) {\n return (\n <div className={cn(avatarVariants({ shape, size, variant }), className)} {...props}>\n {icon ? (\n typeof icon === \"string\" ? (\n <Icon icon={icon} className=\"w-[80%] h-[80%]\" />\n ) : (\n icon\n )\n ) : (\n url ? (\n <img src={url} alt={alt} className=\"w-full h-full object-cover\" />\n ) : (\n\n <span className=\"text-sm font-medium\">{alt ? alt.charAt(0).toUpperCase() : \"?\"}</span>)\n )}\n </div>\n )\n}\n","\r\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport type PlayBoardProps = React.HTMLAttributes<HTMLDivElement> & {\n icon?: React.ReactNode\n heading?: React.ReactNode\n description?: React.ReactNode\n actions?: React.ReactNode\n code?: string\n defaultExpanded?: boolean\n previewClassName?: string\n}\n\nfunction PlayBoard({\n icon,\n heading,\n description,\n actions,\n code,\n defaultExpanded = false,\n previewClassName,\n className,\n children,\n ...props\n}: PlayBoardProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded)\n const codeId = React.useId()\n const hasCode = typeof code === \"string\" && code.trim().length > 0\n\n return (\n <section\n className={cn(\n \"overflow-hidden rounded-xl border border-zinc-200/70 bg-white shadow-sm dark:border-zinc-800 dark:bg-zinc-950\",\n className\n )}\n {...props}\n >\n {(heading || description || actions) && (\n <div className=\"flex items-start justify-between gap-4 border-b border-zinc-200/70 px-5 py-4 dark:border-zinc-800\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className=\"flex size-9 items-center justify-center rounded-full bg-zinc-100 text-zinc-600 dark:bg-zinc-900 dark:text-zinc-300\">\n {icon}\n </div>\n )}\n {heading && (\n <div className=\"truncate text-sm font-medium text-zinc-900 dark:text-zinc-50\">\n {heading}\n </div>\n )}\n </div>\n {description && (\n <div className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-400\">\n {description}\n </div>\n )}\n </div>\n {actions && <div className=\"shrink-0\">{actions}</div>}\n </div>\n )}\n\n <div className={cn(\"px-5 py-6\", previewClassName)}>\n <div className=\"rounded-lg bg-zinc-50 p-5 dark:bg-zinc-900/40\">\n {children}\n </div>\n </div>\n\n {hasCode && (\n <div className=\"border-t border-zinc-200/70 dark:border-zinc-800\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-center gap-2 px-5 py-3 text-sm text-zinc-600 hover:bg-zinc-50 dark:text-zinc-300 dark:hover:bg-zinc-900/30\"\n aria-expanded={expanded}\n aria-controls={codeId}\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? \"收起代码\" : \"展开代码\"}\n </button>\n {expanded && (\n <pre\n id={codeId}\n className=\"overflow-x-auto border-t border-zinc-200/70 bg-zinc-950 px-5 py-4 text-xs leading-relaxed text-zinc-50 dark:border-zinc-800\"\n >\n <code>{code}</code>\n </pre>\n )}\n </div>\n )}\n </section>\n )\n}\n\nexport default PlayBoard\n","import * as React from \"react\"\n\n//定义打字配置对象的结构(效果、步长、间隔、是否保留前缀)。\nexport type BubbleTypingConfig = {\n effect?: \"typing\" | \"fade-in\"\n step?: number | [number, number]\n interval?: number\n keepPrefix?: boolean\n}\n// typing 参数既可布尔也可配置对象\nexport type BubbleTypingInput = boolean | BubbleTypingConfig\n\n//定义渲染分片的数据结构(id、文本、是否完成、任务 id)。\nexport type BubbleTypingChunk = {\n id: string\n text: string\n done: boolean\n taskId: number\n}\n\n//计算一组字符串的最长公共前缀,用于“保留已有前缀”。\n//这样如果 content 发生更新但前缀相同(比如流式追加、或内容替换但开头一致),就保留这段已打出的部分,避免从头重打。\nfunction getLongestCommonPrefix(strings: string[]) {\n if (!strings.length) return \"\"\n return strings.reduce((prefix, current) => {\n let index = 0\n while (\n index < prefix.length &&\n index < current.length &&\n prefix[index] === current[index]\n ) {\n index += 1\n }\n return prefix.slice(0, index)\n })\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value)\n}\n\nfunction getUid() {\n return Math.random().toString(16).slice(2)\n}\n\nfunction requestFrame(callback: FrameRequestCallback) {\n if (typeof requestAnimationFrame !== \"undefined\") {\n return requestAnimationFrame(callback)\n }\n /**\n * 这条分支只在“没有 requestAnimationFrame”的环境下会走到,也就是:\n 非浏览器环境(SSR/Node.js/测试环境)\n 或浏览器被裁剪/禁用 RAF 的场景\n 此时用 setTimeout 模拟一帧(约 16ms),返回它的 id,并把 Date.now() 作为时间戳传给回调,保证后续逻辑仍能工作。\n */\n return setTimeout(() => callback(Date.now()), 16) as unknown as number\n}\n//停止当前 rafId 对应的下一次 tick 执行,从而中断动画循环.\nfunction cancelFrame(id: number) {\n if (typeof cancelAnimationFrame !== \"undefined\") {\n cancelAnimationFrame(id)\n return\n }\n clearTimeout(id)\n}\n\nexport function useTyping({\n streaming,\n content,\n typing,\n onTyping,\n onTypingComplete,\n}: {\n streaming: boolean\n content: string\n typing: BubbleTypingInput\n onTyping?: (renderedContent: string, currentContent: string) => void\n onTypingComplete?: (content: string) => void\n}) {\n const [chunks, setChunks] = React.useState<BubbleTypingChunk[]>([])\n\n const rafId = React.useRef(-1) // 保存最近一次requestFrame返回的id,用于停止frame循环\n const currentTaskId = React.useRef(1) //保存“当前吐字任务”的版本号\n const animatingRef = React.useRef(false) //在 useEffect 里它被用来决定是否启动 execute:只有 false 才会启动;一旦被设为 true,就避免重复重启动画。\n const renderedRef = React.useRef(\"\") // 当前已经渲染出来的完整文本(拼接结果)\n const streamingRef = React.useRef(streaming) //是否还在流式\n streamingRef.current = streaming\n\n // 检查合并typing配置\n // 把外部 typing 配置和默认配置合并,同时做强校验”,只在 typing 变化时重新计算\n // 这里用 Required<BubbleTypingConfig> 的目的就是“把可选字段变成必选”,让 TypeScript 认为最终配置一定完整\n const mergedConfig = React.useMemo<Required<BubbleTypingConfig>>(() => {\n const base: Required<BubbleTypingConfig> = {\n effect: \"fade-in\",\n interval: 100,\n step: 6,\n keepPrefix: true,\n }\n //如果 typing 是布尔值(true/false),直接用默认配置(等价于“使用默认打字配置”)\n if (typing === false) return base\n if (typing === true) return base\n\n const interval = typing.interval ?? base.interval\n const step = typing.step ?? base.step\n const effect = typing.effect ?? base.effect\n const keepPrefix = typing.keepPrefix ?? base.keepPrefix\n\n if (!isNumber(interval) || interval <= 0) {\n throw new Error(\"[Bubble] invalid typing.interval, expect positive number.\")\n }\n\n const stepIsNumber = isNumber(step)\n if (!stepIsNumber && !Array.isArray(step)) {\n throw new Error(\"[Bubble] invalid typing.step, expect number or [min,max].\")\n }\n if (stepIsNumber && step <= 0) {\n throw new Error(\"[Bubble] invalid typing.step, expect positive number.\")\n }\n if (Array.isArray(step)) {\n if (!isNumber(step[0]) || step[0] <= 0) {\n throw new Error(\"[Bubble] invalid typing.step[0], expect positive number.\")\n }\n if (!isNumber(step[1]) || step[1] <= 0) {\n throw new Error(\"[Bubble] invalid typing.step[1], expect positive number.\")\n }\n if (step[0] > step[1]) {\n throw new Error(\"[Bubble] invalid typing.step, step[0] should <= step[1].\")\n }\n }\n\n return { effect, interval, step, keepPrefix }\n }, [typing])\n\n // 获取当前的typing配置\n const typingSourceRef = React.useRef({\n content,\n interval: mergedConfig.interval,\n step: mergedConfig.step,\n })\n typingSourceRef.current = {\n content,\n interval: mergedConfig.interval,\n step: mergedConfig.step,\n }\n\n const reset = React.useCallback(() => {\n cancelFrame(rafId.current)\n rafId.current = -1\n setChunks([])\n renderedRef.current = \"\"\n animatingRef.current = false\n }, [])\n\n const execute = React.useCallback(\n (taskId: number) => {\n let lastFrameTime = 0 //记录上一次“真正吐字”的时间戳;用于做 interval 节流(不是每一帧都吐字)。\n\n renderedRef.current = mergedConfig.keepPrefix\n ? getLongestCommonPrefix([typingSourceRef.current.content, renderedRef.current])\n : \"\"\n\n // 放置一个起始块!\n setChunks(\n renderedRef.current\n ? [{ text: renderedRef.current, id: getUid(), taskId, done: true }]\n : [],\n )\n // 定义每一个tick我们具体要做些什么\n const tick = () => {\n // tick 是异步循环里的闭包,taskId 是启动时的快照。\n // 当有这些情况发生时,会递增 currentTaskId.current\n // 动画完成时:currentTaskId.current += 1\n // 中途被打断重启时:execute((currentTaskId.current += 1))\n if (taskId !== currentTaskId.current) return\n\n //计算当前时间戳。 优先用 performance.now()(更精细),否则退化用 Date.now()。\n const now =\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now()\n\n const { content: fullContent, interval, step } = typingSourceRef.current\n if (now - lastFrameTime < interval) {\n rafId.current = requestFrame(tick) //排一帧继续检查(把 id 存起来,方便取消)。\n return //这次不吐字\n }\n\n const currentLen = renderedRef.current.length //当前已经渲染到多少字符。\n const resolvedStep = isNumber(step) //决定本次前进步长。\n ? step\n : Math.floor(Math.random() * (step[1] - step[0] + 1)) + step[0]\n\n const nextText = fullContent.slice(currentLen, currentLen + resolvedStep) //从完整内容中切出“下一段要追加的文本”。\n\n if (!nextText) { //如果切出来为空,说明“已经追上当前 fullContent 的末尾”。\n //用 streamingRef.current 是为了让不重启动画的情况下,tick 每次都能读到最新的流式状态\n //如果不用ref那么闭包内部只是拿到streaming的第一次快照\n if (streamingRef.current) { //但如果外部还在流式(后面还会继续追加 content)\n rafId.current = requestFrame(tick) //不要宣布完成,继续等下一帧(等外部把 content 变长)。\n return\n }\n // 走到这里说明:不在 streaming,且已经追到末尾,要“收尾”。\n setChunks([\n {\n text: renderedRef.current,\n id: getUid(),\n taskId,\n done: true,\n },\n ])\n\n onTypingComplete?.(fullContent) //触发完成回调(可选),通知外部“这一轮打字完成了”。\n animatingRef.current = false //标记动画结束\n currentTaskId.current += 1 //把全局任务 id 加 1,让当前任务立刻失效\n return\n }\n\n renderedRef.current += nextText //正常情况(还有内容可吐)就把 nextText 追加到“已渲染全文本”里。\n setChunks((prev) => //把这段 nextText 作为一个新 chunk 追加到数组尾部(触发 UI 更新)。\n prev.concat({\n id: getUid(),\n text: nextText,\n taskId,\n done: false,\n }),\n )\n\n\n animatingRef.current = true\n lastFrameTime = now //更新上次吐字时间戳(用于下一轮 interval 节流)。\n rafId.current = requestFrame(tick) //安排下一帧继续吐字。\n onTyping?.(renderedRef.current, fullContent)\n }\n\n tick()\n },\n [mergedConfig.keepPrefix, onTyping, onTypingComplete],\n )\n\n React.useEffect(() => {\n // content 为空(\"\"、null/undefined 等被判 falsy)时进入。场景:刚初始化或外部清空内容。\n if (!content) return reset() \n // 新的 content 与已渲染文本完全一致时进入。场景:重复设置相同内容、或流式更新没有新增字符。\n if (content === renderedRef.current) return\n\n //正在动画中,但新 content 不是已渲染文本的前缀时进入。\n //场景:外部content被替换/截断/回退(比如从“Hello wor”变成“Hi”或“Hello!”)。\n if (animatingRef.current && !content.startsWith(renderedRef.current)) {\n // 取消当前帧、递增任务id重新打字\n cancelFrame(rafId.current)\n animatingRef.current = false\n rafId.current = requestFrame(() => execute((currentTaskId.current += 1)))\n return\n }\n\n //初次收到内容\n if (!animatingRef.current) {\n execute(currentTaskId.current)\n }\n }, [content, execute, reset])\n\n React.useEffect(() => () => cancelFrame(rafId.current), [])\n\n return {\n chunks,\n animating: animatingRef.current,\n config: mergedConfig,\n renderedText: renderedRef.current,\n }\n}\n\n","import * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { BubbleTypingConfig, BubbleTypingInput } from \"./useTyping\"\nimport { useTyping } from \"./useTyping\"\n\nexport type TypingContentProps = {\n content: string\n typing: BubbleTypingInput\n streaming: boolean\n className?: string\n cursor?: string\n onTyping?: (renderedContent: string, currentContent: string) => void\n onTypingComplete?: (content: string) => void\n}\n\nexport function TypingContent({\n content,\n typing,\n streaming,\n className,\n cursor = \"|\",\n onTyping,\n onTypingComplete,\n}: TypingContentProps) {\n\n const { chunks, animating, config } = useTyping({\n streaming,\n content,\n typing,\n onTyping,\n onTypingComplete,\n })\n\n const effect = config.effect\n const isTypingEffect = typing !== true && effect === \"typing\"\n\n return (\n <div\n className={cn(\n \"whitespace-pre-wrap break-words\",\n className,\n )}\n >\n {chunks.map((chunk) =>\n config.effect === \"fade-in\" && !chunk.done ? (\n <span\n key={chunk.id}\n className=\"inline animate-[haiku-bubble-fade-in_0.1s_linear]\"\n >\n {chunk.text}\n </span>\n ) : (\n <React.Fragment key={chunk.id}>{chunk.text}</React.Fragment>\n ),\n )}\n {isTypingEffect && animating ? (\n <span\n aria-hidden=\"true\"\n className={cn(\"ml-1 select-none font-black\", \"animate-[haiku-bubble-cursor-blink_0.8s_linear_infinite]\")}\n >\n {cursor}\n </span>\n ) : null}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport type { BubbleTypingConfig, BubbleTypingInput } from \"./useTyping\"\nimport { TypingContent } from \"./TypingContent\"\n\nexport type BubblePlacement = \"start\" | \"end\"\nexport type BubbleVariant = \"filled\" | \"outlined\" | \"shadow\" | \"borderless\"\nexport type BubbleShape = \"default\" | \"round\" | \"corner\"\n \nexport type BubbleInfo = {\n key?: string | number\n status?: string\n extraInfo?: Record<string, unknown>\n}\n//泛型 ContentType 的好处是:当传入 content=\"hello\" 时,\n//插槽函数的 content 参数会被推断成 string,就不需要手动收窄了。\n//当传入 content={<div />} 时,插槽函数的 content 参数会被推断成 React.ReactNode。\n//其余的插槽类型会跟着 content 类型变化。\nexport type BubbleSlot<ContentType extends React.ReactNode> =\n | React.ReactNode\n | ((content: ContentType, info: BubbleInfo) => React.ReactNode)\n\nexport type BubbleProps<ContentType extends React.ReactNode = React.ReactNode> = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"content\"\n> & {\n content: ContentType\n info?: BubbleInfo\n placement?: BubblePlacement\n variant?: BubbleVariant\n shape?: BubbleShape\n header?: BubbleSlot<ContentType>\n footer?: BubbleSlot<ContentType>\n avatar?: BubbleSlot<ContentType>\n extra?: BubbleSlot<ContentType>\n contentRender?: (content: ContentType, info: BubbleInfo) => React.ReactNode\n typing?:\n | boolean\n | BubbleTypingConfig\n | ((content: ContentType, info: BubbleInfo) => boolean | BubbleTypingConfig)\n typingCursor?: string\n streaming?: boolean\n loading?: boolean\n loadingRender?: () => React.ReactNode\n onTyping?: (renderedContent: string, currentContent: string) => void\n onTypingComplete?: (content: string) => void\n}\n\nconst bubbleRootVariants = cva(\"flex gap-3\", {\n variants: {\n placement: {\n start: \"flex-row\",\n end: \"flex-row-reverse\",\n },\n },\n defaultVariants: {\n placement: \"start\",\n },\n})\n\nconst bubbleContentVariants = cva(\n \"max-w-full min-w-0 px-4 py-3 text-sm leading-6 text-default break-words\",\n {\n variants: {\n variant: {\n filled: \"bg-zinc-100 text-zinc-900 dark:bg-zinc-900/60 dark:text-zinc-50\",\n outlined:\n \"border border-zinc-200/70 bg-white text-zinc-900 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-50\",\n shadow:\n \"bg-white text-zinc-900 shadow-sm dark:bg-zinc-950 dark:text-zinc-50\",\n borderless: \"bg-transparent p-0\",\n },\n shape: {\n default: \"rounded-xl\",\n round: \"rounded-full\",\n corner: \"rounded-xl\",\n },\n placement: {\n start: \"\",\n end: \"\",\n },\n },\n compoundVariants: [\n { shape: \"corner\", placement: \"start\", className: \"rounded-tl-sm\" },\n { shape: \"corner\", placement: \"end\", className: \"rounded-tr-sm\" },\n ],\n defaultVariants: {\n variant: \"filled\",\n shape: \"default\",\n placement: \"start\",\n },\n },\n)\n\nfunction renderSlot<ContentType extends React.ReactNode>(\n slot: BubbleSlot<ContentType> | undefined,\n content: ContentType,\n info: BubbleInfo,\n) {\n if (!slot) return null\n return typeof slot === \"function\" ? slot(content, info) : slot\n}\n\nfunction DefaultLoading() {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className=\"size-1.5 animate-bounce rounded-full bg-zinc-400 [animation-delay:-0.2s] dark:bg-zinc-500\" />\n <span className=\"size-1.5 animate-bounce rounded-full bg-zinc-400 [animation-delay:-0.1s] dark:bg-zinc-500\" />\n <span className=\"size-1.5 animate-bounce rounded-full bg-zinc-400 dark:bg-zinc-500\" />\n </div>\n )\n}\n\nexport function Bubble<ContentType extends React.ReactNode = React.ReactNode>({\n content,\n info,\n placement = \"start\",\n variant = \"filled\",\n shape = \"default\",\n header,\n footer,\n avatar,\n extra,\n contentRender,\n typing,\n typingCursor,\n streaming = false,\n loading = false,\n loadingRender,\n onTyping,\n onTypingComplete,\n className,\n ...props\n}: BubbleProps<ContentType> & VariantProps<typeof bubbleContentVariants>) {\n const mergedInfo = info ?? {}\n const rendered = contentRender ? contentRender(content, mergedInfo) : content\n\n const mergedTyping =\n typeof typing === \"function\" ? typing(content, mergedInfo) : typing\n\n const useInnerAnimation = Boolean(mergedTyping) && typeof rendered === \"string\"\n\n React.useEffect(() => {\n if (useInnerAnimation) return\n if (streaming) return\n if (typeof rendered === \"string\" && rendered) {\n onTypingComplete?.(rendered)\n }\n }, [rendered, streaming, useInnerAnimation, onTypingComplete])\n\n const contentNode = (() => {\n if (loading) {\n return loadingRender ? loadingRender() : <DefaultLoading />\n }\n\n if (useInnerAnimation) {\n return (\n <TypingContent\n content={rendered as string}\n streaming={streaming}\n typing={mergedTyping as BubbleTypingInput}\n cursor={typingCursor}\n onTyping={onTyping}\n onTypingComplete={onTypingComplete}\n />\n )\n }\n\n return typeof rendered === \"string\" ? (\n <div className=\"whitespace-pre-wrap break-words\">{rendered}</div>\n ) : (\n rendered\n )\n })()\n\n const avatarNode = renderSlot(avatar, content, mergedInfo)\n const headerNode = renderSlot(header, content, mergedInfo)\n const footerNode = renderSlot(footer, content, mergedInfo)\n const extraNode = renderSlot(extra, content, mergedInfo)\n\n return (\n <div\n className={cn(bubbleRootVariants({ placement }), className)}\n data-slot=\"bubble\"\n data-placement={placement}\n data-variant={variant}\n data-shape={shape}\n data-loading={loading ? \"\" : undefined}\n {...props}\n >\n {avatarNode ? <div className=\"shrink-0\">{avatarNode}</div> : null}\n\n <div className=\"flex min-w-0 max-w-full flex-col\">\n {headerNode ? (\n <div className={cn(\"mb-1 text-xs text-zinc-500 dark:text-zinc-400\")}>\n {headerNode}\n </div>\n ) : null}\n\n <div\n className={cn(\n bubbleContentVariants({ variant, shape, placement }),\n typeof rendered === \"string\" && \"whitespace-pre-wrap\",\n )}\n >\n {contentNode}\n </div>\n\n {footerNode ? (\n <div\n className={cn(\n \"mt-2 text-xs text-zinc-500 dark:text-zinc-400\",\n placement === \"end\" && \"text-right\",\n )}\n >\n {footerNode}\n </div>\n ) : null}\n </div>\n\n {extraNode && !loading ? <div className=\"shrink-0\">{extraNode}</div> : null}\n </div>\n )\n}\n","import { FileRequestOptions } from \"./types\";\n\n/**\n * 上传文件到服务器\n * 使用 XMLHttpRequest 实现,支持进度回调和取消功能\n * @param options - 文件请求选项\n * @returns Promise<string> - 服务器响应文本\n */\nconst uploadFile = ({\n action,\n file,\n method = \"post\",\n header,\n onProgress,\n signal,\n formData: providedFormData,\n}: FileRequestOptions) =>\n new Promise<string>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method.toUpperCase(), action, true);\n\n const handleAbort = () => {\n xhr.abort();\n };\n\n if (header) {\n Object.entries(header).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n xhr.upload.onprogress = (event) => {\n onProgress?.(event);\n };\n\n xhr.onload = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n resolve(xhr.responseText);\n };\n\n xhr.onerror = (event) => {\n signal?.removeEventListener(\"abort\", handleAbort);\n reject(event);\n };\n\n xhr.onabort = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n reject(new DOMException(\"Upload aborted\", \"AbortError\"));\n };\n\n if (signal?.aborted) {\n reject(new DOMException(\"Upload aborted\", \"AbortError\"));\n return;\n }\n signal?.addEventListener(\"abort\", handleAbort);\n\n // 使用传入的 formData,或创建一个新的\n const formData = providedFormData || new FormData();\n if (!providedFormData && file) {\n formData.append(\"file\", file);\n }\n xhr.send(formData);\n });\n\n\nexport {\n uploadFile\n}\n","import { cva, type VariantProps} from \"class-variance-authority\";\n\n/** 上传状态类型 */\ntype UploadStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\n\n/** HTTP 请求方法类型 */\ntype HttpMethod = \"get\" | \"post\" | \"put\";\n\n/** 文件请求选项 */\ntype FileRequestOptions = {\n action: string; // 上传地址\n file?: File; // 要上传的文件(如果提供 formData 则可选)\n method?: HttpMethod; // 请求方法,默认 post\n header?: Record<string, string>; // 请求头\n onProgress?: (event: ProgressEvent<EventTarget>) => void; // 进度回调\n signal?: AbortSignal; // 中止信号\n formData?: FormData; // 完整的 FormData 对象\n};\n\n// ============================================\n// 统一配置 API (4.1 API 设计优化)\n// ============================================\n\n/** 上传模式类型 */\nexport type UploadMode = 'button' | 'image' | 'dragger';\n\n/** 上传变体类型 */\nexport type UploadVariant = 'default' | 'dashed';\n\n/** 上传尺寸类型 */\nexport type UploadSize = 'sm' | 'md' | 'lg';\n\n/** 上传形状类型 */\nexport type UploadShape = 'rounded' | 'square';\n\n/** 文件接受类型 - 预定义类型或自定义 MIME 类型/扩展名 */\nexport type UploadAcceptType =\n | 'image/*' // 所有图片\n | 'video/*' // 所有视频\n | 'audio/*' // 所有音频\n | 'image/jpeg' // JPEG 图片\n | 'image/png' // PNG 图片\n | 'image/gif' // GIF 图片\n | 'image/webp' // WebP 图片\n | 'application/pdf' // PDF 文档\n | 'application/msword' // Word 文档\n | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' // Word 2007+\n | 'application/vnd.ms-excel' // Excel 文档\n | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' // Excel 2007+\n | 'application/zip' // ZIP 压缩文件\n | 'application/x-rar-compressed' // RAR 压缩文件\n | 'text/*' // 所有文本文件\n | `.${string}`; // 自定义文件扩展名\n\n/** 文件接受类型 - 支持多个类型组合 */\nexport type UploadAccept = UploadAcceptType | `${UploadAcceptType},${string}` | string;\n\n/** 上传错误类型 */\nexport type UploadErrorType =\n | 'FILE_TYPE_MISMATCH' // 文件类型不匹配\n | 'FILE_SIZE_EXCEEDED' // 文件大小超限\n | 'FILE_COUNT_EXCEEDED' // 文件数量超限\n | 'NETWORK_ERROR' // 网络错误\n | 'SERVER_ERROR' // 服务器错误\n | 'ABORT_ERROR' // 取消上传\n | 'UNKNOWN_ERROR'; // 未知错误\n\n/** 上传错误接口 */\nexport interface UploadError {\n type: UploadErrorType;\n message: string;\n file?: File;\n originalError?: Error;\n}\n\n/** 文件项接口 */\nexport interface UploadFile {\n id: string;\n file: File;\n status: UploadStatus;\n progress: number;\n response?: string;\n error?: UploadError;\n}\n\n/** 统一的上传配置接口 */\nexport interface UploadConfig {\n // ============ 行为配置 ============\n /** 上传模式:button-按钮 | image-图片 | dragger-拖拽 */\n mode?: UploadMode;\n /** 上传模式:auto-选择后自动上传, manual-手动触发 */\n autoUpload?: boolean;\n /** 是否显示文件列表 */\n showFileList?: boolean;\n /** 是否允许上传目录(使用 webkitdirectory) */\n directory?: boolean;\n\n // ============ 验证配置 ============\n /** 允许的文件类型,支持预定义类型或自定义字符串 */\n accept?: UploadAccept;\n /** 限制文件最大大小(字节) */\n maxSize?: number;\n /** 限制文件最小大小(字节) */\n minSize?: number;\n /** 允许的最大文件数 */\n maxCount?: number;\n\n // ============ 样式配置 ============\n /** 样式变体:default-默认 | dashed-虚线 */\n variant?: UploadVariant;\n /** 尺寸:sm-小 | md-中 | lg-大 */\n size?: UploadSize;\n /** 形状:rounded-圆角 | square-方形 */\n shape?: UploadShape;\n\n // ============ 请求配置 ============\n /** 上传地址 URL */\n action: string;\n /** HTTP 请求方法,默认 post */\n method?: 'get' | 'post' | 'put';\n /** 请求头 */\n headers?: Record<string, string>;\n /** 自定义请求体数据 */\n data?: Record<string, unknown>;\n /** 请求体字段名,默认 \"file\" */\n name?: string;\n\n // ============ 回调 ============\n /** 文件变化回调 */\n onChange?: (files: UploadFile[]) => void;\n /** 上传进度回调 */\n onProgress?: (progress: number, file: File) => void;\n /** 单个文件上传成功回调 */\n onSuccess?: (response: string, file: File) => void;\n /** 单个文件上传失败回调 */\n onError?: (error: UploadError, file: File) => void;\n /** 所有文件上传完成回调 */\n onComplete?: (files: UploadFile[]) => void;\n}\n\n/** 统一配置解析结果 */\nexport interface UseUploadOptions {\n mode: UploadMode;\n autoUpload: boolean;\n accept: string | undefined;\n maxSize: number | undefined;\n minSize: number | undefined;\n maxCount: number | undefined;\n variant: UploadVariant;\n size: UploadSize;\n shape: UploadShape;\n action: string;\n method: 'get' | 'post' | 'put';\n headers: Record<string, string> | undefined;\n data: Record<string, unknown> | undefined;\n name: string;\n}\n\nconst uploadTriggerVariants = cva(\n \"flex cursor-pointer select-none items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-300 focus-visible:ring-offset-2 focus-visible:ring-offset-white\",\n {\n variants: {\n type: {\n button: \"\",\n dragger: \"flex-col border-2 border-dashed text-center\",\n image: \"relative overflow-hidden p-0\",\n },\n variant: {\n default:\n \"border border-default bg-white text-default hover:bg-default-foreground/10\",\n dashed:\n \"border-2 border-dashed border-default bg-white text-default hover:bg-default-foreground/10\",\n },\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n shape: {\n rounded: \"rounded-md\",\n square: \"rounded-none\",\n },\n },\n compoundVariants: [\n { type: \"button\", size: \"sm\", className: \"h-8 px-3 text-xs\" },\n { type: \"button\", size: \"md\", className: \"h-9 px-4 text-sm\" },\n { type: \"button\", size: \"lg\", className: \"h-10 px-6 text-sm\" },\n { type: \"dragger\", size: \"sm\", className: \"min-h-[96px] px-4 py-6 text-xs\" },\n { type: \"dragger\", size: \"md\", className: \"min-h-[120px] px-6 py-8 text-sm\" },\n { type: \"dragger\", size: \"lg\", className: \"min-h-[152px] px-8 py-10 text-sm\" },\n { type: \"image\", size: \"sm\", className: \"h-15 w-15\" },\n { type: \"image\", size: \"md\", className: \"h-23 w-23\" },\n { type: \"image\", size: \"lg\", className: \"h-35 w-35\" },\n { type: \"image\", shape: \"rounded\", className: \"rounded-full\" },\n ],\n defaultVariants: {\n type: \"button\",\n variant: \"default\",\n size: \"md\",\n shape: \"rounded\",\n },\n }\n);\n\n/** 上传触发器变体属性类型 */\ntype UploadVariantProps = VariantProps<typeof uploadTriggerVariants>;\n\n/** 上传触发器配置接口 */\ninterface UploadTriggerConfig {\n inputId: string; // 文件输入框 ID\n variant?: UploadVariantProps[\"variant\"]; // 样式变体\n size?: UploadVariantProps[\"size\"]; // 尺寸\n shape?: UploadVariantProps[\"shape\"]; // 形状\n className?: string; // 额外类名\n status: UploadStatus; // 当前状态\n progress: number; // 进度百分比\n onCancel?: () => void; // 取消回调\n onReset?: () => void; // 重置回调\n}\n\n// 旧的导出(保持向后兼容)\n// 注意:UploadMode, UploadVariant 等类型已在定义时导出,无需重复导出\nexport {\n FileRequestOptions,\n UploadStatus,\n UploadVariantProps,\n uploadTriggerVariants,\n UploadTriggerConfig\n};\n","import { UploadVariantProps,uploadTriggerVariants } from \"../types\";\r\nimport {\r\n type LabelHTMLAttributes,\r\n} from \"react\";\r\nimport { cn } from \"../../../lib/utils\";\r\n\r\n/** 上传触发器 Props */\r\ntype UploadTriggerProps = UploadVariantProps &\r\n Omit<LabelHTMLAttributes<HTMLLabelElement>, \"color\"> & {\r\n inputId: string; // 关联的文件输入框 ID\r\n isDragging?: boolean; // 是否正在拖拽\r\n };\r\n\r\n/**\r\n * 上传触发器基础组件\r\n * 作为文件输入框的 label 包装器,应用变体样式\r\n */\r\nexport default function UploadTrigger({\r\n inputId,\r\n type = \"button\",\r\n variant,\r\n size,\r\n shape,\r\n className,\r\n isDragging,\r\n children,\r\n ...props\r\n}: UploadTriggerProps) {\r\n return (\r\n <label\r\n htmlFor={inputId}\r\n className={cn(\r\n uploadTriggerVariants({ type, variant, size, shape }),\r\n isDragging && \"border-primary-300 text-primary-900\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </label>\r\n );\r\n}\r\n","import { type UploadTriggerConfig } from \"../types\";\nimport UploadTrigger from \"./UploadTrigger\";\nimport { Icon } from \"@iconify/react\";\nimport { cn } from \"../../../lib/utils\";\n\n/**\n * 按钮式上传组件\n * 显示为按钮样式,支持上传中/成功/失败/空闲四种状态\n */\nexport default function ButtonUpload({\n inputId,\n variant,\n size,\n shape,\n className,\n status,\n progress,\n onCancel,\n onReset,\n}: UploadTriggerConfig) {\n const isUploading = status === \"uploading\";\n const widthClass = isUploading ? \"w-[154px]\" : \"w-[130px]\";\n const mergedClassName = cn(\n widthClass,\n \"justify-center transition-[width] duration-200 ease-out\",\n isUploading && \"relative overflow-hidden\",\n className\n );\n const labelContent =\n status === \"uploading\" ? (\n <span className=\"inline-flex items-center gap-1 tabular-nums\">\n <span>上传中</span>\n <span className=\"w-[3ch] text-right\">{progress}</span>%\n </span>\n ) : status === \"success\" ? (\n \"上传完成\"\n ) : status === \"error\" ? (\n \"上传失败\"\n ) : (\n \"点击上传文件\"\n );\n \n const reloadButton = status === \"success\" && onReset ? (\n <button\n type=\"button\"\n aria-label=\"Reset upload\"\n className=\"ml-1 inline-flex items-center\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onReset();\n }}\n >\n <Icon\n icon=\"bx:reset\"\n width=\"18\"\n height=\"18\"\n className=\"cursor-pointer\"\n />\n </button>\n ) : null;\n \n const cancelButton = status === \"uploading\" && onCancel ? (\n <button\n type=\"button\"\n aria-label=\"Cancel upload\"\n className=\"ml-1 inline-flex items-center\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n }}\n >\n <Icon\n icon=\"fluent-emoji-flat:stop-sign\"\n width=\"18\"\n height=\"18\"\n className=\"cursor-pointer\"\n />\n </button>\n ) : null;\n\n // success/error/uploading/idle \n const statusIcon = status === \"success\" ? (\n <Icon icon=\"icon-park:success\" width=\"16\" height=\"16\" />\n ) : status === \"error\" ? (\n <Icon icon=\"material-icon-theme:folder-error\" width=\"16\" height=\"16\" />\n ) : status === \"uploading\" ? (\n <Icon icon=\"line-md:loading-loop\" width=\"16\" height=\"16\" />\n ) : <Icon icon=\"line-md:upload\" width=\"16\" height=\"16\" />;\n\n return (\n <UploadTrigger\n inputId={inputId}\n type=\"button\"\n variant={variant}\n size={size}\n shape={shape}\n className={mergedClassName}\n >\n {isUploading && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 opacity-80 haiku-upload-shine\"\n />\n )}\n <span className=\"relative z-10 inline-flex items-center gap-2\">\n {statusIcon}\n {labelContent}\n {cancelButton}\n {reloadButton}\n </span>\n </UploadTrigger>\n );\n}\n","import { type UploadTriggerConfig } from \"../types\";\r\nimport {\r\n type DragEvent,\r\n} from \"react\";\r\nimport UploadTrigger from \"./UploadTrigger\";\r\n\r\n/** 拖拽式上传组件 Props */\r\ninterface DraggerUploadProps extends UploadTriggerConfig {\r\n isDragging: boolean; // 是否正在拖拽\r\n onDragOver: (event: DragEvent<HTMLLabelElement>) => void; // 拖拽悬停回调\r\n onDragLeave: (event: DragEvent<HTMLLabelElement>) => void; // 拖拽离开回调\r\n onDrop: (event: DragEvent<HTMLLabelElement>) => void; // 拖拽放下回调\r\n}\r\n\r\n/**\r\n * 拖拽式上传组件\r\n * 支持拖拽文件到上传区域,显示拖拽状态和上传进度\r\n */\r\nexport default function DraggerUpload({\r\n inputId,\r\n isDragging,\r\n onDragOver,\r\n onDragLeave,\r\n onDrop,\r\n variant,\r\n size,\r\n shape,\r\n className,\r\n status,\r\n progress,\r\n}: DraggerUploadProps) {\r\n return (\r\n <UploadTrigger\r\n inputId={inputId}\r\n type=\"dragger\"\r\n variant={variant}\r\n size={size}\r\n shape={shape}\r\n className={className}\r\n isDragging={isDragging}\r\n onDragOver={onDragOver}\r\n onDragEnter={onDragOver}\r\n onDragLeave={onDragLeave}\r\n onDrop={onDrop}\r\n >\r\n {status === \"uploading\" ? (\r\n <>\r\n <span className=\"text-sm font-medium inline-flex tabular-nums\">\r\n <span>上传中</span>\r\n <span className=\"w-[4ch] text-right\">{progress}%</span>\r\n </span>\r\n <div className=\"h-1 w-full rounded-full bg-default-foreground/20\">\r\n <div\r\n className=\"h-full rounded-full bg-primary-900\"\r\n style={{ width: `${progress}%` }}\r\n />\r\n </div>\r\n </>\r\n ) : status === \"error\" ? (\r\n <span className=\"text-sm font-medium\">上传失败,点击重试</span>\r\n ) : status === \"success\" ? (\r\n <span className=\"text-sm font-medium\">上传完成</span>\r\n ) : (\r\n <>\r\n <span className=\"text-sm font-medium\">点击或拖拽上传</span>\r\n <span className=\"text-xs text-default opacity-70\">支持多文件</span>\r\n </>\r\n )}\r\n </UploadTrigger>\r\n );\r\n}\r\n","import UploadTrigger from \"./UploadTrigger\";\nimport { type UploadTriggerConfig } from \"../types\";\n\n/** 图片上传组件 Props */\ninterface ImageUploadProps extends UploadTriggerConfig {\n previewUrl?: string | null; // 图片预览 URL\n}\n\n/**\n * 图片上传组件\n * 显示为图片缩略图样式,支持图片预览和上传进度覆盖\n */\nexport default function ImageUpload({\n inputId,\n previewUrl,\n variant,\n size,\n shape,\n className,\n status,\n progress,\n}: ImageUploadProps) {\n const isUploading = status === \"uploading\";\n return (\n <UploadTrigger\n inputId={inputId}\n type=\"image\"\n variant={variant}\n size={size}\n shape={shape}\n className={className}\n >\n {previewUrl ? (\n <img src={previewUrl} alt=\"上传预览\" className=\"h-full w-full object-cover\" />\n ) : (\n <span className=\"text-xs inline-flex font-medium\">上传</span>\n )}\n {isUploading && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-30 opacity-70 haiku-upload-shine\"\n />\n )}\n {isUploading && (\n <span className=\"absolute inset-0 z-20 tabular-nums text-right flex items-center justify-center bg-black/35 text-xs font-medium text-white\">\n {progress}%\n </span>\n )}\n {status === \"error\" && (\n <span className=\"absolute inset-0 z-20 flex items-center justify-center bg-black/60 text-xs font-medium text-white\">\n 上传失败\n </span>\n )}\n </UploadTrigger>\n );\n}\n","/**\r\n * 文件列表组件\r\n * 显示所有已选择/上传的文件及其进度\r\n */\r\nimport { Icon } from \"@iconify/react\";\r\nimport { UploadFile, type UploadStatus } from \"../types\";\r\n\r\n/** 文件列表项组件 Props */\r\ninterface FileItemProps {\r\n /** 文件项数据 */\r\n file: UploadFile;\r\n /** 删除回调 */\r\n onRemove?: (id: string) => void;\r\n /** 取消上传回调 */\r\n onCancel?: (id: string) => void;\r\n}\r\n\r\n/**\r\n * 单个文件项组件\r\n * 显示文件名、进度条、状态图标\r\n */\r\nfunction FileItem({ file, onRemove, onCancel }: FileItemProps) {\r\n const { id, file: fileData, status, progress, error } = file;\r\n\r\n // 状态图标配置\r\n const iconMap = {\r\n idle: { icon: \"lucide:file\", className: \"text-gray-400\" },\r\n uploading: { icon: \"lucide:loader-2\", className: \"text-blue-500 animate-spin\" },\r\n success: { icon: \"lucide:check-circle\", className: \"text-green-500\" },\r\n error: { icon: \"lucide:x-circle\", className: \"text-red-500\" },\r\n };\r\n const iconConfig = iconMap[status] || iconMap.idle;\r\n\r\n // 格式化文件大小\r\n const formatSize = (bytes: number) => {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3 p-3 border rounded-md bg-white dark:bg-zinc-800\">\r\n {/* 文件图标 */}\r\n <Icon icon={iconConfig.icon} className={iconConfig.className} width={20} />\r\n\r\n {/* 文件信息 */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"truncate font-medium text-md\">{fileData.name}</span>\r\n <span className=\"text-xs text-gray-500 ml-2\">\r\n {formatSize(fileData.size)}\r\n </span>\r\n </div>\r\n\r\n {/* 进度条 */}\r\n {(status === \"uploading\" || status === \"success\") && (\r\n <div className=\"mt-1\">\r\n <div className=\"h-1.5 w-full bg-gray-200 rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full bg-blue-500 transition-all duration-300\"\r\n style={{ width: `${progress}%` }}\r\n />\r\n </div>\r\n <span className=\"text-xs text-gray-500\">{progress}%</span>\r\n </div>\r\n )}\r\n\r\n {/* 错误信息 */}\r\n {status === \"error\" && error && (\r\n <div className=\"mt-1 text-xs text-red-500\">{error.message}</div>\r\n )}\r\n </div>\r\n\r\n {/* 操作按钮 */}\r\n <div className=\"flex items-center gap-1\">\r\n {/* 取消按钮 - 上传中显示 */}\r\n {status === \"uploading\" && onCancel && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onCancel(id)}\r\n className=\"p-1 hover:bg-gray-100 rounded\"\r\n title=\"取消\"\r\n >\r\n <Icon icon=\"lucide:x\" className=\"w-4 h-4 text-gray-500\" />\r\n </button>\r\n )}\r\n\r\n {/* 删除按钮 - 非上传中显示 */}\r\n {status !== \"uploading\" && onRemove && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onRemove(id)}\r\n className=\"p-1 hover:bg-gray-100 rounded\"\r\n title=\"删除\"\r\n >\r\n <Icon icon=\"lucide:trash-2\" className=\"w-4 h-4 text-gray-500\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/** 文件列表组件 Props */\r\ninterface FileListProps {\r\n /** 文件列表 */\r\n files: UploadFile[];\r\n /** 删除回调 */\r\n onRemove?: (id: string) => void;\r\n /** 取消上传回调 */\r\n onCancel?: (id: string) => void;\r\n /** 是否显示 */\r\n show?: boolean;\r\n}\r\n\r\n/**\r\n * 文件列表组件\r\n * 渲染所有已选择的文件\r\n */\r\nfunction FileList({ files, onRemove, onCancel, show = true }: FileListProps) {\r\n if (!show || files.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"space-y-2 mt-4\">\r\n {files.map((file) => (\r\n <FileItem\r\n key={file.id}\r\n file={file}\r\n onRemove={onRemove}\r\n onCancel={onCancel}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport { FileList, FileItem };\r\nexport type { FileListProps, FileItemProps };\r\n","/**\r\n * 上传组件 - \r\n *\r\n * 使用统一的 UploadConfig 接口,支持:\r\n * - 三种上传模式:button(按钮)、image(图片)、dragger(拖拽)\r\n * - 文件验证:accept、maxSize、maxCount\r\n * - 手动/自动上传模式\r\n * - 增强的错误处理\r\n *\r\n * @example\r\n * ```tsx\r\n * // 基础用法\r\n * <Upload action=\"/api/upload\" />\r\n *\r\n * // 图片上传\r\n * <Upload mode=\"image\" action=\"/api/upload\" accept=\"image/*\" maxSize={5 * 1024 * 1024} />\r\n *\r\n * // 拖拽上传\r\n * <Upload mode=\"dragger\" action=\"/api/upload\" maxCount={5} />\r\n *\r\n * // 手动上传模式\r\n * <Upload mode=\"button\" action=\"/api/upload\" autoUpload={false} onChange={handleChange} />\r\n * <button onClick={triggerUpload}>上传</button>\r\n * </Upload>\r\n * ```\r\n */\r\nimport {\r\n useEffect,\r\n useId,\r\n useRef,\r\n useState,\r\n useCallback,\r\n type ChangeEvent,\r\n type DragEvent,\r\n} from \"react\";\r\nimport {\r\n type UploadConfig,\r\n type UploadFile,\r\n type UploadStatus,\r\n type UploadError,\r\n type UploadMode,\r\n type UploadVariant,\r\n type UploadSize,\r\n type UploadShape,\r\n type UploadErrorType,\r\n type UploadAccept,\r\n type UploadAcceptType,\r\n UploadTriggerConfig,\r\n} from \"./types\";\r\nimport { uploadFile } from \"./utils\";\r\nimport ButtonUpload from \"./components/ButtonUpload\";\r\nimport DraggerUpload from \"./components/DraggerUpload\";\r\nimport ImageUpload from \"./components/ImageUpload\";\r\nimport { FileList } from \"./components/FileList\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\n// 默认配置\r\nconst DEFAULT_OPTIONS: Partial<UploadConfig> = {\r\n mode: \"button\",\r\n autoUpload: true,\r\n showFileList: true,\r\n variant: \"default\",\r\n size: \"md\",\r\n shape: \"rounded\",\r\n method: \"post\",\r\n name: \"file\",\r\n};\r\n\r\n/** 创建上传错误 */\r\nconst createUploadError = (\r\n type: UploadErrorType,\r\n message: string,\r\n file?: File,\r\n originalError?: Error\r\n): UploadError => ({\r\n type,\r\n message,\r\n file,\r\n originalError,\r\n});\r\n\r\n/**\r\n * 生成唯一文件 ID\r\n */\r\nconst generateFileId = () => Math.random().toString(36).substring(2, 11);\r\n\r\n/**\r\n * 上传组件\r\n */\r\nfunction Upload(config: UploadConfig) {\r\n // 合并配置\r\n const options: Required<UploadConfig> = {\r\n ...DEFAULT_OPTIONS,\r\n ...config,\r\n } as Required<UploadConfig>;\r\n\r\n // 解构配置\r\n const {\r\n mode,\r\n autoUpload,\r\n showFileList,\r\n directory,\r\n accept,\r\n maxSize,\r\n minSize,\r\n maxCount,\r\n variant,\r\n size,\r\n shape,\r\n action,\r\n method,\r\n headers,\r\n data,\r\n name,\r\n onChange,\r\n onProgress,\r\n onSuccess,\r\n onError,\r\n onComplete,\r\n } = options;\r\n\r\n // 文件列表状态\r\n const [files, setFiles] = useState<UploadFile[]>([]);\r\n // 拖拽状态\r\n const [isDragging, setIsDragging] = useState(false);\r\n // 图片预览 URL\r\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\r\n // 全局上传状态\r\n const [status, setStatus] = useState<UploadStatus>(\"idle\");\r\n // 全局进度\r\n const [progress, setProgress] = useState(0);\r\n\r\n // Refs\r\n const inputId = useId();\r\n const abortRef = useRef<AbortController | null>(null);\r\n const cancelRef = useRef(false);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n // 计算当前状态\r\n const isDisabled = status === \"uploading\";\r\n const isUploading = status === \"uploading\";\r\n\r\n // 触发文件变化回调\r\n const notifyChange = useCallback((newFiles: UploadFile[]) => {\r\n onChange?.(newFiles);\r\n }, [onChange]);\r\n\r\n // 验证单个文件\r\n const validateFile = useCallback((file: File): UploadError | null => {\r\n // 文件大小验证\r\n if (maxSize && file.size > maxSize) {\r\n return createUploadError(\r\n \"FILE_SIZE_EXCEEDED\",\r\n `文件大小不能超过 ${Math.round(maxSize / 1024 / 1024)}MB`,\r\n file\r\n );\r\n }\r\n if (minSize && file.size < minSize) {\r\n return createUploadError(\r\n \"FILE_SIZE_EXCEEDED\",\r\n `文件大小不能小于 ${Math.round(minSize / 1024)}KB`,\r\n file\r\n );\r\n }\r\n return null;\r\n }, [maxSize, minSize]);\r\n\r\n // 验证文件列表\r\n const validateFiles = useCallback((newFiles: File[]): { valid: File[]; errors: UploadError[] } => {\r\n const valid: File[] = [];\r\n const errors: UploadError[] = [];\r\n\r\n // 文件数量验证\r\n if (maxCount && newFiles.length > maxCount) {\r\n const error = createUploadError(\r\n \"FILE_COUNT_EXCEEDED\",\r\n `最多只能上传 ${maxCount} 个文件`\r\n );\r\n errors.push(error);\r\n }\r\n\r\n // 逐个验证\r\n for (const file of newFiles) {\r\n const error = validateFile(file);\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n valid.push(file);\r\n }\r\n }\r\n\r\n return { valid, errors };\r\n }, [maxCount, validateFile]);\r\n\r\n // 上传单个文件\r\n const uploadSingleFile = async (\r\n fileItem: UploadFile,\r\n totalBytes: number,\r\n uploadedBytes: number\r\n ): Promise<UploadFile> => {\r\n const { file } = fileItem;\r\n\r\n // 创建 AbortController\r\n const controller = new AbortController();\r\n abortRef.current = controller;\r\n\r\n try {\r\n // 构建 FormData\r\n const formData = new FormData();\r\n formData.append(name, file);\r\n // 添加额外数据\r\n if (data) {\r\n Object.entries(data).forEach(([key, value]) => {\r\n formData.append(key, String(value));\r\n });\r\n }\r\n\r\n const responseText = await uploadFile({\r\n action,\r\n method,\r\n header: headers,\r\n signal: controller.signal,\r\n formData,\r\n onProgress: (event) => {\r\n if (!event.lengthComputable || file.size === 0) {\r\n return;\r\n }\r\n // 计算当前文件的进度\r\n const percent = Math.min(\r\n 100,\r\n Math.round((event.loaded / file.size) * 100)\r\n );\r\n // 更新全局进度(所有文件的累计)\r\n const currentTotalBytes = uploadedBytes + event.loaded;\r\n setProgress(\r\n Math.round((currentTotalBytes / totalBytes) * 100)\r\n );\r\n onProgress?.(percent, file);\r\n\r\n // 更新当前文件的进度\r\n setFiles((prev) =>\r\n prev.map((f) =>\r\n f.id === fileItem.id\r\n ? { ...f, progress: percent }\r\n : f\r\n )\r\n );\r\n },\r\n });\r\n\r\n // 上传成功\r\n const updatedFile: UploadFile = {\r\n ...fileItem,\r\n status: \"success\",\r\n progress: 100,\r\n response: responseText,\r\n };\r\n\r\n onSuccess?.(responseText, file);\r\n return updatedFile;\r\n } catch (event) {\r\n // 判断是否为取消\r\n const isAbort =\r\n cancelRef.current ||\r\n (event as DOMException)?.name === \"AbortError\";\r\n\r\n if (isAbort) {\r\n return { ...fileItem, status: \"idle\", progress: 0 };\r\n }\r\n\r\n // 上传失败\r\n const error = createUploadError(\r\n \"NETWORK_ERROR\",\r\n event instanceof Error ? event.message : \"上传失败\",\r\n file,\r\n event instanceof Error ? event : undefined\r\n );\r\n\r\n onError?.(error, file);\r\n return { ...fileItem, status: \"error\", error };\r\n }\r\n };\r\n\r\n // 上传文件核心逻辑\r\n const uploadFiles = useCallback(async (filesToUpload: UploadFile[]) => {\r\n // 无 action 或无文件,直接返回\r\n if (!action || filesToUpload.length === 0) {\r\n setStatus(\"idle\");\r\n setProgress(0);\r\n return;\r\n }\r\n\r\n // 非自动上传模式,不触发上传\r\n if (!autoUpload) {\r\n return;\r\n }\r\n\r\n cancelRef.current = false;\r\n abortRef.current?.abort();\r\n abortRef.current = null;\r\n\r\n setStatus(\"uploading\");\r\n setProgress(0);\r\n\r\n // 计算总大小\r\n const totalBytes = filesToUpload.reduce((sum, f) => sum + f.file.size, 0);\r\n let uploadedBytes = 0;\r\n\r\n const uploadedFiles: UploadFile[] = [];\r\n\r\n for (const fileItem of filesToUpload) {\r\n // 检查取消\r\n if (cancelRef.current) {\r\n setStatus(\"idle\");\r\n setProgress(0);\r\n return;\r\n }\r\n\r\n // 更新为上传中状态\r\n setFiles((prev) =>\r\n prev.map((f) =>\r\n f.id === fileItem.id ? { ...f, status: \"uploading\" as const } : f\r\n )\r\n );\r\n\r\n const result = await uploadSingleFile(fileItem, totalBytes, uploadedBytes);\r\n uploadedFiles.push(result);\r\n\r\n // 更新文件列表中的状态(只需要更新 status 和 response,progress 已在 onProgress 中更新)\r\n setFiles((prev) =>\r\n prev.map((f) =>\r\n f.id === fileItem.id\r\n ? { ...f, status: result.status, response: result.response }\r\n : f\r\n )\r\n );\r\n\r\n if (result.status === \"success\") {\r\n uploadedBytes += fileItem.file.size;\r\n setProgress(\r\n totalBytes === 0\r\n ? 100\r\n : Math.round((uploadedBytes / totalBytes) * 100)\r\n );\r\n } else if (result.status === \"error\") {\r\n // 如果有错误,停止上传\r\n setStatus(\"error\");\r\n return;\r\n }\r\n }\r\n\r\n // 全部成功\r\n setStatus(\"success\");\r\n setProgress(100);\r\n onComplete?.(uploadedFiles);\r\n }, [action, autoUpload, headers, method, name, data, onComplete, onError, onProgress, onSuccess]);\r\n\r\n // 处理文件选择\r\n const handleFiles = useCallback((fileList: FileList | File[]) => {\r\n const newFiles = Array.from(fileList);\r\n\r\n // 验证\r\n const { valid, errors } = validateFiles(newFiles);\r\n\r\n // 触发错误回调\r\n errors.forEach((error) => {\r\n onError?.(error, error.file!);\r\n });\r\n\r\n if (valid.length === 0) {\r\n return;\r\n }\r\n\r\n // 创建文件项\r\n const fileItems: UploadFile[] = valid.map((file) => ({\r\n id: generateFileId(),\r\n file,\r\n status: \"idle\" as const,\r\n progress: 0,\r\n }));\r\n\r\n // 更新文件列表\r\n setFiles((prev) => {\r\n const newFileList = [...prev, ...fileItems];\r\n notifyChange(newFileList);\r\n return newFileList;\r\n });\r\n\r\n // 触发上传\r\n void uploadFiles(fileItems);\r\n }, [validateFiles, notifyChange, uploadFiles, onError]);\r\n\r\n // 处理输入变化\r\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n if (event.target.files) {\r\n handleFiles(event.target.files);\r\n // 重置 input 以允许重复选择同一文件\r\n event.target.value = \"\";\r\n }\r\n };\r\n\r\n // 处理拖拽悬停\r\n const handleDragOver = (event: DragEvent<HTMLLabelElement>) => {\r\n event.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n // 处理拖拽离开\r\n const handleDragLeave = (event: DragEvent<HTMLLabelElement>) => {\r\n event.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n // 处理拖拽放下\r\n const handleDrop = (event: DragEvent<HTMLLabelElement>) => {\r\n event.preventDefault();\r\n setIsDragging(false);\r\n if (event.dataTransfer.files && event.dataTransfer.files.length > 0) {\r\n handleFiles(event.dataTransfer.files);\r\n event.dataTransfer.clearData();\r\n }\r\n };\r\n\r\n // 处理取消\r\n const handleCancel = useCallback(() => {\r\n if (status !== \"uploading\") {\r\n return;\r\n }\r\n cancelRef.current = true;\r\n abortRef.current?.abort();\r\n abortRef.current = null;\r\n setStatus(\"idle\");\r\n setProgress(0);\r\n setFiles([]);\r\n }, [status]);\r\n\r\n // 处理重置\r\n const handleReset = useCallback(() => {\r\n setFiles([]);\r\n setStatus(\"idle\");\r\n setProgress(0);\r\n setPreviewUrl(null);\r\n if (inputRef.current) {\r\n inputRef.current.value = \"\";\r\n }\r\n notifyChange([]);\r\n }, [notifyChange]);\r\n\r\n // 处理删除文件\r\n const handleRemoveFile = useCallback((id: string) => {\r\n setFiles((prev) => {\r\n const newFiles = prev.filter((f) => f.id !== id);\r\n notifyChange(newFiles);\r\n return newFiles;\r\n });\r\n }, [notifyChange]);\r\n\r\n // 处理取消单个文件上传\r\n const handleCancelFile = useCallback((id: string) => {\r\n // 找到对应的文件并标记为取消\r\n setFiles((prev) =>\r\n prev.map((f) =>\r\n f.id === id ? { ...f, status: \"idle\" as const, progress: 0 } : f\r\n )\r\n );\r\n }, []);\r\n\r\n // 手动触发上传\r\n const triggerUpload = useCallback(() => {\r\n if (files.length > 0 && autoUpload === false) {\r\n const pendingFiles = files.filter((f) => f.status === \"idle\");\r\n if (pendingFiles.length > 0) {\r\n uploadFiles(pendingFiles);\r\n }\r\n }\r\n }, [files, autoUpload, uploadFiles]);\r\n\r\n // 图片预览\r\n useEffect(() => {\r\n if (mode !== \"image\") {\r\n setPreviewUrl(null);\r\n return;\r\n }\r\n\r\n const file = files[0]?.file;\r\n if (!file || !file.type.startsWith(\"image/\")) {\r\n setPreviewUrl(null);\r\n return;\r\n }\r\n\r\n const url = URL.createObjectURL(file);\r\n setPreviewUrl(url);\r\n\r\n return () => {\r\n URL.revokeObjectURL(url);\r\n };\r\n }, [files, mode]);\r\n\r\n // 构建 trigger props\r\n const triggerProps: UploadTriggerConfig = {\r\n inputId,\r\n variant,\r\n size,\r\n shape,\r\n className: cn(isDisabled && \"cursor-not-allowed opacity-80\"),\r\n status,\r\n progress,\r\n onCancel: handleCancel,\r\n onReset: handleReset,\r\n };\r\n\r\n // 渲染\r\n return (\r\n <div>\r\n {mode === \"button\" && <ButtonUpload {...triggerProps} />}\r\n {mode === \"image\" && (\r\n <ImageUpload {...triggerProps} previewUrl={previewUrl} />\r\n )}\r\n {mode === \"dragger\" && (\r\n <DraggerUpload\r\n {...triggerProps}\r\n isDragging={isDragging}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n />\r\n )}\r\n\r\n <input\r\n className=\"opacity-0 absolute\"\r\n disabled={isDisabled}\r\n id={inputId}\r\n ref={inputRef}\r\n type=\"file\"\r\n multiple={maxCount !== 1}\r\n accept={accept}\r\n // @ts-expect-error - webkitdirectory 是非标准但广泛支持的属性\r\n webkitdirectory={directory ? \"\" : undefined}\r\n onChange={handleInputChange}\r\n />\r\n\r\n {/* 文件列表 */}\r\n <FileList\r\n files={files}\r\n show={showFileList}\r\n onRemove={handleRemoveFile}\r\n onCancel={handleCancelFile}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default Upload;\r\nexport type { UploadConfig, UploadFile, UploadError, UploadErrorType, UploadAccept, UploadAcceptType };\r\n"]}
|
package/dist/preset.css
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
@layer theme {
|
|
2
|
+
/*
|
|
3
|
+
Haiku UI design tokens (Tailwind v4).
|
|
4
|
+
*/
|
|
5
|
+
@theme default {
|
|
6
|
+
--color-primary-900: rgb(217 7 10);
|
|
7
|
+
--color-primary-800: rgb(216 88 57);
|
|
8
|
+
--color-primary-700: rgb(219 110 78);
|
|
9
|
+
--color-primary-600: rgb(224 133 102);
|
|
10
|
+
--color-primary-500: rgb(229 154 127);
|
|
11
|
+
--color-primary-400: rgb(223 175 153);
|
|
12
|
+
--color-primary-300: rgb(238 196 179);
|
|
13
|
+
--color-primary-200: rgb(244 216 204);
|
|
14
|
+
--color-primary-100: rgb(248 236 230);
|
|
15
|
+
|
|
16
|
+
--color-default: oklch(0% 0 0);
|
|
17
|
+
--color-default-foreground: oklch(94.912% 0.00011 271.152);
|
|
18
|
+
--color-danger: oklch(0.627 0.201 29.234);
|
|
19
|
+
--color-danger-foreground: oklch(62.827% 0.20104 29.226 / 0.356);
|
|
20
|
+
--color-info: oklch(0.538 0.2 264.583);
|
|
21
|
+
--color-info-foreground: oklch(0.873 0.128 264.583);
|
|
22
|
+
--color-success: oklch(0.628 0.973 142.5);
|
|
23
|
+
--color-success-foreground: oklch(0.873 0.128 142.5);
|
|
24
|
+
--color-warning: oklch(0.75 0.18 90);
|
|
25
|
+
--color-warning-foreground: oklch(0.873 0.128 90);
|
|
26
|
+
|
|
27
|
+
--color-destructive: oklch(0.704 0.191 22.216);
|
|
28
|
+
--color-destructive-foreground: oklch(0.58 0.22 27);
|
|
29
|
+
--color-primary-foreground: oklch(98.5% 0 0);
|
|
30
|
+
|
|
31
|
+
--color-muted: oklch(96% 0 0);
|
|
32
|
+
--color-muted-foreground: oklch(45% 0 0);
|
|
33
|
+
|
|
34
|
+
--radius-md: 0.5rem;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@utility haiku-focus-ring {
|
|
40
|
+
outline: 2px solid color-mix(in oklab, var(--color-primary) 45%, transparent);
|
|
41
|
+
outline-offset: 2px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
Upload子组件的闪光动画
|
|
46
|
+
*/
|
|
47
|
+
@utility haiku-upload-shine {
|
|
48
|
+
background-image:
|
|
49
|
+
linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.12), transparent),
|
|
50
|
+
linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent);
|
|
51
|
+
animation: haiku-upload-shine 1.2s linear infinite;
|
|
52
|
+
will-change: transform;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@layer base {
|
|
56
|
+
@keyframes haiku-bubble-cursor-blink {
|
|
57
|
+
0%,
|
|
58
|
+
100% {
|
|
59
|
+
opacity: 1;
|
|
60
|
+
}
|
|
61
|
+
50% {
|
|
62
|
+
opacity: 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@keyframes haiku-bubble-fade-in {
|
|
67
|
+
0% {
|
|
68
|
+
opacity: 0;
|
|
69
|
+
}
|
|
70
|
+
100% {
|
|
71
|
+
opacity: 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@keyframes haiku-upload-shine {
|
|
76
|
+
0% {
|
|
77
|
+
transform: translateX(-120%);
|
|
78
|
+
}
|
|
79
|
+
100% {
|
|
80
|
+
transform: translateX(120%);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
/* watch-test */
|