haiku-react-ui 1.0.0 → 1.0.1

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.js.map CHANGED
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../../../node_modules/.pnpm/@iconify+react@6.0.2_react@19.2.3/node_modules/@iconify/react/dist/iconify.js","../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/ChunkProgress.tsx","../src/components/Upload/components/FileList.tsx","../src/components/Upload/index.tsx"],"names":["storage","isNumber","simpleNames","send","props","mounted","name","data","cva","jsx","React","jsxs","React3","React4","Fragment","useState","useId","useRef","useCallback","progress","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","'use client';\n\nimport { createElement, forwardRef, useState, useEffect } from 'react';\n\n/**\n* Resolve icon set icons\n*\n* Returns parent icon for each icon\n*/\nfunction getIconsTree(data, names) {\n\tconst icons = data.icons;\n\tconst aliases = data.aliases || Object.create(null);\n\tconst resolved = Object.create(null);\n\tfunction resolve(name) {\n\t\tif (icons[name]) return resolved[name] = [];\n\t\tif (!(name in resolved)) {\n\t\t\tresolved[name] = null;\n\t\t\tconst parent = aliases[name] && aliases[name].parent;\n\t\t\tconst value = parent && resolve(parent);\n\t\t\tif (value) resolved[name] = [parent].concat(value);\n\t\t}\n\t\treturn resolved[name];\n\t}\n\t(Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);\n\treturn resolved;\n}\n\n/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values for transformations\n*/\nconst defaultIconTransformations = Object.freeze({\n\trotate: 0,\n\tvFlip: false,\n\thFlip: false\n});\n/**\n* Default values for all optional IconifyIcon properties\n*/\nconst defaultIconProps = Object.freeze({\n\t...defaultIconDimensions,\n\t...defaultIconTransformations\n});\n/**\n* Default values for all properties used in ExtendedIconifyIcon\n*/\nconst defaultExtendedIconProps = Object.freeze({\n\t...defaultIconProps,\n\tbody: \"\",\n\thidden: false\n});\n\n/**\n* Merge transformations\n*/\nfunction mergeIconTransformations(obj1, obj2) {\n\tconst result = {};\n\tif (!obj1.hFlip !== !obj2.hFlip) result.hFlip = true;\n\tif (!obj1.vFlip !== !obj2.vFlip) result.vFlip = true;\n\tconst rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;\n\tif (rotate) result.rotate = rotate;\n\treturn result;\n}\n\n/**\n* Merge icon and alias\n*\n* Can also be used to merge default values and icon\n*/\nfunction mergeIconData(parent, child) {\n\tconst result = mergeIconTransformations(parent, child);\n\tfor (const key in defaultExtendedIconProps) if (key in defaultIconTransformations) {\n\t\tif (key in parent && !(key in result)) result[key] = defaultIconTransformations[key];\n\t} else if (key in child) result[key] = child[key];\n\telse if (key in parent) result[key] = parent[key];\n\treturn result;\n}\n\n/**\n* Get icon data, using prepared aliases tree\n*/\nfunction internalGetIconData(data, name, tree) {\n\tconst icons = data.icons;\n\tconst aliases = data.aliases || Object.create(null);\n\tlet currentProps = {};\n\tfunction parse(name$1) {\n\t\tcurrentProps = mergeIconData(icons[name$1] || aliases[name$1], currentProps);\n\t}\n\tparse(name);\n\ttree.forEach(parse);\n\treturn mergeIconData(data, currentProps);\n}\n\n/**\n* Extract icons from an icon set\n*\n* Returns list of icons that were found in icon set\n*/\nfunction parseIconSet(data, callback) {\n\tconst names = [];\n\tif (typeof data !== \"object\" || typeof data.icons !== \"object\") return names;\n\tif (data.not_found instanceof Array) data.not_found.forEach((name) => {\n\t\tcallback(name, null);\n\t\tnames.push(name);\n\t});\n\tconst tree = getIconsTree(data);\n\tfor (const name in tree) {\n\t\tconst item = tree[name];\n\t\tif (item) {\n\t\t\tcallback(name, internalGetIconData(data, name, item));\n\t\t\tnames.push(name);\n\t\t}\n\t}\n\treturn names;\n}\n\n/**\n* Optional properties\n*/\nconst optionalPropertyDefaults = {\n\tprovider: \"\",\n\taliases: {},\n\tnot_found: {},\n\t...defaultIconDimensions\n};\n/**\n* Check props\n*/\nfunction checkOptionalProps(item, defaults) {\n\tfor (const prop in defaults) if (prop in item && typeof item[prop] !== typeof defaults[prop]) return false;\n\treturn true;\n}\n/**\n* Validate icon set, return it as IconifyJSON on success, null on failure\n*\n* Unlike validateIconSet(), this function is very basic.\n* It does not throw exceptions, it does not check metadata, it does not fix stuff.\n*/\nfunction quicklyValidateIconSet(obj) {\n\tif (typeof obj !== \"object\" || obj === null) return null;\n\tconst data = obj;\n\tif (typeof data.prefix !== \"string\" || !obj.icons || typeof obj.icons !== \"object\") return null;\n\tif (!checkOptionalProps(obj, optionalPropertyDefaults)) return null;\n\tconst icons = data.icons;\n\tfor (const name in icons) {\n\t\tconst icon = icons[name];\n\t\tif (!name || typeof icon.body !== \"string\" || !checkOptionalProps(icon, defaultExtendedIconProps)) return null;\n\t}\n\tconst aliases = data.aliases || Object.create(null);\n\tfor (const name in aliases) {\n\t\tconst icon = aliases[name];\n\t\tconst parent = icon.parent;\n\t\tif (!name || typeof parent !== \"string\" || !icons[parent] && !aliases[parent] || !checkOptionalProps(icon, defaultExtendedIconProps)) return null;\n\t}\n\treturn data;\n}\n\n/**\n* Storage by provider and prefix\n*/\nconst dataStorage = Object.create(null);\n/**\n* Create new storage\n*/\nfunction newStorage(provider, prefix) {\n\treturn {\n\t\tprovider,\n\t\tprefix,\n\t\ticons: Object.create(null),\n\t\tmissing: /* @__PURE__ */ new Set()\n\t};\n}\n/**\n* Get storage for provider and prefix\n*/\nfunction getStorage(provider, prefix) {\n\tconst providerStorage = dataStorage[provider] || (dataStorage[provider] = Object.create(null));\n\treturn providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));\n}\n/**\n* Add icon set to storage\n*\n* Returns array of added icons\n*/\nfunction addIconSet(storage, data) {\n\tif (!quicklyValidateIconSet(data)) return [];\n\treturn parseIconSet(data, (name, icon) => {\n\t\tif (icon) storage.icons[name] = icon;\n\t\telse storage.missing.add(name);\n\t});\n}\n/**\n* Add icon to storage\n*/\nfunction addIconToStorage(storage, name, icon) {\n\ttry {\n\t\tif (typeof icon.body === \"string\") {\n\t\t\tstorage.icons[name] = { ...icon };\n\t\t\treturn true;\n\t\t}\n\t} catch (err) {}\n\treturn false;\n}\n/**\n* List available icons\n*/\nfunction listIcons(provider, prefix) {\n\tlet allIcons = [];\n\tconst providers = typeof provider === \"string\" ? [provider] : Object.keys(dataStorage);\n\tproviders.forEach((provider$1) => {\n\t\tconst prefixes = typeof provider$1 === \"string\" && typeof prefix === \"string\" ? [prefix] : Object.keys(dataStorage[provider$1] || {});\n\t\tprefixes.forEach((prefix$1) => {\n\t\t\tconst storage = getStorage(provider$1, prefix$1);\n\t\t\tallIcons = allIcons.concat(Object.keys(storage.icons).map((name) => (provider$1 !== \"\" ? \"@\" + provider$1 + \":\" : \"\") + prefix$1 + \":\" + name));\n\t\t});\n\t});\n\treturn allIcons;\n}\n\n/**\n* Expression to test part of icon name.\n*\n* Used when loading icons from Iconify API due to project naming convension.\n* Ignored when using custom icon sets - convension does not apply.\n*/\nconst matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n/**\n* Convert string icon name to IconifyIconName object.\n*/\nconst stringToIcon = (value, validate, allowSimpleName, provider = \"\") => {\n\tconst colonSeparated = value.split(\":\");\n\tif (value.slice(0, 1) === \"@\") {\n\t\tif (colonSeparated.length < 2 || colonSeparated.length > 3) return null;\n\t\tprovider = colonSeparated.shift().slice(1);\n\t}\n\tif (colonSeparated.length > 3 || !colonSeparated.length) return null;\n\tif (colonSeparated.length > 1) {\n\t\tconst name$1 = colonSeparated.pop();\n\t\tconst prefix = colonSeparated.pop();\n\t\tconst result = {\n\t\t\tprovider: colonSeparated.length > 0 ? colonSeparated[0] : provider,\n\t\t\tprefix,\n\t\t\tname: name$1\n\t\t};\n\t\treturn validate && !validateIconName(result) ? null : result;\n\t}\n\tconst name = colonSeparated[0];\n\tconst dashSeparated = name.split(\"-\");\n\tif (dashSeparated.length > 1) {\n\t\tconst result = {\n\t\t\tprovider,\n\t\t\tprefix: dashSeparated.shift(),\n\t\t\tname: dashSeparated.join(\"-\")\n\t\t};\n\t\treturn validate && !validateIconName(result) ? null : result;\n\t}\n\tif (allowSimpleName && provider === \"\") {\n\t\tconst result = {\n\t\t\tprovider,\n\t\t\tprefix: \"\",\n\t\t\tname\n\t\t};\n\t\treturn validate && !validateIconName(result, allowSimpleName) ? null : result;\n\t}\n\treturn null;\n};\n/**\n* Check if icon is valid.\n*\n* This function is not part of stringToIcon because validation is not needed for most code.\n*/\nconst validateIconName = (icon, allowSimpleName) => {\n\tif (!icon) return false;\n\treturn !!((allowSimpleName && icon.prefix === \"\" || !!icon.prefix) && !!icon.name);\n};\n\n/**\n* Allow storing icons without provider or prefix, making it possible to store icons like \"home\"\n*/\nlet simpleNames = false;\nfunction allowSimpleNames(allow) {\n\tif (typeof allow === \"boolean\") simpleNames = allow;\n\treturn simpleNames;\n}\n/**\n* Get icon data\n*\n* Returns:\n* - IconifyIcon on success, object directly from storage so don't modify it\n* - null if icon is marked as missing (returned in `not_found` property from API, so don't bother sending API requests)\n* - undefined if icon is missing in storage\n*/\nfunction getIconData(name) {\n\tconst icon = typeof name === \"string\" ? stringToIcon(name, true, simpleNames) : name;\n\tif (icon) {\n\t\tconst storage = getStorage(icon.provider, icon.prefix);\n\t\tconst iconName = icon.name;\n\t\treturn storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);\n\t}\n}\n/**\n* Add one icon\n*/\nfunction addIcon(name, data) {\n\tconst icon = stringToIcon(name, true, simpleNames);\n\tif (!icon) return false;\n\tconst storage = getStorage(icon.provider, icon.prefix);\n\tif (data) return addIconToStorage(storage, icon.name, data);\n\telse {\n\t\tstorage.missing.add(icon.name);\n\t\treturn true;\n\t}\n}\n/**\n* Add icon set\n*/\nfunction addCollection(data, provider) {\n\tif (typeof data !== \"object\") return false;\n\tif (typeof provider !== \"string\") provider = data.provider || \"\";\n\tif (simpleNames && !provider && !data.prefix) {\n\t\tlet added = false;\n\t\tif (quicklyValidateIconSet(data)) {\n\t\t\tdata.prefix = \"\";\n\t\t\tparseIconSet(data, (name, icon) => {\n\t\t\t\tif (addIcon(name, icon)) added = true;\n\t\t\t});\n\t\t}\n\t\treturn added;\n\t}\n\tconst prefix = data.prefix;\n\tif (!validateIconName({\n\t\tprefix,\n\t\tname: \"a\"\n\t})) return false;\n\tconst storage = getStorage(provider, prefix);\n\treturn !!addIconSet(storage, data);\n}\n/**\n* Check if icon data is available\n*/\nfunction iconLoaded(name) {\n\treturn !!getIconData(name);\n}\n/**\n* Get full icon\n*/\nfunction getIcon(name) {\n\tconst result = getIconData(name);\n\treturn result ? {\n\t\t...defaultIconProps,\n\t\t...result\n\t} : result;\n}\n\n/**\n* Default icon customisations values\n*/\nconst defaultIconSizeCustomisations = Object.freeze({\n\twidth: null,\n\theight: null\n});\nconst defaultIconCustomisations = Object.freeze({\n\t...defaultIconSizeCustomisations,\n\t...defaultIconTransformations\n});\n\n/**\n* Regular expressions for calculating dimensions\n*/\nconst unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;\nconst unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;\nfunction calculateSize(size, ratio, precision) {\n\tif (ratio === 1) return size;\n\tprecision = precision || 100;\n\tif (typeof size === \"number\") return Math.ceil(size * ratio * precision) / precision;\n\tif (typeof size !== \"string\") return size;\n\tconst oldParts = size.split(unitsSplit);\n\tif (oldParts === null || !oldParts.length) return size;\n\tconst newParts = [];\n\tlet code = oldParts.shift();\n\tlet isNumber = unitsTest.test(code);\n\twhile (true) {\n\t\tif (isNumber) {\n\t\t\tconst num = parseFloat(code);\n\t\t\tif (isNaN(num)) newParts.push(code);\n\t\t\telse newParts.push(Math.ceil(num * ratio * precision) / precision);\n\t\t} else newParts.push(code);\n\t\tcode = oldParts.shift();\n\t\tif (code === void 0) return newParts.join(\"\");\n\t\tisNumber = !isNumber;\n\t}\n}\n\nfunction splitSVGDefs(content, tag = \"defs\") {\n\tlet defs = \"\";\n\tconst index = content.indexOf(\"<\" + tag);\n\twhile (index >= 0) {\n\t\tconst start = content.indexOf(\">\", index);\n\t\tconst end = content.indexOf(\"</\" + tag);\n\t\tif (start === -1 || end === -1) break;\n\t\tconst endEnd = content.indexOf(\">\", end);\n\t\tif (endEnd === -1) break;\n\t\tdefs += content.slice(start + 1, end).trim();\n\t\tcontent = content.slice(0, index).trim() + content.slice(endEnd + 1);\n\t}\n\treturn {\n\t\tdefs,\n\t\tcontent\n\t};\n}\n/**\n* Merge defs and content\n*/\nfunction mergeDefsAndContent(defs, content) {\n\treturn defs ? \"<defs>\" + defs + \"</defs>\" + content : content;\n}\n/**\n* Wrap SVG content, without wrapping definitions\n*/\nfunction wrapSVGContent(body, start, end) {\n\tconst split = splitSVGDefs(body);\n\treturn mergeDefsAndContent(split.defs, start + split.content + end);\n}\n\n/**\n* Check if value should be unset. Allows multiple keywords\n*/\nconst isUnsetKeyword = (value) => value === \"unset\" || value === \"undefined\" || value === \"none\";\n/**\n* Get SVG attributes and content from icon + customisations\n*\n* Does not generate style to make it compatible with frameworks that use objects for style, such as React.\n* Instead, it generates 'inline' value. If true, rendering engine should add verticalAlign: -0.125em to icon.\n*\n* Customisations should be normalised by platform specific parser.\n* Result should be converted to <svg> by platform specific parser.\n* Use replaceIDs to generate unique IDs for body.\n*/\nfunction iconToSVG(icon, customisations) {\n\tconst fullIcon = {\n\t\t...defaultIconProps,\n\t\t...icon\n\t};\n\tconst fullCustomisations = {\n\t\t...defaultIconCustomisations,\n\t\t...customisations\n\t};\n\tconst box = {\n\t\tleft: fullIcon.left,\n\t\ttop: fullIcon.top,\n\t\twidth: fullIcon.width,\n\t\theight: fullIcon.height\n\t};\n\tlet body = fullIcon.body;\n\t[fullIcon, fullCustomisations].forEach((props) => {\n\t\tconst transformations = [];\n\t\tconst hFlip = props.hFlip;\n\t\tconst vFlip = props.vFlip;\n\t\tlet rotation = props.rotate;\n\t\tif (hFlip) if (vFlip) rotation += 2;\n\t\telse {\n\t\t\ttransformations.push(\"translate(\" + (box.width + box.left).toString() + \" \" + (0 - box.top).toString() + \")\");\n\t\t\ttransformations.push(\"scale(-1 1)\");\n\t\t\tbox.top = box.left = 0;\n\t\t}\n\t\telse if (vFlip) {\n\t\t\ttransformations.push(\"translate(\" + (0 - box.left).toString() + \" \" + (box.height + box.top).toString() + \")\");\n\t\t\ttransformations.push(\"scale(1 -1)\");\n\t\t\tbox.top = box.left = 0;\n\t\t}\n\t\tlet tempValue;\n\t\tif (rotation < 0) rotation -= Math.floor(rotation / 4) * 4;\n\t\trotation = rotation % 4;\n\t\tswitch (rotation) {\n\t\t\tcase 1:\n\t\t\t\ttempValue = box.height / 2 + box.top;\n\t\t\t\ttransformations.unshift(\"rotate(90 \" + tempValue.toString() + \" \" + tempValue.toString() + \")\");\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\ttransformations.unshift(\"rotate(180 \" + (box.width / 2 + box.left).toString() + \" \" + (box.height / 2 + box.top).toString() + \")\");\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\ttempValue = box.width / 2 + box.left;\n\t\t\t\ttransformations.unshift(\"rotate(-90 \" + tempValue.toString() + \" \" + tempValue.toString() + \")\");\n\t\t\t\tbreak;\n\t\t}\n\t\tif (rotation % 2 === 1) {\n\t\t\tif (box.left !== box.top) {\n\t\t\t\ttempValue = box.left;\n\t\t\t\tbox.left = box.top;\n\t\t\t\tbox.top = tempValue;\n\t\t\t}\n\t\t\tif (box.width !== box.height) {\n\t\t\t\ttempValue = box.width;\n\t\t\t\tbox.width = box.height;\n\t\t\t\tbox.height = tempValue;\n\t\t\t}\n\t\t}\n\t\tif (transformations.length) body = wrapSVGContent(body, \"<g transform=\\\"\" + transformations.join(\" \") + \"\\\">\", \"</g>\");\n\t});\n\tconst customisationsWidth = fullCustomisations.width;\n\tconst customisationsHeight = fullCustomisations.height;\n\tconst boxWidth = box.width;\n\tconst boxHeight = box.height;\n\tlet width;\n\tlet height;\n\tif (customisationsWidth === null) {\n\t\theight = customisationsHeight === null ? \"1em\" : customisationsHeight === \"auto\" ? boxHeight : customisationsHeight;\n\t\twidth = calculateSize(height, boxWidth / boxHeight);\n\t} else {\n\t\twidth = customisationsWidth === \"auto\" ? boxWidth : customisationsWidth;\n\t\theight = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === \"auto\" ? boxHeight : customisationsHeight;\n\t}\n\tconst attributes = {};\n\tconst setAttr = (prop, value) => {\n\t\tif (!isUnsetKeyword(value)) attributes[prop] = value.toString();\n\t};\n\tsetAttr(\"width\", width);\n\tsetAttr(\"height\", height);\n\tconst viewBox = [\n\t\tbox.left,\n\t\tbox.top,\n\t\tboxWidth,\n\t\tboxHeight\n\t];\n\tattributes.viewBox = viewBox.join(\" \");\n\treturn {\n\t\tattributes,\n\t\tviewBox,\n\t\tbody\n\t};\n}\n\n/**\n* IDs usage:\n*\n* id=\"{id}\"\n* xlink:href=\"#{id}\"\n* url(#{id})\n*\n* From SVG animations:\n*\n* begin=\"0;{id}.end\"\n* begin=\"{id}.end\"\n* begin=\"{id}.click\"\n*/\n/**\n* Regular expression for finding ids\n*/\nconst regex = /\\sid=\"(\\S+)\"/g;\n/**\n* New random-ish prefix for ids\n*\n* Do not use dash, it cannot be used in SVG 2 animations\n*/\nconst randomPrefix = \"IconifyId\" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);\n/**\n* Counter for ids, increasing with every replacement\n*/\nlet counter = 0;\n/**\n* Replace IDs in SVG output with unique IDs\n*/\nfunction replaceIDs(body, prefix = randomPrefix) {\n\tconst ids = [];\n\tlet match;\n\twhile (match = regex.exec(body)) ids.push(match[1]);\n\tif (!ids.length) return body;\n\tconst suffix = \"suffix\" + (Math.random() * 16777216 | Date.now()).toString(16);\n\tids.forEach((id) => {\n\t\tconst newID = typeof prefix === \"function\" ? prefix(id) : prefix + (counter++).toString();\n\t\tconst escapedID = id.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\tbody = body.replace(new RegExp(\"([#;\\\"])(\" + escapedID + \")([\\\")]|\\\\.[a-z])\", \"g\"), \"$1\" + newID + suffix + \"$3\");\n\t});\n\tbody = body.replace(new RegExp(suffix, \"g\"), \"\");\n\treturn body;\n}\n\n/**\n* Local storate types and entries\n*/\nconst storage = Object.create(null);\n/**\n* Set API module\n*/\nfunction setAPIModule(provider, item) {\n\tstorage[provider] = item;\n}\n/**\n* Get API module\n*/\nfunction getAPIModule(provider) {\n\treturn storage[provider] || storage[\"\"];\n}\n\n/**\n* Create full API configuration from partial data\n*/\nfunction createAPIConfig(source) {\n\tlet resources;\n\tif (typeof source.resources === \"string\") resources = [source.resources];\n\telse {\n\t\tresources = source.resources;\n\t\tif (!(resources instanceof Array) || !resources.length) return null;\n\t}\n\tconst result = {\n\t\tresources,\n\t\tpath: source.path || \"/\",\n\t\tmaxURL: source.maxURL || 500,\n\t\trotate: source.rotate || 750,\n\t\ttimeout: source.timeout || 5e3,\n\t\trandom: source.random === true,\n\t\tindex: source.index || 0,\n\t\tdataAfterTimeout: source.dataAfterTimeout !== false\n\t};\n\treturn result;\n}\n/**\n* Local storage\n*/\nconst configStorage = Object.create(null);\n/**\n* Redundancy for API servers.\n*\n* API should have very high uptime because of implemented redundancy at server level, but\n* sometimes bad things happen. On internet 100% uptime is not possible.\n*\n* There could be routing problems. Server might go down for whatever reason, but it takes\n* few minutes to detect that downtime, so during those few minutes API might not be accessible.\n*\n* This script has some redundancy to mitigate possible network issues.\n*\n* If one host cannot be reached in 'rotate' (750 by default) ms, script will try to retrieve\n* data from different host. Hosts have different configurations, pointing to different\n* API servers hosted at different providers.\n*/\nconst fallBackAPISources = [\"https://api.simplesvg.com\", \"https://api.unisvg.com\"];\nconst fallBackAPI = [];\nwhile (fallBackAPISources.length > 0) if (fallBackAPISources.length === 1) fallBackAPI.push(fallBackAPISources.shift());\nelse if (Math.random() > .5) fallBackAPI.push(fallBackAPISources.shift());\nelse fallBackAPI.push(fallBackAPISources.pop());\nconfigStorage[\"\"] = createAPIConfig({ resources: [\"https://api.iconify.design\"].concat(fallBackAPI) });\n/**\n* Add custom config for provider\n*/\nfunction addAPIProvider(provider, customConfig) {\n\tconst config = createAPIConfig(customConfig);\n\tif (config === null) return false;\n\tconfigStorage[provider] = config;\n\treturn true;\n}\n/**\n* Get API configuration\n*/\nfunction getAPIConfig(provider) {\n\treturn configStorage[provider];\n}\n/**\n* List API providers\n*/\nfunction listAPIProviders() {\n\treturn Object.keys(configStorage);\n}\n\nconst detectFetch = () => {\n\tlet callback;\n\ttry {\n\t\tcallback = fetch;\n\t\tif (typeof callback === \"function\") return callback;\n\t} catch (err) {}\n};\n/**\n* Fetch function\n*/\nlet fetchModule = detectFetch();\n/**\n* Set custom fetch() function\n*/\nfunction setFetch(fetch$1) {\n\tfetchModule = fetch$1;\n}\n/**\n* Get fetch() function. Used by Icon Finder Core\n*/\nfunction getFetch() {\n\treturn fetchModule;\n}\n/**\n* Calculate maximum icons list length for prefix\n*/\nfunction calculateMaxLength(provider, prefix) {\n\tconst config = getAPIConfig(provider);\n\tif (!config) return 0;\n\tlet result;\n\tif (!config.maxURL) result = 0;\n\telse {\n\t\tlet maxHostLength = 0;\n\t\tconfig.resources.forEach((item) => {\n\t\t\tconst host = item;\n\t\t\tmaxHostLength = Math.max(maxHostLength, host.length);\n\t\t});\n\t\tconst url = prefix + \".json?icons=\";\n\t\tresult = config.maxURL - maxHostLength - config.path.length - url.length;\n\t}\n\treturn result;\n}\n/**\n* Should query be aborted, based on last HTTP status\n*/\nfunction shouldAbort(status) {\n\treturn status === 404;\n}\n/**\n* Prepare params\n*/\nconst prepare = (provider, prefix, icons) => {\n\tconst results = [];\n\tconst maxLength = calculateMaxLength(provider, prefix);\n\tconst type = \"icons\";\n\tlet item = {\n\t\ttype,\n\t\tprovider,\n\t\tprefix,\n\t\ticons: []\n\t};\n\tlet length = 0;\n\ticons.forEach((name, index) => {\n\t\tlength += name.length + 1;\n\t\tif (length >= maxLength && index > 0) {\n\t\t\tresults.push(item);\n\t\t\titem = {\n\t\t\t\ttype,\n\t\t\t\tprovider,\n\t\t\t\tprefix,\n\t\t\t\ticons: []\n\t\t\t};\n\t\t\tlength = name.length;\n\t\t}\n\t\titem.icons.push(name);\n\t});\n\tresults.push(item);\n\treturn results;\n};\n/**\n* Get path\n*/\nfunction getPath(provider) {\n\tif (typeof provider === \"string\") {\n\t\tconst config = getAPIConfig(provider);\n\t\tif (config) return config.path;\n\t}\n\treturn \"/\";\n}\n/**\n* Load icons\n*/\nconst send = (host, params, callback) => {\n\tif (!fetchModule) {\n\t\tcallback(\"abort\", 424);\n\t\treturn;\n\t}\n\tlet path = getPath(params.provider);\n\tswitch (params.type) {\n\t\tcase \"icons\": {\n\t\t\tconst prefix = params.prefix;\n\t\t\tconst icons = params.icons;\n\t\t\tconst iconsList = icons.join(\",\");\n\t\t\tconst urlParams = new URLSearchParams({ icons: iconsList });\n\t\t\tpath += prefix + \".json?\" + urlParams.toString();\n\t\t\tbreak;\n\t\t}\n\t\tcase \"custom\": {\n\t\t\tconst uri = params.uri;\n\t\t\tpath += uri.slice(0, 1) === \"/\" ? uri.slice(1) : uri;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tcallback(\"abort\", 400);\n\t\t\treturn;\n\t}\n\tlet defaultError = 503;\n\tfetchModule(host + path).then((response) => {\n\t\tconst status = response.status;\n\t\tif (status !== 200) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tcallback(shouldAbort(status) ? \"abort\" : \"next\", status);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tdefaultError = 501;\n\t\treturn response.json();\n\t}).then((data) => {\n\t\tif (typeof data !== \"object\" || data === null) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (data === 404) callback(\"abort\", data);\n\t\t\t\telse callback(\"next\", defaultError);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsetTimeout(() => {\n\t\t\tcallback(\"success\", data);\n\t\t});\n\t}).catch(() => {\n\t\tcallback(\"next\", defaultError);\n\t});\n};\n/**\n* Export module\n*/\nconst fetchAPIModule = {\n\tprepare,\n\tsend\n};\n\n/**\n* Remove callback\n*/\nfunction removeCallback(storages, id) {\n\tstorages.forEach((storage) => {\n\t\tconst items = storage.loaderCallbacks;\n\t\tif (items) storage.loaderCallbacks = items.filter((row) => row.id !== id);\n\t});\n}\n/**\n* Update all callbacks for provider and prefix\n*/\nfunction updateCallbacks(storage) {\n\tif (!storage.pendingCallbacksFlag) {\n\t\tstorage.pendingCallbacksFlag = true;\n\t\tsetTimeout(() => {\n\t\t\tstorage.pendingCallbacksFlag = false;\n\t\t\tconst items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];\n\t\t\tif (!items.length) return;\n\t\t\tlet hasPending = false;\n\t\t\tconst provider = storage.provider;\n\t\t\tconst prefix = storage.prefix;\n\t\t\titems.forEach((item) => {\n\t\t\t\tconst icons = item.icons;\n\t\t\t\tconst oldLength = icons.pending.length;\n\t\t\t\ticons.pending = icons.pending.filter((icon) => {\n\t\t\t\t\tif (icon.prefix !== prefix) return true;\n\t\t\t\t\tconst name = icon.name;\n\t\t\t\t\tif (storage.icons[name]) icons.loaded.push({\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\tprefix,\n\t\t\t\t\t\tname\n\t\t\t\t\t});\n\t\t\t\t\telse if (storage.missing.has(name)) icons.missing.push({\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\tprefix,\n\t\t\t\t\t\tname\n\t\t\t\t\t});\n\t\t\t\t\telse {\n\t\t\t\t\t\thasPending = true;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\tif (icons.pending.length !== oldLength) {\n\t\t\t\t\tif (!hasPending) removeCallback([storage], item.id);\n\t\t\t\t\titem.callback(icons.loaded.slice(0), icons.missing.slice(0), icons.pending.slice(0), item.abort);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n/**\n* Unique id counter for callbacks\n*/\nlet idCounter = 0;\n/**\n* Add callback\n*/\nfunction storeCallback(callback, icons, pendingSources) {\n\tconst id = idCounter++;\n\tconst abort = removeCallback.bind(null, pendingSources, id);\n\tif (!icons.pending.length) return abort;\n\tconst item = {\n\t\tid,\n\t\ticons,\n\t\tcallback,\n\t\tabort\n\t};\n\tpendingSources.forEach((storage) => {\n\t\t(storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);\n\t});\n\treturn abort;\n}\n\n/**\n* Check if icons have been loaded\n*/\nfunction sortIcons(icons) {\n\tconst result = {\n\t\tloaded: [],\n\t\tmissing: [],\n\t\tpending: []\n\t};\n\tconst storage = Object.create(null);\n\ticons.sort((a, b) => {\n\t\tif (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n\t\tif (a.prefix !== b.prefix) return a.prefix.localeCompare(b.prefix);\n\t\treturn a.name.localeCompare(b.name);\n\t});\n\tlet lastIcon = {\n\t\tprovider: \"\",\n\t\tprefix: \"\",\n\t\tname: \"\"\n\t};\n\ticons.forEach((icon) => {\n\t\tif (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) return;\n\t\tlastIcon = icon;\n\t\tconst provider = icon.provider;\n\t\tconst prefix = icon.prefix;\n\t\tconst name = icon.name;\n\t\tconst providerStorage = storage[provider] || (storage[provider] = Object.create(null));\n\t\tconst localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));\n\t\tlet list;\n\t\tif (name in localStorage.icons) list = result.loaded;\n\t\telse if (prefix === \"\" || localStorage.missing.has(name)) list = result.missing;\n\t\telse list = result.pending;\n\t\tconst item = {\n\t\t\tprovider,\n\t\t\tprefix,\n\t\t\tname\n\t\t};\n\t\tlist.push(item);\n\t});\n\treturn result;\n}\n\n/**\n* Convert icons list from string/icon mix to icons and validate them\n*/\nfunction listToIcons(list, validate = true, simpleNames = false) {\n\tconst result = [];\n\tlist.forEach((item) => {\n\t\tconst icon = typeof item === \"string\" ? stringToIcon(item, validate, simpleNames) : item;\n\t\tif (icon) result.push(icon);\n\t});\n\treturn result;\n}\n\n/**\n* Default RedundancyConfig for API calls\n*/\nconst defaultConfig = {\n\tresources: [],\n\tindex: 0,\n\ttimeout: 2e3,\n\trotate: 750,\n\trandom: false,\n\tdataAfterTimeout: false\n};\n\n/**\n* Send query\n*/\nfunction sendQuery(config, payload, query, done) {\n\tconst resourcesCount = config.resources.length;\n\tconst startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;\n\tlet resources;\n\tif (config.random) {\n\t\tlet list = config.resources.slice(0);\n\t\tresources = [];\n\t\twhile (list.length > 1) {\n\t\t\tconst nextIndex = Math.floor(Math.random() * list.length);\n\t\t\tresources.push(list[nextIndex]);\n\t\t\tlist = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));\n\t\t}\n\t\tresources = resources.concat(list);\n\t} else resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));\n\tconst startTime = Date.now();\n\tlet status = \"pending\";\n\tlet queriesSent = 0;\n\tlet lastError;\n\tlet timer = null;\n\tlet queue = [];\n\tlet doneCallbacks = [];\n\tif (typeof done === \"function\") doneCallbacks.push(done);\n\t/**\n\t* Reset timer\n\t*/\n\tfunction resetTimer() {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = null;\n\t\t}\n\t}\n\t/**\n\t* Abort everything\n\t*/\n\tfunction abort() {\n\t\tif (status === \"pending\") status = \"aborted\";\n\t\tresetTimer();\n\t\tqueue.forEach((item) => {\n\t\t\tif (item.status === \"pending\") item.status = \"aborted\";\n\t\t});\n\t\tqueue = [];\n\t}\n\t/**\n\t* Add / replace callback to call when execution is complete.\n\t* This can be used to abort pending query implementations when query is complete or aborted.\n\t*/\n\tfunction subscribe(callback, overwrite) {\n\t\tif (overwrite) doneCallbacks = [];\n\t\tif (typeof callback === \"function\") doneCallbacks.push(callback);\n\t}\n\t/**\n\t* Get query status\n\t*/\n\tfunction getQueryStatus() {\n\t\treturn {\n\t\t\tstartTime,\n\t\t\tpayload,\n\t\t\tstatus,\n\t\t\tqueriesSent,\n\t\t\tqueriesPending: queue.length,\n\t\t\tsubscribe,\n\t\t\tabort\n\t\t};\n\t}\n\t/**\n\t* Fail query\n\t*/\n\tfunction failQuery() {\n\t\tstatus = \"failed\";\n\t\tdoneCallbacks.forEach((callback) => {\n\t\t\tcallback(void 0, lastError);\n\t\t});\n\t}\n\t/**\n\t* Clear queue\n\t*/\n\tfunction clearQueue() {\n\t\tqueue.forEach((item) => {\n\t\t\tif (item.status === \"pending\") item.status = \"aborted\";\n\t\t});\n\t\tqueue = [];\n\t}\n\t/**\n\t* Got response from module\n\t*/\n\tfunction moduleResponse(item, response, data) {\n\t\tconst isError = response !== \"success\";\n\t\tqueue = queue.filter((queued) => queued !== item);\n\t\tswitch (status) {\n\t\t\tcase \"pending\": break;\n\t\t\tcase \"failed\":\n\t\t\t\tif (isError || !config.dataAfterTimeout) return;\n\t\t\t\tbreak;\n\t\t\tdefault: return;\n\t\t}\n\t\tif (response === \"abort\") {\n\t\t\tlastError = data;\n\t\t\tfailQuery();\n\t\t\treturn;\n\t\t}\n\t\tif (isError) {\n\t\t\tlastError = data;\n\t\t\tif (!queue.length) if (!resources.length) failQuery();\n\t\t\telse execNext();\n\t\t\treturn;\n\t\t}\n\t\tresetTimer();\n\t\tclearQueue();\n\t\tif (!config.random) {\n\t\t\tconst index = config.resources.indexOf(item.resource);\n\t\t\tif (index !== -1 && index !== config.index) config.index = index;\n\t\t}\n\t\tstatus = \"completed\";\n\t\tdoneCallbacks.forEach((callback) => {\n\t\t\tcallback(data);\n\t\t});\n\t}\n\t/**\n\t* Execute next query\n\t*/\n\tfunction execNext() {\n\t\tif (status !== \"pending\") return;\n\t\tresetTimer();\n\t\tconst resource = resources.shift();\n\t\tif (resource === void 0) {\n\t\t\tif (queue.length) {\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\tresetTimer();\n\t\t\t\t\tif (status === \"pending\") {\n\t\t\t\t\t\tclearQueue();\n\t\t\t\t\t\tfailQuery();\n\t\t\t\t\t}\n\t\t\t\t}, config.timeout);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfailQuery();\n\t\t\treturn;\n\t\t}\n\t\tconst item = {\n\t\t\tstatus: \"pending\",\n\t\t\tresource,\n\t\t\tcallback: (status$1, data) => {\n\t\t\t\tmoduleResponse(item, status$1, data);\n\t\t\t}\n\t\t};\n\t\tqueue.push(item);\n\t\tqueriesSent++;\n\t\ttimer = setTimeout(execNext, config.rotate);\n\t\tquery(resource, payload, item.callback);\n\t}\n\tsetTimeout(execNext);\n\treturn getQueryStatus;\n}\n\n/**\n* Redundancy instance\n*/\nfunction initRedundancy(cfg) {\n\tconst config = {\n\t\t...defaultConfig,\n\t\t...cfg\n\t};\n\tlet queries = [];\n\t/**\n\t* Remove aborted and completed queries\n\t*/\n\tfunction cleanup() {\n\t\tqueries = queries.filter((item) => item().status === \"pending\");\n\t}\n\t/**\n\t* Send query\n\t*/\n\tfunction query(payload, queryCallback, doneCallback) {\n\t\tconst query$1 = sendQuery(config, payload, queryCallback, (data, error) => {\n\t\t\tcleanup();\n\t\t\tif (doneCallback) doneCallback(data, error);\n\t\t});\n\t\tqueries.push(query$1);\n\t\treturn query$1;\n\t}\n\t/**\n\t* Find instance\n\t*/\n\tfunction find(callback) {\n\t\treturn queries.find((value) => {\n\t\t\treturn callback(value);\n\t\t}) || null;\n\t}\n\tconst instance = {\n\t\tquery,\n\t\tfind,\n\t\tsetIndex: (index) => {\n\t\t\tconfig.index = index;\n\t\t},\n\t\tgetIndex: () => config.index,\n\t\tcleanup\n\t};\n\treturn instance;\n}\n\nfunction emptyCallback$1() {}\nconst redundancyCache = Object.create(null);\n/**\n* Get Redundancy instance for provider\n*/\nfunction getRedundancyCache(provider) {\n\tif (!redundancyCache[provider]) {\n\t\tconst config = getAPIConfig(provider);\n\t\tif (!config) return;\n\t\tconst redundancy = initRedundancy(config);\n\t\tconst cachedReundancy = {\n\t\t\tconfig,\n\t\t\tredundancy\n\t\t};\n\t\tredundancyCache[provider] = cachedReundancy;\n\t}\n\treturn redundancyCache[provider];\n}\n/**\n* Send API query\n*/\nfunction sendAPIQuery(target, query, callback) {\n\tlet redundancy;\n\tlet send;\n\tif (typeof target === \"string\") {\n\t\tconst api = getAPIModule(target);\n\t\tif (!api) {\n\t\t\tcallback(void 0, 424);\n\t\t\treturn emptyCallback$1;\n\t\t}\n\t\tsend = api.send;\n\t\tconst cached = getRedundancyCache(target);\n\t\tif (cached) redundancy = cached.redundancy;\n\t} else {\n\t\tconst config = createAPIConfig(target);\n\t\tif (config) {\n\t\t\tredundancy = initRedundancy(config);\n\t\t\tconst moduleKey = target.resources ? target.resources[0] : \"\";\n\t\t\tconst api = getAPIModule(moduleKey);\n\t\t\tif (api) send = api.send;\n\t\t}\n\t}\n\tif (!redundancy || !send) {\n\t\tcallback(void 0, 424);\n\t\treturn emptyCallback$1;\n\t}\n\treturn redundancy.query(query, send, callback)().abort;\n}\n\nfunction emptyCallback() {}\n/**\n* Function called when new icons have been loaded\n*/\nfunction loadedNewIcons(storage) {\n\tif (!storage.iconsLoaderFlag) {\n\t\tstorage.iconsLoaderFlag = true;\n\t\tsetTimeout(() => {\n\t\t\tstorage.iconsLoaderFlag = false;\n\t\t\tupdateCallbacks(storage);\n\t\t});\n\t}\n}\n/**\n* Check icon names for API\n*/\nfunction checkIconNamesForAPI(icons) {\n\tconst valid = [];\n\tconst invalid = [];\n\ticons.forEach((name) => {\n\t\t(name.match(matchIconName) ? valid : invalid).push(name);\n\t});\n\treturn {\n\t\tvalid,\n\t\tinvalid\n\t};\n}\n/**\n* Parse loader response\n*/\nfunction parseLoaderResponse(storage, icons, data) {\n\tfunction checkMissing() {\n\t\tconst pending = storage.pendingIcons;\n\t\ticons.forEach((name) => {\n\t\t\tif (pending) pending.delete(name);\n\t\t\tif (!storage.icons[name]) storage.missing.add(name);\n\t\t});\n\t}\n\tif (data && typeof data === \"object\") try {\n\t\tconst parsed = addIconSet(storage, data);\n\t\tif (!parsed.length) {\n\t\t\tcheckMissing();\n\t\t\treturn;\n\t\t}\n\t} catch (err) {\n\t\tconsole.error(err);\n\t}\n\tcheckMissing();\n\tloadedNewIcons(storage);\n}\n/**\n* Handle response that can be async\n*/\nfunction parsePossiblyAsyncResponse(response, callback) {\n\tif (response instanceof Promise) response.then((data) => {\n\t\tcallback(data);\n\t}).catch(() => {\n\t\tcallback(null);\n\t});\n\telse callback(response);\n}\n/**\n* Load icons\n*/\nfunction loadNewIcons(storage, icons) {\n\tif (!storage.iconsToLoad) storage.iconsToLoad = icons;\n\telse storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();\n\tif (!storage.iconsQueueFlag) {\n\t\tstorage.iconsQueueFlag = true;\n\t\tsetTimeout(() => {\n\t\t\tstorage.iconsQueueFlag = false;\n\t\t\tconst { provider, prefix } = storage;\n\t\t\tconst icons$1 = storage.iconsToLoad;\n\t\t\tdelete storage.iconsToLoad;\n\t\t\tif (!icons$1 || !icons$1.length) return;\n\t\t\tconst customIconLoader = storage.loadIcon;\n\t\t\tif (storage.loadIcons && (icons$1.length > 1 || !customIconLoader)) {\n\t\t\t\tparsePossiblyAsyncResponse(storage.loadIcons(icons$1, prefix, provider), (data) => {\n\t\t\t\t\tparseLoaderResponse(storage, icons$1, data);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (customIconLoader) {\n\t\t\t\ticons$1.forEach((name) => {\n\t\t\t\t\tconst response = customIconLoader(name, prefix, provider);\n\t\t\t\t\tparsePossiblyAsyncResponse(response, (data) => {\n\t\t\t\t\t\tconst iconSet = data ? {\n\t\t\t\t\t\t\tprefix,\n\t\t\t\t\t\t\ticons: { [name]: data }\n\t\t\t\t\t\t} : null;\n\t\t\t\t\t\tparseLoaderResponse(storage, [name], iconSet);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { valid, invalid } = checkIconNamesForAPI(icons$1);\n\t\t\tif (invalid.length) parseLoaderResponse(storage, invalid, null);\n\t\t\tif (!valid.length) return;\n\t\t\tconst api = prefix.match(matchIconName) ? getAPIModule(provider) : null;\n\t\t\tif (!api) {\n\t\t\t\tparseLoaderResponse(storage, valid, null);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst params = api.prepare(provider, prefix, valid);\n\t\t\tparams.forEach((item) => {\n\t\t\t\tsendAPIQuery(provider, item, (data) => {\n\t\t\t\t\tparseLoaderResponse(storage, item.icons, data);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n}\n/**\n* Load icons\n*/\nconst loadIcons = (icons, callback) => {\n\tconst cleanedIcons = listToIcons(icons, true, allowSimpleNames());\n\tconst sortedIcons = sortIcons(cleanedIcons);\n\tif (!sortedIcons.pending.length) {\n\t\tlet callCallback = true;\n\t\tif (callback) setTimeout(() => {\n\t\t\tif (callCallback) callback(sortedIcons.loaded, sortedIcons.missing, sortedIcons.pending, emptyCallback);\n\t\t});\n\t\treturn () => {\n\t\t\tcallCallback = false;\n\t\t};\n\t}\n\tconst newIcons = Object.create(null);\n\tconst sources = [];\n\tlet lastProvider, lastPrefix;\n\tsortedIcons.pending.forEach((icon) => {\n\t\tconst { provider, prefix } = icon;\n\t\tif (prefix === lastPrefix && provider === lastProvider) return;\n\t\tlastProvider = provider;\n\t\tlastPrefix = prefix;\n\t\tsources.push(getStorage(provider, prefix));\n\t\tconst providerNewIcons = newIcons[provider] || (newIcons[provider] = Object.create(null));\n\t\tif (!providerNewIcons[prefix]) providerNewIcons[prefix] = [];\n\t});\n\tsortedIcons.pending.forEach((icon) => {\n\t\tconst { provider, prefix, name } = icon;\n\t\tconst storage = getStorage(provider, prefix);\n\t\tconst pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());\n\t\tif (!pendingQueue.has(name)) {\n\t\t\tpendingQueue.add(name);\n\t\t\tnewIcons[provider][prefix].push(name);\n\t\t}\n\t});\n\tsources.forEach((storage) => {\n\t\tconst list = newIcons[storage.provider][storage.prefix];\n\t\tif (list.length) loadNewIcons(storage, list);\n\t});\n\treturn callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;\n};\n/**\n* Load one icon using Promise\n*/\nconst loadIcon = (icon) => {\n\treturn new Promise((fulfill, reject) => {\n\t\tconst iconObj = typeof icon === \"string\" ? stringToIcon(icon, true) : icon;\n\t\tif (!iconObj) {\n\t\t\treject(icon);\n\t\t\treturn;\n\t\t}\n\t\tloadIcons([iconObj || icon], (loaded) => {\n\t\t\tif (loaded.length && iconObj) {\n\t\t\t\tconst data = getIconData(iconObj);\n\t\t\t\tif (data) {\n\t\t\t\t\tfulfill({\n\t\t\t\t\t\t...defaultIconProps,\n\t\t\t\t\t\t...data\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\treject(icon);\n\t\t});\n\t});\n};\n\n/**\n* Set custom loader for multiple icons\n*/\nfunction setCustomIconsLoader(loader, prefix, provider) {\n\tgetStorage(provider || \"\", prefix).loadIcons = loader;\n}\n/**\n* Set custom loader for one icon\n*/\nfunction setCustomIconLoader(loader, prefix, provider) {\n\tgetStorage(provider || \"\", prefix).loadIcon = loader;\n}\n\n/**\n* Convert IconifyIconCustomisations to FullIconCustomisations, checking value types\n*/\nfunction mergeCustomisations(defaults, item) {\n\tconst result = { ...defaults };\n\tfor (const key in item) {\n\t\tconst value = item[key];\n\t\tconst valueType = typeof value;\n\t\tif (key in defaultIconSizeCustomisations) {\n\t\t\tif (value === null || value && (valueType === \"string\" || valueType === \"number\")) result[key] = value;\n\t\t} else if (valueType === typeof result[key]) result[key] = key === \"rotate\" ? value % 4 : value;\n\t}\n\treturn result;\n}\n\nconst separator = /[\\s,]+/;\n/**\n* Apply \"flip\" string to icon customisations\n*/\nfunction flipFromString(custom, flip) {\n\tflip.split(separator).forEach((str) => {\n\t\tconst value = str.trim();\n\t\tswitch (value) {\n\t\t\tcase \"horizontal\":\n\t\t\t\tcustom.hFlip = true;\n\t\t\t\tbreak;\n\t\t\tcase \"vertical\":\n\t\t\t\tcustom.vFlip = true;\n\t\t\t\tbreak;\n\t\t}\n\t});\n}\n\n/**\n* Get rotation value\n*/\nfunction rotateFromString(value, defaultValue = 0) {\n\tconst units = value.replace(/^-?[0-9.]*/, \"\");\n\tfunction cleanup(value$1) {\n\t\twhile (value$1 < 0) value$1 += 4;\n\t\treturn value$1 % 4;\n\t}\n\tif (units === \"\") {\n\t\tconst num = parseInt(value);\n\t\treturn isNaN(num) ? 0 : cleanup(num);\n\t} else if (units !== value) {\n\t\tlet split = 0;\n\t\tswitch (units) {\n\t\t\tcase \"%\":\n\t\t\t\tsplit = 25;\n\t\t\t\tbreak;\n\t\t\tcase \"deg\": split = 90;\n\t\t}\n\t\tif (split) {\n\t\t\tlet num = parseFloat(value.slice(0, value.length - units.length));\n\t\t\tif (isNaN(num)) return 0;\n\t\t\tnum = num / split;\n\t\t\treturn num % 1 === 0 ? cleanup(num) : 0;\n\t\t}\n\t}\n\treturn defaultValue;\n}\n\n/**\n* Generate <svg>\n*/\nfunction iconToHTML(body, attributes) {\n\tlet renderAttribsHTML = body.indexOf(\"xlink:\") === -1 ? \"\" : \" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"\";\n\tfor (const attr in attributes) renderAttribsHTML += \" \" + attr + \"=\\\"\" + attributes[attr] + \"\\\"\";\n\treturn \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\" + renderAttribsHTML + \">\" + body + \"</svg>\";\n}\n\n/**\n* Encode SVG for use in url()\n*\n* Short alternative to encodeURIComponent() that encodes only stuff used in SVG, generating\n* smaller code.\n*/\nfunction encodeSVGforURL(svg) {\n\treturn svg.replace(/\"/g, \"'\").replace(/%/g, \"%25\").replace(/#/g, \"%23\").replace(/</g, \"%3C\").replace(/>/g, \"%3E\").replace(/\\s+/g, \" \");\n}\n/**\n* Generate data: URL from SVG\n*/\nfunction svgToData(svg) {\n\treturn \"data:image/svg+xml,\" + encodeSVGforURL(svg);\n}\n/**\n* Generate url() from SVG\n*/\nfunction svgToURL(svg) {\n\treturn \"url(\\\"\" + svgToData(svg) + \"\\\")\";\n}\n\nlet policy;\n/**\n* Attempt to create policy\n*/\nfunction createPolicy() {\n\ttry {\n\t\tpolicy = window.trustedTypes.createPolicy(\"iconify\", { createHTML: (s) => s });\n\t} catch (err) {\n\t\tpolicy = null;\n\t}\n}\n/**\n* Clean up value for innerHTML assignment\n*\n* This code doesn't actually clean up anything.\n* It is intended be used with Iconify icon data, which has already been validated\n*/\nfunction cleanUpInnerHTML(html) {\n\tif (policy === void 0) createPolicy();\n\treturn policy ? policy.createHTML(html) : html;\n}\n\nconst defaultExtendedIconCustomisations = {\n ...defaultIconCustomisations,\n inline: false,\n};\n\n/**\n * Default SVG attributes\n */\nconst svgDefaults = {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'xmlnsXlink': 'http://www.w3.org/1999/xlink',\n 'aria-hidden': true,\n 'role': 'img',\n};\n/**\n * Style modes\n */\nconst commonProps = {\n display: 'inline-block',\n};\nconst monotoneProps = {\n backgroundColor: 'currentColor',\n};\nconst coloredProps = {\n backgroundColor: 'transparent',\n};\n// Dynamically add common props to variables above\nconst propsToAdd = {\n Image: 'var(--svg)',\n Repeat: 'no-repeat',\n Size: '100% 100%',\n};\nconst propsToAddTo = {\n WebkitMask: monotoneProps,\n mask: monotoneProps,\n background: coloredProps,\n};\nfor (const prefix in propsToAddTo) {\n const list = propsToAddTo[prefix];\n for (const prop in propsToAdd) {\n list[prefix + prop] = propsToAdd[prop];\n }\n}\n/**\n * Default values for customisations for inline icon\n */\nconst inlineDefaults = {\n ...defaultExtendedIconCustomisations,\n inline: true,\n};\n/**\n * Fix size: add 'px' to numbers\n */\nfunction fixSize(value) {\n return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');\n}\n/**\n * Render icon\n */\nconst render = (\n// Icon must be validated before calling this function\nicon, \n// Partial properties\nprops, \n// Icon name\nname) => {\n // Get default properties\n const defaultProps = props.inline\n ? inlineDefaults\n : defaultExtendedIconCustomisations;\n // Get all customisations\n const customisations = mergeCustomisations(defaultProps, props);\n // Check mode\n const mode = props.mode || 'svg';\n // Create style\n const style = {};\n const customStyle = props.style || {};\n // Create SVG component properties\n const componentProps = {\n ...(mode === 'svg' ? svgDefaults : {}),\n };\n if (name) {\n const iconName = stringToIcon(name, false, true);\n if (iconName) {\n const classNames = ['iconify'];\n const props = [\n 'provider',\n 'prefix',\n ];\n for (const prop of props) {\n if (iconName[prop]) {\n classNames.push('iconify--' + iconName[prop]);\n }\n }\n componentProps.className = classNames.join(' ');\n }\n }\n // Get element properties\n for (let key in props) {\n const value = props[key];\n if (value === void 0) {\n continue;\n }\n switch (key) {\n // Properties to ignore\n case 'icon':\n case 'style':\n case 'children':\n case 'onLoad':\n case 'mode':\n case 'ssr':\n case 'fallback':\n break;\n // Forward ref\n case '_ref':\n componentProps.ref = value;\n break;\n // Merge class names\n case 'className':\n componentProps[key] =\n (componentProps[key] ? componentProps[key] + ' ' : '') +\n value;\n break;\n // Boolean attributes\n case 'inline':\n case 'hFlip':\n case 'vFlip':\n customisations[key] =\n value === true || value === 'true' || value === 1;\n break;\n // Flip as string: 'horizontal,vertical'\n case 'flip':\n if (typeof value === 'string') {\n flipFromString(customisations, value);\n }\n break;\n // Color: copy to style\n case 'color':\n style.color = value;\n break;\n // Rotation as string\n case 'rotate':\n if (typeof value === 'string') {\n customisations[key] = rotateFromString(value);\n }\n else if (typeof value === 'number') {\n customisations[key] = value;\n }\n break;\n // Remove aria-hidden\n case 'ariaHidden':\n case 'aria-hidden':\n if (value !== true && value !== 'true') {\n delete componentProps['aria-hidden'];\n }\n break;\n // Copy missing property if it does not exist in customisations\n default:\n if (defaultProps[key] === void 0) {\n componentProps[key] = value;\n }\n }\n }\n // Generate icon\n const item = iconToSVG(icon, customisations);\n const renderAttribs = item.attributes;\n // Inline display\n if (customisations.inline) {\n style.verticalAlign = '-0.125em';\n }\n if (mode === 'svg') {\n // Add style\n componentProps.style = {\n ...style,\n ...customStyle,\n };\n // Add icon stuff\n Object.assign(componentProps, renderAttribs);\n // Counter for ids based on \"id\" property to render icons consistently on server and client\n let localCounter = 0;\n let id = props.id;\n if (typeof id === 'string') {\n // Convert '-' to '_' to avoid errors in animations\n id = id.replace(/-/g, '_');\n }\n // Add icon stuff\n componentProps.dangerouslySetInnerHTML = {\n __html: cleanUpInnerHTML(replaceIDs(item.body, id ? () => id + 'ID' + localCounter++ : 'iconifyReact')),\n };\n return createElement('svg', componentProps);\n }\n // Render <span> with style\n const { body, width, height } = icon;\n const useMask = mode === 'mask' ||\n (mode === 'bg' ? false : body.indexOf('currentColor') !== -1);\n // Generate SVG\n const html = iconToHTML(body, {\n ...renderAttribs,\n width: width + '',\n height: height + '',\n });\n // Generate style\n componentProps.style = {\n ...style,\n '--svg': svgToURL(html),\n 'width': fixSize(renderAttribs.width),\n 'height': fixSize(renderAttribs.height),\n ...commonProps,\n ...(useMask ? monotoneProps : coloredProps),\n ...customStyle,\n };\n return createElement('span', componentProps);\n};\n\n/**\n * Initialise stuff\n */\n// Enable short names\nallowSimpleNames(true);\n// Set API module\nsetAPIModule('', fetchAPIModule);\n/**\n * Browser stuff\n */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n const _window = window;\n // Load icons from global \"IconifyPreload\"\n if (_window.IconifyPreload !== void 0) {\n const preload = _window.IconifyPreload;\n const err = 'Invalid IconifyPreload syntax.';\n if (typeof preload === 'object' && preload !== null) {\n (preload instanceof Array ? preload : [preload]).forEach((item) => {\n try {\n if (\n // Check if item is an object and not null/array\n typeof item !== 'object' ||\n item === null ||\n item instanceof Array ||\n // Check for 'icons' and 'prefix'\n typeof item.icons !== 'object' ||\n typeof item.prefix !== 'string' ||\n // Add icon set\n !addCollection(item)) {\n console.error(err);\n }\n }\n catch (e) {\n console.error(err);\n }\n });\n }\n }\n // Set API from global \"IconifyProviders\"\n if (_window.IconifyProviders !== void 0) {\n const providers = _window.IconifyProviders;\n if (typeof providers === 'object' && providers !== null) {\n for (let key in providers) {\n const err = 'IconifyProviders[' + key + '] is invalid.';\n try {\n const value = providers[key];\n if (typeof value !== 'object' ||\n !value ||\n value.resources === void 0) {\n continue;\n }\n if (!addAPIProvider(key, value)) {\n console.error(err);\n }\n }\n catch (e) {\n console.error(err);\n }\n }\n }\n }\n}\nfunction IconComponent(props) {\n const [mounted, setMounted] = useState(!!props.ssr);\n const [abort, setAbort] = useState({});\n // Get initial state\n function getInitialState(mounted) {\n if (mounted) {\n const name = props.icon;\n if (typeof name === 'object') {\n // Icon as object\n return {\n name: '',\n data: name,\n };\n }\n const data = getIconData(name);\n if (data) {\n return {\n name,\n data,\n };\n }\n }\n return {\n name: '',\n };\n }\n const [state, setState] = useState(getInitialState(!!props.ssr));\n // Cancel loading\n function cleanup() {\n const callback = abort.callback;\n if (callback) {\n callback();\n setAbort({});\n }\n }\n // Change state if it is different\n function changeState(newState) {\n if (JSON.stringify(state) !== JSON.stringify(newState)) {\n cleanup();\n setState(newState);\n return true;\n }\n }\n // Update state\n function updateState() {\n var _a;\n const name = props.icon;\n if (typeof name === 'object') {\n // Icon as object\n changeState({\n name: '',\n data: name,\n });\n return;\n }\n // New icon or got icon data\n const data = getIconData(name);\n if (changeState({\n name,\n data,\n })) {\n if (data === undefined) {\n // Load icon, update state when done\n const callback = loadIcons([name], updateState);\n setAbort({\n callback,\n });\n }\n else if (data) {\n // Icon data is available: trigger onLoad callback if present\n (_a = props.onLoad) === null || _a === void 0 ? void 0 : _a.call(props, name);\n }\n }\n }\n // Mounted state, cleanup for loader\n useEffect(() => {\n setMounted(true);\n return cleanup;\n }, []);\n // Icon changed or component mounted\n useEffect(() => {\n if (mounted) {\n updateState();\n }\n }, [props.icon, mounted]);\n // Render icon\n const { name, data } = state;\n if (!data) {\n return props.children\n ? props.children\n : props.fallback\n ? props.fallback\n : createElement('span', {});\n }\n return render({\n ...defaultIconProps,\n ...data,\n }, props, name);\n}\n/**\n * Block icon\n *\n * @param props - Component properties\n */\nconst Icon = forwardRef((props, ref) => IconComponent({\n ...props,\n _ref: ref,\n}));\n/**\n * Inline icon (has negative verticalAlign that makes it behave like icon font)\n *\n * @param props - Component properties\n */\nconst InlineIcon = forwardRef((props, ref) => IconComponent({\n inline: true,\n ...props,\n _ref: ref,\n}));\n/**\n * Internal API\n */\nconst _api = {\n getAPIConfig,\n setAPIModule,\n sendAPIQuery,\n setFetch,\n getFetch,\n listAPIProviders,\n};\n\nexport { Icon, InlineIcon, _api, addAPIProvider, addCollection, addIcon, iconToSVG as buildIcon, calculateSize, getIcon, iconLoaded, listIcons, loadIcon, loadIcons, replaceIDs, setCustomIconLoader, setCustomIconsLoader };\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, ChunkUploadOptions } 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/**\n * 将文件分割成多个 Blob\n * @param file - 要分割的文件\n * @param chunkSize - 分片大小(字节)\n * @returns 分片数组\n */\nconst splitFileIntoChunks = (\n file: File,\n chunkSize: number\n): { blob: Blob; index: number; start: number; end: number }[] => {\n const chunks: { blob: Blob; index: number; start: number; end: number }[] = [];\n let start = 0;\n let index = 0;\n\n while (start < file.size) {\n const end = Math.min(start + chunkSize, file.size);\n const blob = file.slice(start, end);\n chunks.push({\n blob,\n index,\n start,\n end,\n });\n start = end;\n index++;\n }\n\n return chunks;\n};\n\n/**\n * 上传单个分片\n * @param options - 分片上传选项\n * @returns Promise<string> - 服务器响应文本\n */\nconst uploadChunk = ({\n action,\n chunk,\n chunkIndex,\n totalChunks,\n fileName,\n fileSize,\n method = \"post\",\n headers,\n onProgress,\n signal,\n}: ChunkUploadOptions): Promise<string> =>\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 (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n // 注意:分片信息已通过 FormData 传递,避免自定义请求头触发 CORS 预检\n // chunkIndex, totalChunks, fileName, fileSize 都在 formData 中\n\n xhr.upload.onprogress = (event) => {\n onProgress?.(event);\n };\n\n xhr.onload = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n } else {\n reject(new Error(`Chunk upload failed: ${xhr.statusText}`));\n }\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(\"Chunk upload aborted\", \"AbortError\"));\n };\n\n if (signal?.aborted) {\n reject(new DOMException(\"Chunk upload aborted\", \"AbortError\"));\n return;\n }\n signal?.addEventListener(\"abort\", handleAbort);\n\n const formData = new FormData();\n\n formData.append(\"file\", chunk);\n formData.append(\"chunkIndex\", String(chunkIndex));\n formData.append(\"totalChunks\", String(totalChunks));\n formData.append(\"fileName\", fileName);\n formData.append(\"fileSize\", String(fileSize));\n\n xhr.send(formData);\n });\n\n/**\n * 检查已上传的分片(断点续传)\n * @param action - 查询接口地址\n * @param file - 文件对象\n * @param chunkSize - 分片大小\n * @param headers - 请求头\n * @returns Promise<number[]> - 已上传的分片索引数组\n */\nconst checkUploadedChunks = (\n action: string,\n file: File,\n chunkSize: number,\n headers?: Record<string, string>\n): Promise<number[]> =>\n new Promise<string>((resolve, _reject) => {\n const xhr = new XMLHttpRequest();\n\n // 构建查询参数\n const params = new URLSearchParams({\n fileName: file.name,\n fileSize: String(file.size),\n chunkSize: String(chunkSize),\n });\n\n xhr.open(\"GET\", `${action}?${params}`, true);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n } else {\n // 如果查询失败,返回空数组(从头开始上传)\n resolve(\"[]\");\n }\n };\n\n xhr.onerror = () => {\n // 如果查询失败,返回空数组(从头开始上传)\n resolve(\"[]\");\n };\n\n xhr.ontimeout = () => {\n resolve(\"[]\");\n };\n\n xhr.send();\n }).then((responseText) => {\n try {\n const data = JSON.parse(responseText);\n return data.uploadedChunks || [];\n } catch {\n return [];\n }\n });\n\n/**\n * 合并分片\n * @param action - 合并接口地址\n * @param fileName - 文件名\n * @param totalChunks - 总分片数\n * @param method - 请求方法\n * @param headers - 请求头\n * @returns Promise<string> - 服务器响应\n */\nconst mergeChunks = (\n action: string,\n fileName: string,\n totalChunks: number,\n method: \"post\" | \"put\" = \"post\",\n headers?: Record<string, string>\n): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method.toUpperCase(), action, true);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n } else {\n reject(new Error(`Merge chunks failed: ${xhr.statusText}`));\n }\n };\n\n xhr.onerror = (event) => {\n reject(event);\n };\n\n const body = JSON.stringify({\n fileName,\n totalChunks,\n });\n\n xhr.send(body);\n });\n\n/**\n * 并行控制函数 - 控制同时运行的任务数量\n */\nconst parallelLimit = async <T>(\n tasks: (() => Promise<T>)[],\n limit: number\n): Promise<T[]> => {\n const results: T[] = [];\n const executing: Promise<void>[] = [];\n\n for (const task of tasks) {\n const promise = task().then((result) => {\n results.push(result);\n });\n\n executing.push(promise);\n\n if (executing.length >= limit) {\n await Promise.race(executing);\n // 移除已完成的 promise\n const completedIndex = executing.findIndex(\n (p) => (p as unknown as { status: string }).status === \"fulfilled\"\n );\n if (completedIndex !== -1) {\n executing.splice(completedIndex, 1);\n }\n }\n }\n\n // 等待所有任务完成\n await Promise.all(executing);\n return results;\n};\n\nexport {\n uploadFile,\n splitFileIntoChunks,\n uploadChunk,\n checkUploadedChunks,\n mergeChunks,\n parallelLimit,\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 ChunkedUploadConfig {\n /** 是否启用分片上传 */\n chunked?: boolean;\n /** 分片大小(字节),默认 2MB */\n chunkSize?: number;\n /** 分片并行数,默认 3 */\n chunkConcurrency?: number;\n /** 是否启用断点续传 */\n resumable?: boolean;\n /** 获取已上传分片列表的 API */\n chunkedUrl?: string;\n /** 合并分片的 API */\n mergeUrl?: string;\n /** 触发自动分片上传的文件大小阈值,默认 5MB */\n chunkThreshold?: number;\n}\n\n/** 分片信息 */\nexport interface UploadChunk {\n index: number; // 分片索引\n start: number; // 起始字节\n end: number; // 结束字节\n size: number; // 分片大小\n uploaded: boolean; // 是否已上传\n}\n\n/** 分片上传进度 */\nexport interface ChunkProgress {\n chunkIndex: number;\n chunkProgress: number; // 当前分片进度 0-100\n totalProgress: number; // 整体进度 0-100\n uploadedChunks: number;\n totalChunks: number;\n}\n\n/** 分片上传选项 */\nexport interface ChunkUploadOptions {\n action: string;\n chunk: Blob;\n chunkIndex: number;\n totalChunks: number;\n fileName: string;\n fileSize: number;\n method?: HttpMethod;\n headers?: Record<string, string>;\n onProgress?: (event: ProgressEvent<EventTarget>) => void;\n signal?: AbortSignal;\n}\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 chunkedConfig?: ChunkedUploadConfig;\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 chunkedConfig: ChunkedUploadConfig | undefined;\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 { type ChunkProgress } from \"../types\";\r\n\r\n/** 单个分片项 Props */\r\ninterface ChunkItemProps {\r\n index: number;\r\n progress: number; // 0-100\r\n isCompleted: boolean; // 是否已完成\r\n isUploading: boolean; // 是否正在上传\r\n isPending: boolean; // 是否等待上传\r\n}\r\n\r\n/**\r\n * 单个分片项组件\r\n * 使用小圆点展示状态\r\n */\r\nfunction ChunkItem({ index, progress, isCompleted, isUploading, isPending }: ChunkItemProps) {\r\n // 状态颜色\r\n const getStatusColor = () => {\r\n if (isCompleted) return \"bg-green-500\";\r\n if (isUploading) return \"bg-blue-500\";\r\n return \"bg-gray-300\";\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-1\">\r\n <div\r\n className={`w-2 h-2 rounded-full ${getStatusColor()} transition-all duration-200`}\r\n title={`分片 ${index + 1}: ${isCompleted ? \"已完成\" : isUploading ? `${progress}%` : \"等待中\"}`}\r\n >\r\n {/* 上传中的分片显示进度环 */}\r\n {isUploading && (\r\n <svg className=\"w-2 h-2 -rotate-90\" viewBox=\"0 0 8 8\">\r\n <circle\r\n cx=\"4\"\r\n cy=\"4\"\r\n r=\"3\"\r\n fill=\"none\"\r\n stroke=\"#e5e7eb\"\r\n strokeWidth=\"1\"\r\n />\r\n <circle\r\n cx=\"4\"\r\n cy=\"4\"\r\n r=\"3\"\r\n fill=\"none\"\r\n stroke=\"#3b82f6\"\r\n strokeWidth=\"1\"\r\n strokeDasharray={`${progress * 0.188} 18.8`}\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/** 分片列表 Props */\r\ninterface ChunkListProps {\r\n chunkProgress?: ChunkProgress; // 当前分片的进度信息\r\n totalChunks: number; // 总分片数\r\n}\r\n\r\n/**\r\n * 分片列表组件\r\n * 简洁地展示所有分片的上传状态\r\n * 样式:行内小圆点,适合放在文件进度条下方\r\n */\r\nfunction ChunkList({ chunkProgress, totalChunks }: ChunkListProps) {\r\n if (!chunkProgress || totalChunks <= 1) {\r\n return null;\r\n }\r\n\r\n const { uploadedChunks, chunkIndex, chunkProgress: currentProgress } = chunkProgress;\r\n\r\n // 生成所有分片的状态数组\r\n const chunks = Array.from({ length: totalChunks }, (_, i) => {\r\n if (i < uploadedChunks) {\r\n return { index: i, status: \"completed\" as const };\r\n } else if (i === chunkIndex) {\r\n return { index: i, status: \"uploading\" as const, progress: currentProgress };\r\n } else {\r\n return { index: i, status: \"pending\" as const };\r\n }\r\n });\r\n\r\n // 如果分片太多,只显示部分(每5个一组用逗号分隔)\r\n if (totalChunks > 20) {\r\n return (\r\n <div className=\"mt-1 text-xs text-gray-400\">\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <span>{uploadedChunks}/{totalChunks} 分片已上传</span>\r\n {chunkIndex !== undefined && (\r\n <span className=\"text-blue-500\">当前: 分片 {chunkIndex + 1} ({currentProgress}%)</span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"mt-1 flex items-center gap-0.5 flex-wrap\">\r\n {chunks.map((chunk) => (\r\n <ChunkItem\r\n key={chunk.index}\r\n index={chunk.index}\r\n progress={chunk.progress || 0}\r\n isCompleted={chunk.status === \"completed\"}\r\n isUploading={chunk.status === \"uploading\"}\r\n isPending={chunk.status === \"pending\"}\r\n />\r\n ))}\r\n <span className=\"text-xs text-gray-400 ml-1\">\r\n {uploadedChunks}/{totalChunks}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\n/** 紧凑分片进度(适合放在进度条旁边) */\r\ninterface CompactChunkProgressProps {\r\n chunkProgress?: ChunkProgress;\r\n}\r\n\r\nfunction CompactChunkProgress({ chunkProgress }: CompactChunkProgressProps) {\r\n if (!chunkProgress) return null;\r\n\r\n const { uploadedChunks, totalChunks, totalProgress, chunkIndex, chunkProgress: currentProgress } = chunkProgress;\r\n\r\n if (totalChunks <= 1) return null;\r\n\r\n return (\r\n <div className=\"flex items-center gap-2 text-xs text-gray-500\">\r\n <div className=\"flex items-center gap-1\">\r\n <Icon icon=\"lucide:layers\" className=\"w-3 h-3\" />\r\n <span>{uploadedChunks}/{totalChunks}</span>\r\n </div>\r\n {chunkIndex !== undefined && (\r\n <span className=\"text-blue-500\">\r\n {currentProgress}%\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport { ChunkList, ChunkItem, CompactChunkProgress };\r\nexport type { ChunkItemProps, ChunkListProps, CompactChunkProgressProps };\r\n","/**\r\n * 文件列表组件\r\n * 显示所有已选择/上传的文件及其进度\r\n */\r\nimport { Icon } from \"@iconify/react\";\r\nimport { UploadFile, type UploadStatus, type ChunkProgress } from \"../types\";\r\nimport { ChunkList, CompactChunkProgress } from \"./ChunkProgress\";\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 chunkProgress?: ChunkProgress;\r\n}\r\n\r\n/**\r\n * 单个文件项组件\r\n * 显示文件名、进度条、状态图标\r\n */\r\nfunction FileItem({ file, onRemove, onCancel, chunkProgress }: 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=\"flex items-center gap-2\">\r\n <div className=\"flex-1 h-1.5 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 whitespace-nowrap\">{progress}%</span>\r\n </div>\r\n {/* 分片进度信息 */}\r\n {chunkProgress && chunkProgress.totalChunks > 1 && (\r\n <ChunkList\r\n chunkProgress={chunkProgress}\r\n totalChunks={chunkProgress.totalChunks}\r\n />\r\n )}\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 chunkProgressMap?: Record<string, ChunkProgress>;\r\n}\r\n\r\n/**\r\n * 文件列表组件\r\n * 渲染所有已选择的文件\r\n */\r\nfunction FileList({ files, onRemove, onCancel, show = true, chunkProgressMap }: 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 chunkProgress={chunkProgressMap?.[file.id]}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport { FileList, FileItem };\r\nexport type { FileListProps, FileItemProps };\r\n","/**\n * 上传组件 - \n *\n * 使用统一的 UploadConfig 接口,支持:\n * - 三种上传模式:button(按钮)、image(图片)、dragger(拖拽)\n * - 文件验证:accept、maxSize、maxCount\n * - 手动/自动上传模式\n * - 增强的错误处理\n *\n * @example\n * ```tsx\n * // 基础用法\n * <Upload action=\"/api/upload\" />\n *\n * // 图片上传\n * <Upload mode=\"image\" action=\"/api/upload\" accept=\"image/*\" maxSize={5 * 1024 * 1024} />\n *\n * // 拖拽上传\n * <Upload mode=\"dragger\" action=\"/api/upload\" maxCount={5} />\n *\n * // 手动上传模式\n * <Upload mode=\"button\" action=\"/api/upload\" autoUpload={false} onChange={handleChange} />\n * <button onClick={triggerUpload}>上传</button>\n * </Upload>\n * ```\n */\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n useCallback,\n type ChangeEvent,\n type DragEvent,\n} from \"react\";\nimport {\n type UploadConfig,\n type UploadFile,\n type UploadStatus,\n type UploadError,\n type UploadMode,\n type UploadVariant,\n type UploadSize,\n type UploadShape,\n type UploadErrorType,\n type UploadAccept,\n type UploadAcceptType,\n type ChunkedUploadConfig,\n type ChunkProgress,\n type UploadChunk,\n UploadTriggerConfig,\n} from \"./types\";\nimport { uploadFile, splitFileIntoChunks, uploadChunk, checkUploadedChunks, mergeChunks } from \"./utils\";\nimport ButtonUpload from \"./components/ButtonUpload\";\nimport DraggerUpload from \"./components/DraggerUpload\";\nimport ImageUpload from \"./components/ImageUpload\";\nimport { FileList } from \"./components/FileList\";\nimport { cn } from \"../../lib/utils\";\n\n// 默认配置\nconst DEFAULT_OPTIONS: Partial<UploadConfig> = {\n mode: \"button\",\n autoUpload: true,\n showFileList: true,\n variant: \"default\",\n size: \"md\",\n shape: \"rounded\",\n method: \"post\",\n name: \"file\",\n};\n\n// 分片上传默认配置\nconst DEFAULT_CHUNKED_CONFIG: Required<ChunkedUploadConfig> = {\n chunked: false,\n chunkSize: 2 * 1024 * 1024, // 2MB\n chunkConcurrency: 0, // 0 表示根据文件大小自动计算\n resumable: false,\n chunkedUrl: \"\",\n mergeUrl: \"\",\n chunkThreshold: 5 * 1024 * 1024, // 5MB\n};\n\n/**\n * 根据文件大小计算合适的并发数\n * @param fileSize - 文件大小(字节)\n * @returns 建议的并发数\n */\nconst calculateConcurrency = (fileSize: number): number => {\n const mb = fileSize / 1024 / 1024;\n // 文件越大,并发数越高,但有上限\n // < 10MB: 2 并发\n // 10-50MB: 3 并发\n // 50-100MB: 4 并发\n // 100-500MB: 5 并发\n // > 500MB: 6 并发\n if (mb < 10) return 2;\n if (mb < 50) return 3;\n if (mb < 100) return 4;\n if (mb < 500) return 5;\n return 6;\n};\n\n/** 创建上传错误 */\nconst createUploadError = (\n type: UploadErrorType,\n message: string,\n file?: File,\n originalError?: Error\n): UploadError => ({\n type,\n message,\n file,\n originalError,\n});\n\n/**\n * 生成唯一文件 ID\n */\nconst generateFileId = () => Math.random().toString(36).substring(2, 11);\n\n/**\n * 上传组件\n */\nfunction Upload(config: UploadConfig) {\n // 合并配置\n const options: Required<UploadConfig> = {\n ...DEFAULT_OPTIONS,\n ...config,\n } as Required<UploadConfig>;\n\n // 解析分片上传配置\n const chunkedConfig: Required<ChunkedUploadConfig> = {\n ...DEFAULT_CHUNKED_CONFIG,\n ...config.chunkedConfig,\n };\n\n // 解构配置\n const {\n mode,\n autoUpload,\n showFileList,\n directory,\n accept,\n maxSize,\n minSize,\n maxCount,\n variant,\n size,\n shape,\n action,\n method,\n headers,\n data,\n name,\n onChange,\n onProgress,\n onSuccess,\n onError,\n onComplete,\n } = options;\n\n // 解构分片配置\n const {\n chunked,\n chunkSize,\n chunkConcurrency,\n resumable,\n chunkedUrl,\n mergeUrl,\n chunkThreshold,\n } = chunkedConfig;\n\n // 文件列表状态\n const [files, setFiles] = useState<UploadFile[]>([]);\n // 拖拽状态\n const [isDragging, setIsDragging] = useState(false);\n // 图片预览 URL\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n // 全局上传状态\n const [status, setStatus] = useState<UploadStatus>(\"idle\");\n // 全局进度\n const [progress, setProgress] = useState(0);\n // 分片进度追踪\n const [chunkProgress, setChunkProgress] = useState<Record<string, ChunkProgress>>({});\n\n // Refs\n const inputId = useId();\n const abortRef = useRef<AbortController | null>(null);\n const cancelRef = useRef(false);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // 计算当前状态\n const isDisabled = status === \"uploading\";\n const isUploading = status === \"uploading\";\n\n // 触发文件变化回调\n const notifyChange = useCallback((newFiles: UploadFile[]) => {\n onChange?.(newFiles);\n }, [onChange]);\n\n // 验证单个文件\n const validateFile = useCallback((file: File): UploadError | null => {\n // 文件大小验证\n if (maxSize && file.size > maxSize) {\n return createUploadError(\n \"FILE_SIZE_EXCEEDED\",\n `文件大小不能超过 ${Math.round(maxSize / 1024 / 1024)}MB`,\n file\n );\n }\n if (minSize && file.size < minSize) {\n return createUploadError(\n \"FILE_SIZE_EXCEEDED\",\n `文件大小不能小于 ${Math.round(minSize / 1024)}KB`,\n file\n );\n }\n return null;\n }, [maxSize, minSize]);\n\n // 验证文件列表\n const validateFiles = useCallback((newFiles: File[]): { valid: File[]; errors: UploadError[] } => {\n const valid: File[] = [];\n const errors: UploadError[] = [];\n\n // 文件数量验证\n if (maxCount && newFiles.length > maxCount) {\n const error = createUploadError(\n \"FILE_COUNT_EXCEEDED\",\n `最多只能上传 ${maxCount} 个文件`\n );\n errors.push(error);\n }\n\n // 逐个验证\n for (const file of newFiles) {\n const error = validateFile(file);\n if (error) {\n errors.push(error);\n } else {\n valid.push(file);\n }\n }\n\n return { valid, errors };\n }, [maxCount, validateFile]);\n\n // 上传单个文件(支持分片上传)\n const uploadSingleFile = async (\n fileItem: UploadFile,\n totalBytes: number,\n uploadedBytes: number\n ): Promise<UploadFile> => {\n const { file } = fileItem;\n\n // 创建 AbortController\n const controller = new AbortController();\n abortRef.current = controller;\n\n // 判断是否使用分片上传\n const useChunkedUpload = chunked && file.size > chunkThreshold;\n\n // 普通上传模式\n if (!useChunkedUpload) {\n return uploadWithNormalMode(\n fileItem,\n totalBytes,\n uploadedBytes,\n controller\n );\n }\n\n // 分片上传模式\n return uploadWithChunkedMode(\n fileItem,\n totalBytes,\n uploadedBytes,\n controller\n );\n };\n\n // 普通上传模式\n const uploadWithNormalMode = async (\n fileItem: UploadFile,\n totalBytes: number,\n uploadedBytes: number,\n controller: AbortController\n ): Promise<UploadFile> => {\n const { file } = fileItem;\n\n try {\n // 构建 FormData\n const formData = new FormData();\n formData.append(name, file);\n // 添加额外数据\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n formData.append(key, String(value));\n });\n }\n\n const responseText = await uploadFile({\n action,\n method,\n header: headers,\n signal: controller.signal,\n formData,\n onProgress: (event) => {\n if (!event.lengthComputable || file.size === 0) {\n return;\n }\n // 计算当前文件的进度\n const percent = Math.min(\n 100,\n Math.round((event.loaded / file.size) * 100)\n );\n // 更新全局进度(所有文件的累计)\n const currentTotalBytes = uploadedBytes + event.loaded;\n setProgress(\n Math.round((currentTotalBytes / totalBytes) * 100)\n );\n onProgress?.(percent, file);\n\n // 更新当前文件的进度\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id\n ? { ...f, progress: percent }\n : f\n )\n );\n },\n });\n\n // 上传成功\n const updatedFile: UploadFile = {\n ...fileItem,\n status: \"success\",\n progress: 100,\n response: responseText,\n };\n\n onSuccess?.(responseText, file);\n return updatedFile;\n } catch (event) {\n // 判断是否为取消\n const isAbort =\n cancelRef.current ||\n (event as DOMException)?.name === \"AbortError\";\n\n if (isAbort) {\n return { ...fileItem, status: \"idle\", progress: 0 };\n }\n\n // 上传失败\n const error = createUploadError(\n \"NETWORK_ERROR\",\n event instanceof Error ? event.message : \"上传失败\",\n file,\n event instanceof Error ? event : undefined\n );\n\n onError?.(error, file);\n return { ...fileItem, status: \"error\", error };\n }\n };\n\n // 分片上传模式\n const uploadWithChunkedMode = async (\n fileItem: UploadFile,\n totalBytes: number,\n uploadedBytes: number,\n controller: AbortController\n ): Promise<UploadFile> => {\n const { file } = fileItem;\n const fileId = fileItem.id;\n\n try {\n // 1. 如果启用断点续传,先检查已上传的分片\n // 断点续传的目的是:上传中断后,从上次断开的地方继续\n // 所以需要在分割文件之前检查,避免重复处理已上传的分片\n let uploadedChunkIndices: number[] = [];\n if (resumable && chunkedUrl) {\n uploadedChunkIndices = await checkUploadedChunks(\n chunkedUrl,\n file,\n chunkSize,\n headers\n );\n }\n\n // 2. 分割文件\n const chunks = splitFileIntoChunks(file, chunkSize);\n const totalChunks = chunks.length;\n\n // 计算实际使用的并发数\n // 如果用户没有设置(为0),则根据文件大小自动计算\n // 同时不能超过总分片数量\n const actualConcurrency =\n chunkConcurrency > 0\n ? Math.min(chunkConcurrency, totalChunks)\n : Math.min(calculateConcurrency(file.size), totalChunks);\n\n // 过滤出需要上传的分片\n const chunksToUpload = chunks.filter(\n (chunk) => !uploadedChunkIndices.includes(chunk.index)\n );\n\n // 3. 并行上传分片\n // 使用 ref 来追踪所有分片的进度(用于并行上传时的正确计算)\n const completedChunksRef = { current: uploadedChunkIndices.length };\n // 追踪每个分片的进度 (0-100)\n const chunkProgressMapRef = { current: new Map<number, number>() };\n\n // 创建分片任务\n const uploadTasks = chunksToUpload.map((chunk) => async () => {\n //\n if (cancelRef.current || controller.signal.aborted) {\n throw new DOMException(\"Upload aborted\", \"AbortError\");\n }\n\n // 在开始时记录这个分片的初始进度为0\n chunkProgressMapRef.current.set(chunk.index, 0);\n\n await uploadChunk({\n action,\n chunk: chunk.blob,\n chunkIndex: chunk.index,\n totalChunks,\n fileName: file.name,\n fileSize: file.size,\n method,\n headers,\n signal: controller.signal,\n onProgress: (event: ProgressEvent) => {\n if (!event.lengthComputable) {\n return;\n }\n\n const chunkLoaded = event.loaded;\n const chunkTotal = chunk.end - chunk.start;\n const chunkProgressPercent = Math.min(\n 100,\n Math.round((chunkLoaded / chunkTotal) * 100)\n );\n\n // 更新这个分片的进度\n chunkProgressMapRef.current.set(chunk.index, chunkProgressPercent);\n\n // 计算总进度:已完成的分片 + 所有正在上传的分片的进度\n const completedCount = completedChunksRef.current;\n let inProgressProgress = 0;\n chunkProgressMapRef.current.forEach((progress) => {\n inProgressProgress += progress;\n });\n\n // 进度 = (已完成分片数 * 100 + 正在上传分片的进度和) / 总分片数\n const totalProgress = Math.min(\n 100,\n Math.round(\n ((completedCount * 100) + inProgressProgress) / totalChunks\n )\n );\n\n setChunkProgress((prev) => ({\n ...prev,\n [fileId]: {\n chunkIndex: chunk.index,\n chunkProgress: chunkProgressPercent,\n totalProgress,\n uploadedChunks: completedCount,\n totalChunks,\n },\n }));\n\n setProgress(totalProgress);\n\n // 更新文件进度\n onProgress?.(totalProgress, file);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id\n ? { ...f, progress: totalProgress }\n : f\n )\n );\n },\n });\n\n // 分片上传完成后,增加已完成计数,并清除进度记录\n completedChunksRef.current++;\n chunkProgressMapRef.current.delete(chunk.index);\n return chunk.index;\n });\n\n // 控制并发数 - 使用更简单可靠的方式\n const executeWithConcurrency = async (\n tasks: (() => Promise<number>)[],\n limit: number\n ): Promise<number[]> => {\n const results: number[] = [];\n const executing: Promise<number>[] = [];\n let taskIndex = 0;\n\n const runTask = async (task: () => Promise<number>): Promise<number> => {\n const result = await task();\n return result;\n };\n\n while (taskIndex < tasks.length || executing.length > 0) {\n // 启动新任务直到达到限制\n while (taskIndex < tasks.length && executing.length < limit) {\n const task = tasks[taskIndex];\n taskIndex++;\n const promise = runTask(task).then((result) => {\n results.push(result);\n return result;\n });\n executing.push(promise);\n }\n\n // 等待至少一个任务完成\n if (executing.length > 0) {\n await Promise.race(executing);\n // 移除已完成的 promise\n const completedIndex = executing.findIndex(\n (p) => (p as Promise<number>).then !== undefined\n );\n if (completedIndex !== -1) {\n executing.splice(completedIndex, 1);\n }\n }\n }\n\n return results;\n };\n\n await executeWithConcurrency(uploadTasks, actualConcurrency);\n\n // 4. 合并分片\n let responseText = \"\";\n if (mergeUrl) {\n responseText = await mergeChunks(\n mergeUrl,\n file.name,\n totalChunks,\n method === \"get\" ? \"post\" : method,\n headers\n );\n }\n\n // 上传成功\n const updatedFile: UploadFile = {\n ...fileItem,\n status: \"success\",\n progress: 100,\n response: responseText || \"Chunked upload completed\",\n };\n\n // 清理分片进度\n setChunkProgress((prev) => {\n const newProgress = { ...prev };\n delete newProgress[fileId];\n return newProgress;\n });\n\n onSuccess?.(responseText || \"Chunked upload completed\", file);\n return updatedFile;\n } catch (event) {\n // 判断是否为取消\n const isAbort =\n cancelRef.current ||\n (event as DOMException)?.name === \"AbortError\";\n\n if (isAbort) {\n return { ...fileItem, status: \"idle\", progress: 0 };\n }\n\n // 上传失败\n const error = createUploadError(\n \"NETWORK_ERROR\",\n event instanceof Error ? event.message : \"分片上传失败\",\n file,\n event instanceof Error ? event : undefined\n );\n\n onError?.(error, file);\n return { ...fileItem, status: \"error\", error };\n }\n };\n\n // 上传文件核心逻辑\n const uploadFiles = useCallback(async (filesToUpload: UploadFile[]) => {\n // 无 action 或无文件,直接返回\n if (!action || filesToUpload.length === 0) {\n setStatus(\"idle\");\n setProgress(0);\n return;\n }\n\n // 非自动上传模式,不触发上传\n if (!autoUpload) {\n return;\n }\n\n cancelRef.current = false;\n abortRef.current?.abort();\n abortRef.current = null;\n\n setStatus(\"uploading\");\n setProgress(0);\n\n // 计算总大小\n const totalBytes = filesToUpload.reduce((sum, f) => sum + f.file.size, 0);\n let uploadedBytes = 0;\n\n const uploadedFiles: UploadFile[] = [];\n\n for (const fileItem of filesToUpload) {\n // 检查取消\n if (cancelRef.current) {\n setStatus(\"idle\");\n setProgress(0);\n return;\n }\n\n // 更新为上传中状态\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id ? { ...f, status: \"uploading\" as const } : f\n )\n );\n\n const result = await uploadSingleFile(fileItem, totalBytes, uploadedBytes);\n uploadedFiles.push(result);\n\n // 更新文件列表中的状态(包括 progress 确保显示 100%)\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id\n ? {\n ...f,\n status: result.status,\n response: result.response,\n progress: result.status === \"success\" ? 100 : f.progress,\n }\n : f\n )\n );\n\n if (result.status === \"success\") {\n uploadedBytes += fileItem.file.size;\n setProgress(\n totalBytes === 0\n ? 100\n : Math.round((uploadedBytes / totalBytes) * 100)\n );\n } else if (result.status === \"error\") {\n // 如果有错误,停止上传\n setStatus(\"error\");\n return;\n }\n }\n\n // 全部成功\n setStatus(\"success\");\n setProgress(100);\n onComplete?.(uploadedFiles);\n }, [action, autoUpload, headers, method, name, data, onComplete, onError, onProgress, onSuccess]);\n\n // 处理文件选择\n const handleFiles = useCallback((fileList: FileList | File[]) => {\n const newFiles = Array.from(fileList);\n\n // 验证\n const { valid, errors } = validateFiles(newFiles);\n\n // 触发错误回调\n errors.forEach((error) => {\n onError?.(error, error.file!);\n });\n\n if (valid.length === 0) {\n return;\n }\n\n // 创建文件项\n const fileItems: UploadFile[] = valid.map((file) => ({\n id: generateFileId(),\n file,\n status: \"idle\" as const,\n progress: 0,\n }));\n\n // 更新文件列表\n setFiles((prev) => {\n const newFileList = [...prev, ...fileItems];\n notifyChange(newFileList);\n return newFileList;\n });\n\n // 触发上传\n void uploadFiles(fileItems);\n }, [validateFiles, notifyChange, uploadFiles, onError]);\n\n // 处理输入变化\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files) {\n handleFiles(event.target.files);\n // 重置 input 以允许重复选择同一文件\n event.target.value = \"\";\n }\n };\n\n // 处理拖拽悬停\n const handleDragOver = (event: DragEvent<HTMLLabelElement>) => {\n event.preventDefault();\n setIsDragging(true);\n };\n\n // 处理拖拽离开\n const handleDragLeave = (event: DragEvent<HTMLLabelElement>) => {\n event.preventDefault();\n setIsDragging(false);\n };\n\n // 处理拖拽放下\n const handleDrop = (event: DragEvent<HTMLLabelElement>) => {\n event.preventDefault();\n setIsDragging(false);\n if (event.dataTransfer.files && event.dataTransfer.files.length > 0) {\n handleFiles(event.dataTransfer.files);\n event.dataTransfer.clearData();\n }\n };\n\n // 处理取消\n const handleCancel = useCallback(() => {\n if (status !== \"uploading\") {\n return;\n }\n cancelRef.current = true;\n abortRef.current?.abort();\n abortRef.current = null;\n setStatus(\"idle\");\n setProgress(0);\n setFiles([]);\n }, [status]);\n\n // 处理重置\n const handleReset = useCallback(() => {\n setFiles([]);\n setStatus(\"idle\");\n setProgress(0);\n setPreviewUrl(null);\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n notifyChange([]);\n }, [notifyChange]);\n\n // 处理删除文件\n const handleRemoveFile = useCallback((id: string) => {\n setFiles((prev) => {\n const newFiles = prev.filter((f) => f.id !== id);\n notifyChange(newFiles);\n return newFiles;\n });\n }, [notifyChange]);\n\n // 处理取消单个文件上传\n const handleCancelFile = useCallback((id: string) => {\n // 找到对应的文件并标记为取消\n setFiles((prev) =>\n prev.map((f) =>\n f.id === id ? { ...f, status: \"idle\" as const, progress: 0 } : f\n )\n );\n }, []);\n\n // 手动触发上传\n const triggerUpload = useCallback(() => {\n if (files.length > 0 && autoUpload === false) {\n const pendingFiles = files.filter((f) => f.status === \"idle\");\n if (pendingFiles.length > 0) {\n uploadFiles(pendingFiles);\n }\n }\n }, [files, autoUpload, uploadFiles]);\n\n // 图片预览\n useEffect(() => {\n if (mode !== \"image\") {\n setPreviewUrl(null);\n return;\n }\n\n const file = files[0]?.file;\n if (!file || !file.type.startsWith(\"image/\")) {\n setPreviewUrl(null);\n return;\n }\n\n const url = URL.createObjectURL(file);\n setPreviewUrl(url);\n\n return () => {\n URL.revokeObjectURL(url);\n };\n }, [files, mode]);\n\n // 构建 trigger props\n const triggerProps: UploadTriggerConfig = {\n inputId,\n variant,\n size,\n shape,\n className: cn(isDisabled && \"cursor-not-allowed opacity-80\"),\n status,\n progress,\n onCancel: handleCancel,\n onReset: handleReset,\n };\n\n // 渲染\n return (\n <div>\n {mode === \"button\" && <ButtonUpload {...triggerProps} />}\n {mode === \"image\" && (\n <ImageUpload {...triggerProps} previewUrl={previewUrl} />\n )}\n {mode === \"dragger\" && (\n <DraggerUpload\n {...triggerProps}\n isDragging={isDragging}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n />\n )}\n\n <input\n className=\"opacity-0 absolute\"\n disabled={isDisabled}\n id={inputId}\n ref={inputRef}\n type=\"file\"\n multiple={maxCount !== 1}\n accept={accept}\n // @ts-expect-error - webkitdirectory 是非标准但广泛支持的属性\n webkitdirectory={directory ? \"\" : undefined}\n onChange={handleInputChange}\n />\n\n {/* 文件列表 */}\n <FileList\n files={files}\n show={showFileList}\n onRemove={handleRemoveFile}\n onCancel={handleCancelFile}\n chunkProgressMap={chunkProgress}\n />\n </div>\n );\n}\n\nexport default Upload;\nexport type {\n UploadConfig,\n UploadFile,\n UploadError,\n UploadErrorType,\n UploadAccept,\n UploadAcceptType,\n ChunkedUploadConfig,\n ChunkProgress,\n UploadChunk,\n};\n"]}