mirror of
https://github.com/langgenius/dify.git
synced 2026-05-06 10:28:10 +08:00
Merge remote-tracking branch 'origin/main' into feat/support-agent-sandbox
This commit is contained in:
@ -48,7 +48,7 @@ const Item: FC<ItemProps> = ({ node, onSelect, isHighlighted, onSetHighlight, re
|
||||
size="xs"
|
||||
/>
|
||||
<span
|
||||
className="system-sm-medium truncate text-text-secondary"
|
||||
className="truncate text-text-secondary system-sm-medium"
|
||||
title={node.title}
|
||||
>
|
||||
{node.title}
|
||||
|
||||
@ -32,9 +32,9 @@ const BoolInput: FC<Props> = ({
|
||||
onCheck={handleChange}
|
||||
disabled={readonly}
|
||||
/>
|
||||
<div className="system-sm-medium flex items-center gap-1 text-text-secondary">
|
||||
<div className="flex items-center gap-1 text-text-secondary system-sm-medium">
|
||||
{name}
|
||||
{!required && <span className="system-xs-regular text-text-tertiary">{t('panel.optional', { ns: 'workflow' })}</span>}
|
||||
{!required && <span className="text-text-tertiary system-xs-regular">{t('panel.optional', { ns: 'workflow' })}</span>}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
@ -124,19 +124,19 @@ const FormItem: FC<Props> = ({
|
||||
return (
|
||||
<div className={cn(className)}>
|
||||
{!isArrayLikeType && !isBooleanType && (
|
||||
<div className="system-sm-semibold mb-1 flex h-6 items-center gap-1 text-text-secondary">
|
||||
<div className="mb-1 flex h-6 items-center gap-1 text-text-secondary system-sm-semibold">
|
||||
<div className="truncate">
|
||||
{typeof payload.label === 'object' ? nodeKey : payload.label}
|
||||
</div>
|
||||
{payload.hide === true
|
||||
? (
|
||||
<span className="system-xs-regular text-text-tertiary">
|
||||
<span className="text-text-tertiary system-xs-regular">
|
||||
{t('panel.optional_and_hidden', { ns: 'workflow' })}
|
||||
</span>
|
||||
)
|
||||
: (
|
||||
!payload.required && (
|
||||
<span className="system-xs-regular text-text-tertiary">
|
||||
<span className="text-text-tertiary system-xs-regular">
|
||||
{t('panel.optional', { ns: 'workflow' })}
|
||||
</span>
|
||||
)
|
||||
|
||||
@ -79,7 +79,7 @@ const Form: FC<Props> = ({
|
||||
<div className={cn(className, 'space-y-2')}>
|
||||
{label && (
|
||||
<div className="mb-1 flex items-center justify-between">
|
||||
<div className="system-xs-medium-uppercase flex h-6 items-center text-text-tertiary">{label}</div>
|
||||
<div className="flex h-6 items-center text-text-tertiary system-xs-medium-uppercase">{label}</div>
|
||||
{isArrayLikeType && !isIteratorItemFile && (
|
||||
<AddButton onClick={handleAddContext} />
|
||||
)}
|
||||
|
||||
@ -22,7 +22,7 @@ const FieldCollapse = ({
|
||||
<div className="py-4">
|
||||
<Collapse
|
||||
trigger={
|
||||
<div className="system-sm-semibold-uppercase flex h-6 cursor-pointer items-center text-text-secondary">{title}</div>
|
||||
<div className="flex h-6 cursor-pointer items-center text-text-secondary system-sm-semibold-uppercase">{title}</div>
|
||||
}
|
||||
operations={operations}
|
||||
collapsed={collapsed}
|
||||
|
||||
@ -86,7 +86,7 @@ const Base: FC<Props> = ({
|
||||
<Wrap className={cn(wrapClassName)} style={wrapStyle} isInNode={isInNode} isExpand={isExpand}>
|
||||
<div ref={ref} className={cn(className, isExpand && 'h-full', 'rounded-lg border', !isFocus ? 'border-transparent bg-components-input-bg-normal' : 'overflow-hidden border-components-input-border-hover bg-components-input-bg-hover')}>
|
||||
<div className="flex h-7 items-center justify-between pl-3 pr-2 pt-1">
|
||||
<div className="system-xs-semibold-uppercase text-text-secondary">{title}</div>
|
||||
<div className="text-text-secondary system-xs-semibold-uppercase">{title}</div>
|
||||
<div
|
||||
className="flex items-center"
|
||||
onClick={(e) => {
|
||||
|
||||
@ -30,7 +30,7 @@ const DefaultValue = ({
|
||||
|
||||
return (
|
||||
<div className="px-4 pt-2">
|
||||
<div className="body-xs-regular mb-2 text-text-tertiary">
|
||||
<div className="mb-2 text-text-tertiary body-xs-regular">
|
||||
{t('nodes.common.errorHandle.defaultValue.desc', { ns: 'workflow' })}
|
||||
|
||||
</div>
|
||||
@ -43,8 +43,8 @@ const DefaultValue = ({
|
||||
className="py-1"
|
||||
>
|
||||
<div className="mb-1 flex items-center">
|
||||
<div className="system-sm-medium mr-1 text-text-primary">{form.key}</div>
|
||||
<div className="system-xs-regular text-text-tertiary">{form.type}</div>
|
||||
<div className="mr-1 text-text-primary system-sm-medium">{form.key}</div>
|
||||
<div className="text-text-tertiary system-xs-regular">{form.type}</div>
|
||||
</div>
|
||||
{
|
||||
(form.type === VarType.string || form.type === VarType.number) && (
|
||||
|
||||
@ -31,11 +31,11 @@ const ErrorHandleOnNode = ({
|
||||
data._runningStatus === NodeRunningStatus.Exception && 'border-[0.5px] border-components-badge-status-light-warning-halo bg-state-warning-hover',
|
||||
)}
|
||||
>
|
||||
<div className="system-xs-medium-uppercase text-text-tertiary">
|
||||
<div className="text-text-tertiary system-xs-medium-uppercase">
|
||||
{t('common.onFailure', { ns: 'workflow' })}
|
||||
</div>
|
||||
<div className={cn(
|
||||
'system-xs-medium text-text-secondary',
|
||||
'text-text-secondary system-xs-medium',
|
||||
data._runningStatus === NodeRunningStatus.Exception && 'text-text-warning',
|
||||
)}
|
||||
>
|
||||
|
||||
@ -54,7 +54,7 @@ const ErrorHandle = ({
|
||||
collapseIcon => (
|
||||
<div className="flex grow items-center justify-between pr-4">
|
||||
<div className="flex items-center">
|
||||
<div className="system-sm-semibold-uppercase mr-0.5 text-text-secondary">
|
||||
<div className="mr-0.5 text-text-secondary system-sm-semibold-uppercase">
|
||||
{t('nodes.common.errorHandle.title', { ns: 'workflow' })}
|
||||
</div>
|
||||
<Tooltip popupContent={t('nodes.common.errorHandle.tip', { ns: 'workflow' })} />
|
||||
|
||||
@ -34,7 +34,7 @@ const ErrorHandleTip = ({
|
||||
>
|
||||
</div>
|
||||
<RiAlertFill className="mr-1 h-4 w-4 shrink-0 text-text-warning-secondary" />
|
||||
<div className="system-xs-medium grow text-text-primary">
|
||||
<div className="grow text-text-primary system-xs-medium">
|
||||
{text}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -83,8 +83,8 @@ const ErrorHandleTypeSelector = ({
|
||||
}
|
||||
</div>
|
||||
<div className="grow">
|
||||
<div className="system-sm-semibold mb-0.5 text-text-secondary">{option.label}</div>
|
||||
<div className="system-xs-regular text-text-tertiary">{option.description}</div>
|
||||
<div className="mb-0.5 text-text-secondary system-sm-semibold">{option.label}</div>
|
||||
<div className="text-text-tertiary system-xs-regular">{option.description}</div>
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
|
||||
@ -12,10 +12,10 @@ const FailBranchCard = () => {
|
||||
<div className="mb-2 flex h-8 w-8 items-center justify-center rounded-[10px] border-[0.5px] border-components-card-border bg-components-card-bg shadow-lg">
|
||||
<RiMindMap className="h-5 w-5 text-text-tertiary" />
|
||||
</div>
|
||||
<div className="system-sm-medium mb-1 text-text-secondary">
|
||||
<div className="mb-1 text-text-secondary system-sm-medium">
|
||||
{t('nodes.common.errorHandle.failBranch.customize', { ns: 'workflow' })}
|
||||
</div>
|
||||
<div className="system-xs-regular text-text-tertiary">
|
||||
<div className="text-text-tertiary system-xs-regular">
|
||||
{t('nodes.common.errorHandle.failBranch.customizeTip', { ns: 'workflow' })}
|
||||
|
||||
<a
|
||||
|
||||
@ -41,7 +41,7 @@ const Field: FC<Props> = ({
|
||||
className={cn('flex items-center justify-between', supportFold && 'cursor-pointer')}
|
||||
>
|
||||
<div className="flex h-6 items-center">
|
||||
<div className={cn(isSubTitle ? 'system-xs-medium-uppercase text-text-tertiary' : 'system-sm-semibold-uppercase text-text-secondary')}>
|
||||
<div className={cn(isSubTitle ? 'text-text-tertiary system-xs-medium-uppercase' : 'text-text-secondary system-sm-semibold-uppercase')}>
|
||||
{title}
|
||||
{' '}
|
||||
{required && <span className="text-text-destructive">*</span>}
|
||||
|
||||
@ -49,7 +49,7 @@ const FileTypeItem: FC<Props> = ({
|
||||
<div>
|
||||
<div className="flex items-center border-b border-divider-subtle p-3 pb-2">
|
||||
<FileTypeIcon className="shrink-0" type={type} size="lg" />
|
||||
<div className="system-sm-medium mx-2 grow text-text-primary">{t(`variableConfig.file.${type}.name`, { ns: 'appDebug' })}</div>
|
||||
<div className="mx-2 grow text-text-primary system-sm-medium">{t(`variableConfig.file.${type}.name`, { ns: 'appDebug' })}</div>
|
||||
<Checkbox className="shrink-0" checked={selected} />
|
||||
</div>
|
||||
<div className="p-3" onClick={e => e.stopPropagation()}>
|
||||
@ -65,8 +65,8 @@ const FileTypeItem: FC<Props> = ({
|
||||
<div className="flex items-center">
|
||||
<FileTypeIcon className="shrink-0" type={type} size="lg" />
|
||||
<div className="mx-2 grow">
|
||||
<div className="system-sm-medium text-text-primary">{t(`variableConfig.file.${type}.name`, { ns: 'appDebug' })}</div>
|
||||
<div className="system-2xs-regular-uppercase mt-1 text-text-tertiary">{type !== SupportUploadFileTypes.custom ? FILE_EXTS[type].join(', ') : t('variableConfig.file.custom.description', { ns: 'appDebug' })}</div>
|
||||
<div className="text-text-primary system-sm-medium">{t(`variableConfig.file.${type}.name`, { ns: 'appDebug' })}</div>
|
||||
<div className="mt-1 text-text-tertiary system-2xs-regular-uppercase">{type !== SupportUploadFileTypes.custom ? FILE_EXTS[type].join(', ') : t('variableConfig.file.custom.description', { ns: 'appDebug' })}</div>
|
||||
</div>
|
||||
<Checkbox className="shrink-0" checked={selected} />
|
||||
</div>
|
||||
|
||||
@ -150,7 +150,7 @@ const FileUploadSetting: FC<Props> = ({
|
||||
title={t('variableConfig.maxNumberOfUploads', { ns: 'appDebug' })!}
|
||||
>
|
||||
<div>
|
||||
<div className="body-xs-regular mb-1.5 text-text-tertiary">
|
||||
<div className="mb-1.5 text-text-tertiary body-xs-regular">
|
||||
{t('variableConfig.maxNumberTip', {
|
||||
ns: 'appDebug',
|
||||
imgLimit: formatFileSize(imgSizeLimit),
|
||||
|
||||
@ -15,9 +15,9 @@ const FormInputBoolean: FC<Props> = ({
|
||||
<div className="flex w-full space-x-1">
|
||||
<div
|
||||
className={cn(
|
||||
'system-sm-regular flex h-8 grow cursor-default items-center justify-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary',
|
||||
'flex h-8 grow cursor-default items-center justify-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary system-sm-regular',
|
||||
!value && 'cursor-pointer hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
|
||||
value && 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs',
|
||||
value && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs system-sm-medium',
|
||||
)}
|
||||
onClick={() => onChange(true)}
|
||||
>
|
||||
@ -25,9 +25,9 @@ const FormInputBoolean: FC<Props> = ({
|
||||
</div>
|
||||
<div
|
||||
className={cn(
|
||||
'system-sm-regular flex h-8 grow cursor-default items-center justify-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary',
|
||||
'flex h-8 grow cursor-default items-center justify-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary system-sm-regular',
|
||||
value && 'cursor-pointer hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
|
||||
!value && 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs',
|
||||
!value && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs system-sm-medium',
|
||||
)}
|
||||
onClick={() => onChange(false)}
|
||||
>
|
||||
|
||||
@ -529,7 +529,7 @@ const FormInputItem: FC<Props> = ({
|
||||
>
|
||||
<div className="group/simple-select relative h-8 grow">
|
||||
<ListboxButton className="flex h-full w-full cursor-pointer items-center rounded-lg border-0 bg-components-input-bg-normal pl-3 pr-10 focus-visible:bg-state-base-hover-alt focus-visible:outline-none group-hover/simple-select:bg-state-base-hover-alt sm:text-sm sm:leading-6">
|
||||
<span className={cn('system-sm-regular block truncate text-left', varInput?.value?.length > 0 ? 'text-components-input-text-filled' : 'text-components-input-text-placeholder')}>
|
||||
<span className={cn('block truncate text-left system-sm-regular', varInput?.value?.length > 0 ? 'text-components-input-text-filled' : 'text-components-input-text-placeholder')}>
|
||||
{getSelectedLabels(varInput?.value) || placeholder?.[language] || placeholder?.en_US || 'Select options'}
|
||||
</span>
|
||||
<span className="absolute inset-y-0 right-0 flex items-center pr-2">
|
||||
@ -610,7 +610,7 @@ const FormInputItem: FC<Props> = ({
|
||||
>
|
||||
<div className="group/simple-select relative h-8 grow">
|
||||
<ListboxButton className="flex h-full w-full cursor-pointer items-center rounded-lg border-0 bg-components-input-bg-normal pl-3 pr-10 focus-visible:bg-state-base-hover-alt focus-visible:outline-none group-hover/simple-select:bg-state-base-hover-alt sm:text-sm sm:leading-6">
|
||||
<span className={cn('system-sm-regular block truncate text-left', isLoadingOptions
|
||||
<span className={cn('block truncate text-left system-sm-regular', isLoadingOptions
|
||||
? 'text-components-input-text-placeholder'
|
||||
: varInput?.value?.length > 0 ? 'text-components-input-text-filled' : 'text-components-input-text-placeholder')}
|
||||
>
|
||||
|
||||
@ -6,7 +6,7 @@ export type GroupLabelProps = ComponentProps<'div'>
|
||||
export const GroupLabel: FC<GroupLabelProps> = (props) => {
|
||||
const { children, className, ...rest } = props
|
||||
return (
|
||||
<div {...rest} className={cn('system-2xs-medium-uppercase mb-1 text-text-tertiary', className)}>
|
||||
<div {...rest} className={cn('mb-1 text-text-tertiary system-2xs-medium-uppercase', className)}>
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
|
||||
@ -14,10 +14,10 @@ const InfoPanel: FC<Props> = ({
|
||||
return (
|
||||
<div>
|
||||
<div className="flex flex-col gap-y-0.5 rounded-md bg-workflow-block-parma-bg px-[5px] py-[3px]">
|
||||
<div className="system-2xs-semibold-uppercase uppercase text-text-secondary">
|
||||
<div className="uppercase text-text-secondary system-2xs-semibold-uppercase">
|
||||
{title}
|
||||
</div>
|
||||
<div className="system-xs-regular break-words text-text-tertiary">
|
||||
<div className="break-words text-text-tertiary system-xs-regular">
|
||||
{content}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -43,7 +43,7 @@ export const FieldTitle = memo(({
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div className="system-sm-semibold-uppercase flex items-center text-text-secondary">
|
||||
<div className="flex items-center text-text-secondary system-sm-semibold-uppercase">
|
||||
{title}
|
||||
{
|
||||
showArrow && (
|
||||
|
||||
@ -10,7 +10,7 @@ const ListNoDataPlaceholder: FC<Props> = ({
|
||||
children,
|
||||
}) => {
|
||||
return (
|
||||
<div className="system-xs-regular flex min-h-[42px] w-full items-center justify-center rounded-[10px] bg-background-section text-text-tertiary">
|
||||
<div className="flex min-h-[42px] w-full items-center justify-center rounded-[10px] bg-background-section text-text-tertiary system-xs-regular">
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
|
||||
@ -154,7 +154,7 @@ const MemoryConfig: FC<Props> = ({
|
||||
size="md"
|
||||
disabled={readonly}
|
||||
/>
|
||||
<div className="system-xs-medium-uppercase text-text-tertiary">{t(`${i18nPrefix}.windowSize`, { ns: 'workflow' })}</div>
|
||||
<div className="text-text-tertiary system-xs-medium-uppercase">{t(`${i18nPrefix}.windowSize`, { ns: 'workflow' })}</div>
|
||||
</div>
|
||||
<div className="flex h-8 items-center space-x-2">
|
||||
<Slider
|
||||
|
||||
@ -27,9 +27,9 @@ const Placeholder = () => {
|
||||
>
|
||||
<div className="flex grow items-center">
|
||||
{t('nodes.tool.insertPlaceholder1', { ns: 'workflow' })}
|
||||
<div className="system-kbd mx-0.5 flex h-4 w-4 items-center justify-center rounded bg-components-kbd-bg-gray text-text-placeholder">/</div>
|
||||
<div className="mx-0.5 flex h-4 w-4 items-center justify-center rounded bg-components-kbd-bg-gray text-text-placeholder system-kbd">/</div>
|
||||
<div
|
||||
className="system-sm-regular cursor-pointer text-components-input-text-placeholder underline decoration-dotted decoration-auto underline-offset-auto hover:text-text-tertiary"
|
||||
className="cursor-pointer text-components-input-text-placeholder underline decoration-dotted decoration-auto underline-offset-auto system-sm-regular hover:text-text-tertiary"
|
||||
onMouseDown={((e) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
|
||||
@ -33,7 +33,7 @@ const Container = ({
|
||||
branchName && (
|
||||
<div
|
||||
className={cn(
|
||||
'system-2xs-semibold-uppercase flex items-center truncate px-2 text-text-tertiary',
|
||||
'flex items-center truncate px-2 text-text-tertiary system-2xs-semibold-uppercase',
|
||||
isFailBranch && 'text-text-warning',
|
||||
)}
|
||||
title={branchName}
|
||||
|
||||
@ -47,7 +47,7 @@ const Item = ({
|
||||
className="mr-1.5 shrink-0"
|
||||
/>
|
||||
<div
|
||||
className="system-xs-medium grow truncate text-text-secondary"
|
||||
className="grow truncate text-text-secondary system-xs-medium"
|
||||
title={data.title}
|
||||
>
|
||||
{data.title}
|
||||
|
||||
@ -98,7 +98,7 @@ const Operator = ({
|
||||
</Button>
|
||||
</PortalToFollowElemTrigger>
|
||||
<PortalToFollowElemContent className="z-10">
|
||||
<div className="system-md-regular min-w-[120px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur text-text-secondary shadow-lg">
|
||||
<div className="min-w-[120px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur text-text-secondary shadow-lg system-md-regular">
|
||||
<div className="p-1">
|
||||
<ChangeItem
|
||||
data={data}
|
||||
|
||||
@ -208,13 +208,13 @@ export const NodeSourceHandle = memo(({
|
||||
onClick={allowGraphActions ? handleHandleClick : undefined}
|
||||
>
|
||||
<div className="absolute -top-1 left-1/2 hidden -translate-x-1/2 -translate-y-full rounded-lg border-[0.5px] border-components-panel-border bg-components-tooltip-bg p-1.5 shadow-lg group-hover/handle:block">
|
||||
<div className="system-xs-regular text-text-tertiary">
|
||||
<div className="text-text-tertiary system-xs-regular">
|
||||
<div className="whitespace-nowrap">
|
||||
<span className="system-xs-medium text-text-secondary">{t('common.parallelTip.click.title', { ns: 'workflow' })}</span>
|
||||
<span className="text-text-secondary system-xs-medium">{t('common.parallelTip.click.title', { ns: 'workflow' })}</span>
|
||||
{t('common.parallelTip.click.desc', { ns: 'workflow' })}
|
||||
</div>
|
||||
<div>
|
||||
<span className="system-xs-medium text-text-secondary">{t('common.parallelTip.drag.title', { ns: 'workflow' })}</span>
|
||||
<span className="text-text-secondary system-xs-medium">{t('common.parallelTip.drag.title', { ns: 'workflow' })}</span>
|
||||
{t('common.parallelTip.drag.desc', { ns: 'workflow' })}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -48,9 +48,9 @@ const OptionCard: FC<Props> = ({
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'system-sm-regular flex h-8 cursor-default items-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary',
|
||||
'flex h-8 cursor-default items-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary system-sm-regular',
|
||||
(!selected && !disabled) && 'cursor-pointer hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
|
||||
selected && 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs',
|
||||
selected && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs system-sm-medium',
|
||||
disabled && 'text-text-disabled',
|
||||
variants({ align }),
|
||||
className,
|
||||
|
||||
@ -59,11 +59,11 @@ export const VarItem: FC<VarItemProps> = ({
|
||||
<div className="py-1">
|
||||
<div className="flex">
|
||||
<div className="flex items-center leading-[18px]">
|
||||
<div className="code-sm-semibold text-text-secondary">{name}</div>
|
||||
<div className="system-xs-regular ml-2 text-text-tertiary">{type}</div>
|
||||
<div className="text-text-secondary code-sm-semibold">{name}</div>
|
||||
<div className="ml-2 text-text-tertiary system-xs-regular">{type}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="system-xs-regular mt-0.5 text-text-tertiary">
|
||||
<div className="mt-0.5 text-text-tertiary system-xs-regular">
|
||||
{description}
|
||||
{subItems && (
|
||||
<div className="ml-2 border-l border-gray-200 pl-2">
|
||||
|
||||
@ -40,7 +40,7 @@ const RetryOnNode = ({
|
||||
return (
|
||||
<div className="mb-1 px-3">
|
||||
<div className={cn(
|
||||
'system-xs-medium-uppercase flex items-center justify-between rounded-md border-[0.5px] border-transparent bg-workflow-block-parma-bg px-[5px] py-1 text-text-tertiary',
|
||||
'flex items-center justify-between rounded-md border-[0.5px] border-transparent bg-workflow-block-parma-bg px-[5px] py-1 text-text-tertiary system-xs-medium-uppercase',
|
||||
isRunning && 'border-state-accent-active bg-state-accent-hover text-text-accent',
|
||||
isSuccessful && 'border-state-success-active bg-state-success-hover text-text-success',
|
||||
(isException || isFailed) && 'border-state-warning-active bg-state-warning-hover text-text-warning',
|
||||
|
||||
@ -55,7 +55,7 @@ const RetryOnPanel = ({
|
||||
<div className="pt-2">
|
||||
<div className="flex h-10 items-center justify-between px-4 py-2">
|
||||
<div className="flex items-center">
|
||||
<div className="system-sm-semibold-uppercase mr-0.5 text-text-secondary">{t('nodes.common.retry.retryOnFailure', { ns: 'workflow' })}</div>
|
||||
<div className="mr-0.5 text-text-secondary system-sm-semibold-uppercase">{t('nodes.common.retry.retryOnFailure', { ns: 'workflow' })}</div>
|
||||
</div>
|
||||
<Switch
|
||||
defaultValue={retry_config?.retry_enabled}
|
||||
@ -66,7 +66,7 @@ const RetryOnPanel = ({
|
||||
retry_config?.retry_enabled && (
|
||||
<div className="px-4 pb-2">
|
||||
<div className="mb-1 flex w-full items-center">
|
||||
<div className="system-xs-medium-uppercase mr-2 grow text-text-secondary">{t('nodes.common.retry.maxRetries', { ns: 'workflow' })}</div>
|
||||
<div className="mr-2 grow text-text-secondary system-xs-medium-uppercase">{t('nodes.common.retry.maxRetries', { ns: 'workflow' })}</div>
|
||||
<Slider
|
||||
className="mr-3 w-[108px]"
|
||||
value={retry_config?.max_retries || 3}
|
||||
@ -87,7 +87,7 @@ const RetryOnPanel = ({
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<div className="system-xs-medium-uppercase mr-2 grow text-text-secondary">{t('nodes.common.retry.retryInterval', { ns: 'workflow' })}</div>
|
||||
<div className="mr-2 grow text-text-secondary system-xs-medium-uppercase">{t('nodes.common.retry.retryInterval', { ns: 'workflow' })}</div>
|
||||
<Slider
|
||||
className="mr-3 w-[108px]"
|
||||
value={retry_config?.retry_interval || 1000}
|
||||
|
||||
@ -15,11 +15,11 @@ export const SettingItem = memo(({ label, children, status, tooltip }: SettingIt
|
||||
const needTooltip = ['error', 'warning'].includes(status as any)
|
||||
return (
|
||||
<div className="relative flex items-center justify-between space-x-1 rounded-md bg-workflow-block-parma-bg px-1.5 py-1 text-xs font-normal">
|
||||
<div className={cn('system-xs-medium-uppercase max-w-full shrink-0 truncate text-text-tertiary', !!children && 'max-w-[100px]')}>
|
||||
<div className={cn('max-w-full shrink-0 truncate text-text-tertiary system-xs-medium-uppercase', !!children && 'max-w-[100px]')}>
|
||||
{label}
|
||||
</div>
|
||||
<Tooltip popupContent={tooltip} disabled={!needTooltip}>
|
||||
<div className="system-xs-medium truncate text-right text-text-secondary">
|
||||
<div className="truncate text-right text-text-secondary system-xs-medium">
|
||||
{children}
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
@ -96,7 +96,7 @@ export const SwitchPluginVersion: FC<SwitchPluginVersionProps> = (props) => {
|
||||
href={getMarketplaceUrl(`/plugins/${pluginDetail.declaration.author}/${pluginDetail.declaration.name}`)}
|
||||
target="_blank"
|
||||
>
|
||||
<span className="system-xs-regular text-xs text-text-accent">
|
||||
<span className="text-xs text-text-accent system-xs-regular">
|
||||
{t('nodes.agent.installPlugin.changelog', { ns: 'workflow' })}
|
||||
</span>
|
||||
<RiExternalLinkLine className="size-3 text-text-accent" />
|
||||
|
||||
@ -53,8 +53,8 @@ export const TitleInput = memo(({
|
||||
onChange={handleChange}
|
||||
onKeyDown={handleKeyDown}
|
||||
className={`
|
||||
system-xl-semibold mr-2 h-7 min-w-0 grow appearance-none rounded-md border border-transparent bg-transparent px-1 text-text-primary
|
||||
outline-none focus:shadow-xs
|
||||
mr-2 h-7 min-w-0 grow appearance-none rounded-md border border-transparent bg-transparent px-1 text-text-primary outline-none
|
||||
system-xl-semibold focus:shadow-xs
|
||||
`}
|
||||
placeholder={t('common.addTitle', { ns: 'workflow' }) || ''}
|
||||
onBlur={handleBlur}
|
||||
|
||||
@ -18,7 +18,7 @@ const ManageInputField = ({
|
||||
>
|
||||
<RiAddLine className="mr-1 h-4 w-4 text-text-tertiary" />
|
||||
<div
|
||||
className="system-xs-medium truncate text-text-tertiary"
|
||||
className="truncate text-text-tertiary system-xs-medium"
|
||||
title="Create user input field"
|
||||
>
|
||||
{t('inputField.create', { ns: 'pipeline' })}
|
||||
@ -26,7 +26,7 @@ const ManageInputField = ({
|
||||
</div>
|
||||
<div className="mx-1 h-3 w-[1px] shrink-0 bg-divider-regular"></div>
|
||||
<div
|
||||
className="system-xs-medium flex h-8 shrink-0 cursor-pointer items-center justify-center px-3 text-text-tertiary"
|
||||
className="flex h-8 shrink-0 cursor-pointer items-center justify-center px-3 text-text-tertiary system-xs-medium"
|
||||
onClick={onManage}
|
||||
>
|
||||
{t('inputField.manage', { ns: 'pipeline' })}
|
||||
|
||||
@ -49,11 +49,11 @@ const Field: FC<Props> = ({
|
||||
? (
|
||||
<RiMoreFill className="h-3 w-3 text-text-tertiary" />
|
||||
)
|
||||
: (<div className={cn('system-sm-medium h-6 w-0 grow truncate leading-6 text-text-secondary', isHighlight && 'text-text-accent')}>{name}</div>)}
|
||||
: (<div className={cn('h-6 w-0 grow truncate leading-6 text-text-secondary system-sm-medium', isHighlight && 'text-text-accent')}>{name}</div>)}
|
||||
|
||||
</div>
|
||||
{depth < MAX_DEPTH + 1 && (
|
||||
<div className="system-xs-regular ml-2 shrink-0 text-text-tertiary">{getFieldType(payload)}</div>
|
||||
<div className="ml-2 shrink-0 text-text-tertiary system-xs-regular">{getFieldType(payload)}</div>
|
||||
)}
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
@ -47,13 +47,13 @@ export const PickerPanelMain: FC<Props> = ({
|
||||
<div className="flex">
|
||||
{root.nodeName && (
|
||||
<>
|
||||
<div className="system-sm-medium max-w-[100px] truncate text-text-tertiary">{root.nodeName}</div>
|
||||
<div className="system-sm-medium text-text-tertiary">.</div>
|
||||
<div className="max-w-[100px] truncate text-text-tertiary system-sm-medium">{root.nodeName}</div>
|
||||
<div className="text-text-tertiary system-sm-medium">.</div>
|
||||
</>
|
||||
)}
|
||||
<div className="system-sm-medium text-text-secondary">{root.attrName}</div>
|
||||
<div className="text-text-secondary system-sm-medium">{root.attrName}</div>
|
||||
</div>
|
||||
<div className="system-xs-regular ml-2 truncate text-text-tertiary" title={root.attrAlias || 'object'}>{root.attrAlias || 'object'}</div>
|
||||
<div className="ml-2 truncate text-text-tertiary system-xs-regular" title={root.attrAlias || 'object'}>{root.attrAlias || 'object'}</div>
|
||||
</div>
|
||||
{fieldNames.map(name => (
|
||||
<Field
|
||||
|
||||
@ -44,21 +44,21 @@ const Field: FC<Props> = ({
|
||||
onClick={toggleFold}
|
||||
/>
|
||||
)}
|
||||
<div className={cn('system-sm-medium ml-[7px] h-6 truncate leading-6 text-text-secondary', isRoot && rootClassName)}>{name}</div>
|
||||
<div className="system-xs-regular ml-3 shrink-0 leading-6 text-text-tertiary">
|
||||
<div className={cn('ml-[7px] h-6 truncate leading-6 text-text-secondary system-sm-medium', isRoot && rootClassName)}>{name}</div>
|
||||
<div className="ml-3 shrink-0 leading-6 text-text-tertiary system-xs-regular">
|
||||
{getFieldType(payload)}
|
||||
{(payload.schemaType && payload.schemaType !== 'file' && ` (${payload.schemaType})`)}
|
||||
</div>
|
||||
{required && <div className="system-2xs-medium-uppercase ml-3 leading-6 text-text-warning">{t('structOutput.required', { ns: 'app' })}</div>}
|
||||
{required && <div className="ml-3 leading-6 text-text-warning system-2xs-medium-uppercase">{t('structOutput.required', { ns: 'app' })}</div>}
|
||||
</div>
|
||||
{payload.description && (
|
||||
<div className="ml-[7px] flex">
|
||||
<div className="system-xs-regular w-0 grow truncate text-text-tertiary">{payload.description}</div>
|
||||
<div className="w-0 grow truncate text-text-tertiary system-xs-regular">{payload.description}</div>
|
||||
</div>
|
||||
)}
|
||||
{hasEnum && (
|
||||
<div className="ml-[7px] flex">
|
||||
<div className="system-xs-regular w-0 grow text-text-quaternary">
|
||||
<div className="w-0 grow text-text-quaternary system-xs-regular">
|
||||
{payload.enum!.map((value, index) => (
|
||||
<span key={index}>
|
||||
{typeof value === 'string' ? `"${value}"` : value}
|
||||
|
||||
@ -45,7 +45,7 @@ const VarFullPathPanel: FC<Props> = ({
|
||||
<div className="w-[280px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pb-0 shadow-lg backdrop-blur-[5px]">
|
||||
<div className="flex space-x-1 border-b-[0.5px] border-divider-subtle p-3 pb-2">
|
||||
<BlockIcon size="xs" type={nodeType} />
|
||||
<div className="system-xs-medium w-0 grow truncate text-text-secondary">{nodeName}</div>
|
||||
<div className="w-0 grow truncate text-text-secondary system-xs-medium">{nodeName}</div>
|
||||
</div>
|
||||
<Panel
|
||||
className="px-1 pb-3 pt-2"
|
||||
|
||||
@ -467,8 +467,8 @@ const VarReferencePicker: FC<Props> = ({
|
||||
<TypeSelector
|
||||
noLeft
|
||||
trigger={(
|
||||
<div className="radius-md flex h-8 items-center bg-components-input-bg-normal px-2">
|
||||
<div className="system-sm-regular mr-1 text-components-input-text-filled">{varKindTypes.find(item => item.value === varKindType)?.label}</div>
|
||||
<div className="flex h-8 items-center bg-components-input-bg-normal px-2 radius-md">
|
||||
<div className="mr-1 text-components-input-text-filled system-sm-regular">{varKindTypes.find(item => item.value === varKindType)?.label}</div>
|
||||
<RiArrowDownSLine className="h-4 w-4 text-text-quaternary" />
|
||||
</div>
|
||||
)}
|
||||
@ -568,7 +568,7 @@ const VarReferencePicker: FC<Props> = ({
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className="system-xs-regular ml-0.5 truncate text-center capitalize text-text-tertiary"
|
||||
className="ml-0.5 truncate text-center capitalize text-text-tertiary system-xs-regular"
|
||||
title={type}
|
||||
style={{
|
||||
maxWidth: maxTypeWidth,
|
||||
@ -580,7 +580,7 @@ const VarReferencePicker: FC<Props> = ({
|
||||
</>
|
||||
)
|
||||
: (
|
||||
<div className={`overflow-hidden ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'} system-sm-regular text-ellipsis`}>
|
||||
<div className={`overflow-hidden ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'} text-ellipsis system-sm-regular`}>
|
||||
{isLoading
|
||||
? (
|
||||
<div className="flex items-center">
|
||||
|
||||
@ -47,7 +47,7 @@ const VarReferencePopup: FC<Props> = ({
|
||||
<ListEmpty
|
||||
title={t('variableReference.noAvailableVars', { ns: 'workflow' }) || ''}
|
||||
description={(
|
||||
<div className="system-xs-regular text-text-tertiary">
|
||||
<div className="text-text-tertiary system-xs-regular">
|
||||
{t('variableReference.noVarsForOperation', { ns: 'workflow' })}
|
||||
</div>
|
||||
)}
|
||||
@ -57,7 +57,7 @@ const VarReferencePopup: FC<Props> = ({
|
||||
<ListEmpty
|
||||
title={t('variableReference.noAssignedVars', { ns: 'workflow' }) || ''}
|
||||
description={(
|
||||
<div className="system-xs-regular text-text-tertiary">
|
||||
<div className="text-text-tertiary system-xs-regular">
|
||||
{t('variableReference.assignedVarsDescription', { ns: 'workflow' })}
|
||||
</div>
|
||||
)}
|
||||
|
||||
@ -237,16 +237,16 @@ const Item: FC<ItemProps> = ({
|
||||
{isFlat && flatVarIcon}
|
||||
|
||||
{!isEnv && !isChatVar && !isRagVariable && (
|
||||
<div title={itemData.variable} className="system-sm-medium ml-1 w-0 grow truncate text-text-secondary">{varName}</div>
|
||||
<div title={itemData.variable} className="ml-1 w-0 grow truncate text-text-secondary system-sm-medium">{varName}</div>
|
||||
)}
|
||||
{isEnv && (
|
||||
<div title={itemData.variable} className="system-sm-medium ml-1 w-0 grow truncate text-text-secondary">{itemData.variable.replace('env.', '')}</div>
|
||||
<div title={itemData.variable} className="ml-1 w-0 grow truncate text-text-secondary system-sm-medium">{itemData.variable.replace('env.', '')}</div>
|
||||
)}
|
||||
{isChatVar && (
|
||||
<div title={itemData.des} className="system-sm-medium ml-1 w-0 grow truncate text-text-secondary">{itemData.variable.replace('conversation.', '')}</div>
|
||||
<div title={itemData.des} className="ml-1 w-0 grow truncate text-text-secondary system-sm-medium">{itemData.variable.replace('conversation.', '')}</div>
|
||||
)}
|
||||
{isRagVariable && (
|
||||
<div title={itemData.des} className="system-sm-medium ml-1 w-0 grow truncate text-text-secondary">{itemData.variable.split('.').slice(-1)[0]}</div>
|
||||
<div title={itemData.des} className="ml-1 w-0 grow truncate text-text-secondary system-sm-medium">{itemData.variable.split('.').slice(-1)[0]}</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="ml-1 shrink-0 text-xs font-normal capitalize text-text-tertiary">{(preferSchemaType && itemData.schemaType) ? itemData.schemaType : itemData.type}</div>
|
||||
@ -518,7 +518,7 @@ const VarReferenceVars: FC<Props> = ({
|
||||
<span className="mr-1 flex h-4 w-4 items-center justify-center rounded bg-util-colors-blue-blue-500">
|
||||
<AssembleVariables className="h-3 w-3 text-text-primary-on-surface" />
|
||||
</span>
|
||||
<span className="system-xs-medium truncate" title={t('nodes.tool.assembleVariables', { ns: 'workflow' })}>
|
||||
<span className="truncate system-xs-medium" title={t('nodes.tool.assembleVariables', { ns: 'workflow' })}>
|
||||
{t('nodes.tool.assembleVariables', { ns: 'workflow' })}
|
||||
</span>
|
||||
</button>
|
||||
@ -534,7 +534,7 @@ const VarReferenceVars: FC<Props> = ({
|
||||
<div key={i} className={cn(!item.isFlat && 'mt-3', i === 0 && item.isFlat && 'mt-2')}>
|
||||
{!item.isFlat && (
|
||||
<div
|
||||
className="system-xs-medium-uppercase truncate px-3 leading-[22px] text-text-tertiary"
|
||||
className="truncate px-3 leading-[22px] text-text-tertiary system-xs-medium-uppercase"
|
||||
title={item.title}
|
||||
>
|
||||
{item.title}
|
||||
@ -572,7 +572,7 @@ const VarReferenceVars: FC<Props> = ({
|
||||
{item.isFlat && !filteredVars[i + 1]?.isFlat && !!filteredVars.find(item => !item.isFlat) && (
|
||||
<div className="relative mt-[14px] flex items-center space-x-1">
|
||||
<div className="h-0 w-3 shrink-0 border border-divider-subtle"></div>
|
||||
<div className="system-2xs-semibold-uppercase text-text-tertiary">{t('debug.lastOutput', { ns: 'workflow' })}</div>
|
||||
<div className="text-text-tertiary system-2xs-semibold-uppercase">{t('debug.lastOutput', { ns: 'workflow' })}</div>
|
||||
<div className="h-0 shrink-0 grow border border-divider-subtle"></div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@ -47,7 +47,7 @@ const VariableLabel = ({
|
||||
notShowFullPath && (
|
||||
<>
|
||||
<RiMoreLine className="h-3 w-3 shrink-0 text-text-secondary" />
|
||||
<div className="system-xs-regular shrink-0 text-divider-deep">/</div>
|
||||
<div className="shrink-0 text-divider-deep system-xs-regular">/</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
@ -62,7 +62,7 @@ const VariableLabel = ({
|
||||
/>
|
||||
{
|
||||
!!variableType && (
|
||||
<div className="system-xs-regular shrink-0 text-text-tertiary">
|
||||
<div className="shrink-0 text-text-tertiary system-xs-regular">
|
||||
{capitalize(variableType)}
|
||||
</div>
|
||||
)
|
||||
|
||||
@ -17,7 +17,7 @@ const VariableName = ({
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'system-xs-medium truncate',
|
||||
'truncate system-xs-medium',
|
||||
className,
|
||||
)}
|
||||
title={varName}
|
||||
|
||||
@ -22,14 +22,14 @@ const VariableNodeLabel = ({
|
||||
{
|
||||
nodeTitle && (
|
||||
<div
|
||||
className="system-xs-medium max-w-[60px] truncate text-text-secondary"
|
||||
className="max-w-[60px] truncate text-text-secondary system-xs-medium"
|
||||
title={nodeTitle}
|
||||
>
|
||||
{nodeTitle}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
<div className="system-xs-regular shrink-0 text-divider-deep">/</div>
|
||||
<div className="shrink-0 text-divider-deep system-xs-regular">/</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
@ -698,10 +698,10 @@ const BasePanel: FC<BasePanelProps> = ({
|
||||
{
|
||||
allowGraphActions && !!availableNextBlocks.length && (
|
||||
<div className="border-t-[0.5px] border-divider-regular p-4">
|
||||
<div className="system-sm-semibold-uppercase mb-1 flex items-center text-text-secondary">
|
||||
<div className="mb-1 flex items-center text-text-secondary system-sm-semibold-uppercase">
|
||||
{t('panel.nextStep', { ns: 'workflow' }).toLocaleUpperCase()}
|
||||
</div>
|
||||
<div className="system-xs-regular mb-2 text-text-tertiary">
|
||||
<div className="mb-2 text-text-tertiary system-xs-regular">
|
||||
{t('panel.addNextStep', { ns: 'workflow' })}
|
||||
</div>
|
||||
<NextStep selectedNode={selectedNode} />
|
||||
|
||||
@ -19,7 +19,7 @@ const NoData: FC<Props> = ({
|
||||
return (
|
||||
<div className="flex h-0 grow flex-col items-center justify-center">
|
||||
<ClockPlay className="h-8 w-8 text-text-quaternary" />
|
||||
<div className="system-xs-regular my-2 text-text-tertiary">{t('debug.noData.description', { ns: 'workflow' })}</div>
|
||||
<div className="my-2 text-text-tertiary system-xs-regular">{t('debug.noData.description', { ns: 'workflow' })}</div>
|
||||
{canSingleRun && (
|
||||
<Button
|
||||
className="flex"
|
||||
|
||||
@ -168,7 +168,7 @@ const BaseNode: FC<BaseNodeProps> = ({
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'system-xs-medium mr-2 text-text-tertiary',
|
||||
'mr-2 text-text-tertiary system-xs-medium',
|
||||
data._runningStatus === NodeRunningStatus.Running && 'text-text-accent',
|
||||
)}
|
||||
>
|
||||
@ -212,7 +212,7 @@ const BaseNode: FC<BaseNodeProps> = ({
|
||||
/>
|
||||
<div
|
||||
title={data.title}
|
||||
className="system-sm-semibold-uppercase text-text-primary"
|
||||
className="text-text-primary system-sm-semibold-uppercase"
|
||||
>
|
||||
{data.title}
|
||||
</div>
|
||||
@ -251,7 +251,7 @@ const BaseNode: FC<BaseNodeProps> = ({
|
||||
{
|
||||
data.type === BlockEnum.DataSource && (
|
||||
<div className="absolute inset-[-2px] top-[-22px] z-[-1] rounded-[18px] bg-node-data-source-bg p-0.5 backdrop-blur-[6px]">
|
||||
<div className="system-2xs-semibold-uppercase flex h-5 items-center px-2.5 text-text-tertiary">
|
||||
<div className="flex h-5 items-center px-2.5 text-text-tertiary system-2xs-semibold-uppercase">
|
||||
{t('blocks.datasource', { ns: 'workflow' })}
|
||||
</div>
|
||||
</div>
|
||||
@ -338,7 +338,7 @@ const BaseNode: FC<BaseNodeProps> = ({
|
||||
/>
|
||||
<div
|
||||
title={data.title}
|
||||
className="system-sm-semibold-uppercase mr-1 flex grow items-center truncate text-text-primary"
|
||||
className="mr-1 flex grow items-center truncate text-text-primary system-sm-semibold-uppercase"
|
||||
>
|
||||
<div>
|
||||
{data.title}
|
||||
@ -354,7 +354,7 @@ const BaseNode: FC<BaseNodeProps> = ({
|
||||
</div>
|
||||
)}
|
||||
>
|
||||
<div className="system-2xs-medium-uppercase ml-1 flex items-center justify-center rounded-[5px] border-[1px] border-text-warning px-[5px] py-[3px] text-text-warning">
|
||||
<div className="ml-1 flex items-center justify-center rounded-[5px] border-[1px] border-text-warning px-[5px] py-[3px] text-text-warning system-2xs-medium-uppercase">
|
||||
{t('nodes.iteration.parallelModeUpper', { ns: 'workflow' })}
|
||||
</div>
|
||||
</Tooltip>
|
||||
@ -436,7 +436,7 @@ const BaseNode: FC<BaseNodeProps> = ({
|
||||
}
|
||||
{
|
||||
!!(data.desc && data.type !== BlockEnum.Iteration && data.type !== BlockEnum.Loop) && (
|
||||
<div className="system-xs-regular whitespace-pre-line break-words px-3 pb-2 pt-1 text-text-tertiary">
|
||||
<div className="whitespace-pre-line break-words px-3 pb-2 pt-1 text-text-tertiary system-xs-regular">
|
||||
{data.desc}
|
||||
</div>
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user