mirror of
https://github.com/langgenius/dify.git
synced 2026-06-21 01:41:08 +08:00
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: hjlarry <hjlarry@163.com> Co-authored-by: fatelei <fatelei@gmail.com> Co-authored-by: Asuka Minato <i@asukaminato.eu.org> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com> Co-authored-by: gigglewang <gigglewang@dify.ai> Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai> Co-authored-by: chariri <w@chariri.moe> Co-authored-by: Evan <2869018789@qq.com> Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com>
125 lines
5.1 KiB
TypeScript
125 lines
5.1 KiB
TypeScript
import { cn } from '@langgenius/dify-ui/cn'
|
|
import { SkeletonContainer, SkeletonPoint, SkeletonRectangle, SkeletonRow } from '@/app/components/base/skeleton'
|
|
|
|
type ToolCardSkeletonGridProps = {
|
|
className?: string
|
|
count?: number
|
|
variant?: ToolCardSkeletonVariant
|
|
}
|
|
|
|
type ToolCardSkeletonVariant = 'default' | 'integrations-default' | 'integrations-labeled' | 'mcp'
|
|
|
|
const ToolCardSkeleton = () => (
|
|
<div className="relative overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg shadow-xs">
|
|
<div className="p-4 pb-3">
|
|
<div className="flex">
|
|
<SkeletonRectangle className="my-0 size-10 shrink-0 animate-pulse rounded-md" />
|
|
<div className="ml-3 w-0 grow">
|
|
<div className="flex h-5 items-center">
|
|
<SkeletonRectangle className="h-4 w-2/3 animate-pulse" />
|
|
</div>
|
|
<SkeletonRow className="mt-0.5 h-4">
|
|
<SkeletonRectangle className="w-[41px] animate-pulse" />
|
|
<SkeletonPoint />
|
|
<SkeletonRectangle className="w-1/3 animate-pulse" />
|
|
</SkeletonRow>
|
|
</div>
|
|
</div>
|
|
<SkeletonContainer className="mt-3 h-8 gap-0">
|
|
<SkeletonRectangle className="h-3 w-full animate-pulse" />
|
|
<SkeletonRectangle className="h-3 w-4/5 animate-pulse" />
|
|
</SkeletonContainer>
|
|
<div className="flex h-5 items-center gap-2">
|
|
<SkeletonRectangle className="h-3 w-12 animate-pulse" />
|
|
<SkeletonRectangle className="h-3 w-20 animate-pulse" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
|
|
const IntegrationsDefaultToolCardSkeleton = () => (
|
|
<div className="group/tool-provider relative flex min-w-[min(100%,496px)] flex-1 cursor-pointer flex-col overflow-hidden rounded-xl bg-background-section-burn p-[3px]">
|
|
<div className="relative flex w-full items-center gap-3 overflow-hidden rounded-[10px] border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-3">
|
|
<SkeletonRectangle className="size-10 shrink-0 animate-pulse rounded-lg" />
|
|
<div className="flex min-w-0 flex-1 flex-col gap-1 py-px">
|
|
<SkeletonRectangle className="h-4 w-2/5 animate-pulse" />
|
|
<SkeletonRectangle className="h-3 w-3/5 animate-pulse" />
|
|
</div>
|
|
</div>
|
|
<div className="flex h-[26px] w-full items-center gap-2 px-3 pt-1.5 pb-1">
|
|
<SkeletonRectangle className="h-3 w-20 animate-pulse" />
|
|
<SkeletonPoint />
|
|
<SkeletonRectangle className="h-3 w-24 animate-pulse" />
|
|
</div>
|
|
</div>
|
|
)
|
|
|
|
const IntegrationsLabeledToolCardSkeleton = () => (
|
|
<div className="relative flex min-w-0 flex-col overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg pb-3 shadow-xs">
|
|
<div className="flex w-full shrink-0 items-center gap-3 px-4 pt-4 pb-2">
|
|
<SkeletonRectangle className="size-10 shrink-0 animate-pulse rounded-lg" />
|
|
<div className="flex min-w-0 flex-1 flex-col gap-1 py-px">
|
|
<SkeletonRectangle className="h-4 w-2/5 animate-pulse" />
|
|
<SkeletonRectangle className="h-3 w-1/3 animate-pulse" />
|
|
</div>
|
|
</div>
|
|
<div className="w-full px-4 pt-1 pb-2">
|
|
<SkeletonContainer className="min-h-8 gap-0">
|
|
<SkeletonRectangle className="h-3 w-full animate-pulse" />
|
|
<SkeletonRectangle className="h-3 w-4/5 animate-pulse" />
|
|
</SkeletonContainer>
|
|
</div>
|
|
<div className="flex h-6 w-full shrink-0 items-center gap-2 px-4 py-1">
|
|
<SkeletonRectangle className="h-3 w-16 animate-pulse" />
|
|
<SkeletonRectangle className="h-3 w-20 animate-pulse" />
|
|
</div>
|
|
</div>
|
|
)
|
|
|
|
const MCPCardSkeleton = () => (
|
|
<div className="relative flex flex-col overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg shadow-xs">
|
|
<div className="flex shrink-0 items-center gap-3 rounded-t-xl p-4">
|
|
<SkeletonRectangle className="size-10 shrink-0 animate-pulse rounded-lg" />
|
|
<div className="min-w-0 grow">
|
|
<SkeletonRectangle className="mb-2 h-4 w-2/5 animate-pulse" />
|
|
<SkeletonRectangle className="h-3 w-3/5 animate-pulse" />
|
|
</div>
|
|
</div>
|
|
<div className="flex items-center gap-1 rounded-b-xl pt-1.5 pr-2.5 pb-2.5 pl-4">
|
|
<div className="flex w-0 grow items-center gap-2">
|
|
<SkeletonRectangle className="h-3 w-16 animate-pulse" />
|
|
<SkeletonPoint />
|
|
<SkeletonRectangle className="h-3 w-24 animate-pulse" />
|
|
</div>
|
|
<SkeletonRectangle className="h-5 w-20 shrink-0 animate-pulse rounded-md" />
|
|
</div>
|
|
</div>
|
|
)
|
|
|
|
const skeletonByVariant = {
|
|
'default': ToolCardSkeleton,
|
|
'integrations-default': IntegrationsDefaultToolCardSkeleton,
|
|
'integrations-labeled': IntegrationsLabeledToolCardSkeleton,
|
|
'mcp': MCPCardSkeleton,
|
|
}
|
|
|
|
const ToolCardSkeletonGrid = ({
|
|
className,
|
|
count = 6,
|
|
variant = 'default',
|
|
}: ToolCardSkeletonGridProps) => {
|
|
const Skeleton = skeletonByVariant[variant]
|
|
|
|
return (
|
|
<>
|
|
{Array.from({ length: count }, (_, index) => (
|
|
<div key={index} className={cn(className)}>
|
|
<Skeleton />
|
|
</div>
|
|
))}
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default ToolCardSkeletonGrid
|