refactor: unified cn utils (#29916)

Co-authored-by: yyh <yuanyouhuilyz@gmail.com>
Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com>
This commit is contained in:
Stephen Zhou
2025-12-19 12:08:34 +08:00
committed by GitHub
parent 80f11471ae
commit a26881cb24
815 changed files with 1064 additions and 1227 deletions

View File

@@ -16,7 +16,7 @@ import {
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useShallow } from 'zustand/react/shallow' import { useShallow } from 'zustand/react/shallow'
import s from './style.module.css' import s from './style.module.css'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useStore } from '@/app/components/app/store' import { useStore } from '@/app/components/app/store'
import AppSideBar from '@/app/components/app-sidebar' import AppSideBar from '@/app/components/app-sidebar'
import type { NavIcon } from '@/app/components/app-sidebar/navLink' import type { NavIcon } from '@/app/components/app-sidebar/navLink'

View File

@@ -3,7 +3,7 @@ import { RiCalendarLine } from '@remixicon/react'
import type { Dayjs } from 'dayjs' import type { Dayjs } from 'dayjs'
import type { FC } from 'react' import type { FC } from 'react'
import React, { useCallback } from 'react' import React, { useCallback } from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { formatToLocalTime } from '@/utils/format' import { formatToLocalTime } from '@/utils/format'
import { useI18N } from '@/context/i18n' import { useI18N } from '@/context/i18n'
import Picker from '@/app/components/base/date-and-time-picker/date-picker' import Picker from '@/app/components/base/date-and-time-picker/date-picker'

View File

@@ -6,7 +6,7 @@ import { SimpleSelect } from '@/app/components/base/select'
import type { Item } from '@/app/components/base/select' import type { Item } from '@/app/components/base/select'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react' import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
const today = dayjs() const today = dayjs()

View File

@@ -4,7 +4,7 @@ import React, { useCallback, useRef, useState } from 'react'
import type { PopupProps } from './config-popup' import type { PopupProps } from './config-popup'
import ConfigPopup from './config-popup' import ConfigPopup from './config-popup'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { import {
PortalToFollowElem, PortalToFollowElem,
PortalToFollowElemContent, PortalToFollowElemContent,

View File

@@ -12,7 +12,7 @@ import Indicator from '@/app/components/header/indicator'
import Switch from '@/app/components/base/switch' import Switch from '@/app/components/base/switch'
import Tooltip from '@/app/components/base/tooltip' import Tooltip from '@/app/components/base/tooltip'
import Divider from '@/app/components/base/divider' import Divider from '@/app/components/base/divider'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
const I18N_PREFIX = 'app.tracing' const I18N_PREFIX = 'app.tracing'

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Input from '@/app/components/base/input' import Input from '@/app/components/base/input'
type Props = { type Props = {

View File

@@ -12,7 +12,7 @@ import type { AliyunConfig, ArizeConfig, DatabricksConfig, LangFuseConfig, LangS
import { TracingProvider } from './type' import { TracingProvider } from './type'
import TracingIcon from './tracing-icon' import TracingIcon from './tracing-icon'
import ConfigButton from './config-button' import ConfigButton from './config-button'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { AliyunIcon, ArizeIcon, DatabricksIcon, LangfuseIcon, LangsmithIcon, MlflowIcon, OpikIcon, PhoenixIcon, TencentIcon, WeaveIcon } from '@/app/components/base/icons/src/public/tracing' import { AliyunIcon, ArizeIcon, DatabricksIcon, LangfuseIcon, LangsmithIcon, MlflowIcon, OpikIcon, PhoenixIcon, TencentIcon, WeaveIcon } from '@/app/components/base/icons/src/public/tracing'
import Indicator from '@/app/components/header/indicator' import Indicator from '@/app/components/header/indicator'
import { fetchTracingConfig as doFetchTracingConfig, fetchTracingStatus, updateTracingStatus } from '@/service/apps' import { fetchTracingConfig as doFetchTracingConfig, fetchTracingStatus, updateTracingStatus } from '@/service/apps'

View File

@@ -6,7 +6,7 @@ import {
} from '@remixicon/react' } from '@remixicon/react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { TracingProvider } from './type' import { TracingProvider } from './type'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { AliyunIconBig, ArizeIconBig, DatabricksIconBig, LangfuseIconBig, LangsmithIconBig, MlflowIconBig, OpikIconBig, PhoenixIconBig, TencentIconBig, WeaveIconBig } from '@/app/components/base/icons/src/public/tracing' import { AliyunIconBig, ArizeIconBig, DatabricksIconBig, LangfuseIconBig, LangsmithIconBig, MlflowIconBig, OpikIconBig, PhoenixIconBig, TencentIconBig, WeaveIconBig } from '@/app/components/base/icons/src/public/tracing'
import { Eye as View } from '@/app/components/base/icons/src/vender/solid/general' import { Eye as View } from '@/app/components/base/icons/src/vender/solid/general'

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { TracingIcon as Icon } from '@/app/components/base/icons/src/public/tracing' import { TracingIcon as Icon } from '@/app/components/base/icons/src/public/tracing'
type Props = { type Props = {

View File

@@ -23,7 +23,7 @@ import { useDatasetDetail, useDatasetRelatedApps } from '@/service/knowledge/use
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import ExtraInfo from '@/app/components/datasets/extra-info' import ExtraInfo from '@/app/components/datasets/extra-info'
import { useEventEmitterContextContext } from '@/context/event-emitter' import { useEventEmitterContextContext } from '@/context/event-emitter'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
export type IAppDetailLayoutProps = { export type IAppDetailLayoutProps = {
children: React.ReactNode children: React.ReactNode

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import Header from '@/app/signin/_header' import Header from '@/app/signin/_header'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
export default function SignInLayout({ children }: any) { export default function SignInLayout({ children }: any) {

View File

@@ -2,7 +2,7 @@
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useRouter, useSearchParams } from 'next/navigation' import { useRouter, useSearchParams } from 'next/navigation'
import cn from 'classnames' import { cn } from '@/utils/classnames'
import { RiCheckboxCircleFill } from '@remixicon/react' import { RiCheckboxCircleFill } from '@remixicon/react'
import { useCountDown } from 'ahooks' import { useCountDown } from 'ahooks'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'

View File

@@ -1,6 +1,6 @@
'use client' 'use client'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import type { PropsWithChildren } from 'react' import type { PropsWithChildren } from 'react'

View File

@@ -7,7 +7,7 @@ import Loading from '@/app/components/base/loading'
import MailAndCodeAuth from './components/mail-and-code-auth' import MailAndCodeAuth from './components/mail-and-code-auth'
import MailAndPasswordAuth from './components/mail-and-password-auth' import MailAndPasswordAuth from './components/mail-and-password-auth'
import SSOAuth from './components/sso-auth' import SSOAuth from './components/sso-auth'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { LicenseStatus } from '@/types/feature' import { LicenseStatus } from '@/types/feature'
import { IS_CE_EDITION } from '@/config' import { IS_CE_EDITION } from '@/config'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import Header from '@/app/signin/_header' import Header from '@/app/signin/_header'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
import useDocumentTitle from '@/hooks/use-document-title' import useDocumentTitle from '@/hooks/use-document-title'
import { AppContextProvider } from '@/context/app-context' import { AppContextProvider } from '@/context/app-context'

View File

@@ -2,7 +2,7 @@
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import useSWR from 'swr' import useSWR from 'swr'
import { useRouter, useSearchParams } from 'next/navigation' import { useRouter, useSearchParams } from 'next/navigation'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import { invitationCheck } from '@/service/common' import { invitationCheck } from '@/service/common'

View File

@@ -2,7 +2,7 @@
import React from 'react' import React from 'react'
import Header from '../signin/_header' import Header from '../signin/_header'
import ActivateForm from './activateForm' import ActivateForm from './activateForm'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
const Activate = () => { const Activate = () => {

View File

@@ -29,7 +29,7 @@ import CardView from '@/app/(commonLayout)/app/(appDetailLayout)/[appId]/overvie
import type { Operation } from './app-operations' import type { Operation } from './app-operations'
import AppOperations from './app-operations' import AppOperations from './app-operations'
import dynamic from 'next/dynamic' import dynamic from 'next/dynamic'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
const SwitchAppModal = dynamic(() => import('@/app/components/app/switch-app-modal'), { const SwitchAppModal = dynamic(() => import('@/app/components/app/switch-app-modal'), {

View File

@@ -16,7 +16,7 @@ import AppInfo from './app-info'
import NavLink from './navLink' import NavLink from './navLink'
import { useStore as useAppStore } from '@/app/components/app/store' import { useStore as useAppStore } from '@/app/components/app/store'
import type { NavIcon } from './navLink' import type { NavIcon } from './navLink'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'
type Props = { type Props = {

View File

@@ -2,7 +2,7 @@ import React, { useCallback, useState } from 'react'
import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../base/portal-to-follow-elem' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../base/portal-to-follow-elem'
import ActionButton from '../../base/action-button' import ActionButton from '../../base/action-button'
import { RiMoreFill } from '@remixicon/react' import { RiMoreFill } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Menu from './menu' import Menu from './menu'
import { useSelector as useAppContextWithSelector } from '@/context/app-context' import { useSelector as useAppContextWithSelector } from '@/context/app-context'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'

View File

@@ -8,7 +8,7 @@ import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import type { DataSet } from '@/models/datasets' import type { DataSet } from '@/models/datasets'
import { DOC_FORM_TEXT } from '@/models/datasets' import { DOC_FORM_TEXT } from '@/models/datasets'
import { useKnowledge } from '@/hooks/use-knowledge' import { useKnowledge } from '@/hooks/use-knowledge'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Dropdown from './dropdown' import Dropdown from './dropdown'
type DatasetInfoProps = { type DatasetInfoProps = {

View File

@@ -11,7 +11,7 @@ import AppIcon from '../base/app-icon'
import Divider from '../base/divider' import Divider from '../base/divider'
import NavLink from './navLink' import NavLink from './navLink'
import type { NavIcon } from './navLink' import type { NavIcon } from './navLink'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import Effect from '../base/effect' import Effect from '../base/effect'
import Dropdown from './dataset-info/dropdown' import Dropdown from './dataset-info/dropdown'

View File

@@ -9,7 +9,7 @@ import AppSidebarDropdown from './app-sidebar-dropdown'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import { useStore as useAppStore } from '@/app/components/app/store' import { useStore as useAppStore } from '@/app/components/app/store'
import { useEventEmitterContextContext } from '@/context/event-emitter' import { useEventEmitterContextContext } from '@/context/event-emitter'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Divider from '../base/divider' import Divider from '../base/divider'
import { useHover, useKeyPress } from 'ahooks' import { useHover, useKeyPress } from 'ahooks'
import ToggleButton from './toggle-button' import ToggleButton from './toggle-button'

View File

@@ -2,7 +2,7 @@
import React from 'react' import React from 'react'
import { useSelectedLayoutSegment } from 'next/navigation' import { useSelectedLayoutSegment } from 'next/navigation'
import Link from 'next/link' import Link from 'next/link'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { RemixiconComponentType } from '@remixicon/react' import type { RemixiconComponentType } from '@remixicon/react'
export type NavIcon = React.ComponentType< export type NavIcon = React.ComponentType<
@@ -42,7 +42,7 @@ const NavLink = ({
const NavIcon = isActive ? iconMap.selected : iconMap.normal const NavIcon = isActive ? iconMap.selected : iconMap.normal
const renderIcon = () => ( const renderIcon = () => (
<div className={classNames(mode !== 'expand' && '-ml-1')}> <div className={cn(mode !== 'expand' && '-ml-1')}>
<NavIcon className="h-4 w-4 shrink-0" aria-hidden="true" /> <NavIcon className="h-4 w-4 shrink-0" aria-hidden="true" />
</div> </div>
) )
@@ -53,21 +53,17 @@ const NavLink = ({
key={name} key={name}
type='button' type='button'
disabled disabled
className={classNames( className={cn('system-sm-medium flex h-8 cursor-not-allowed items-center rounded-lg text-components-menu-item-text opacity-30 hover:bg-components-menu-item-bg-hover',
'system-sm-medium flex h-8 cursor-not-allowed items-center rounded-lg text-components-menu-item-text opacity-30 hover:bg-components-menu-item-bg-hover', 'pl-3 pr-1')}
'pl-3 pr-1',
)}
title={mode === 'collapse' ? name : ''} title={mode === 'collapse' ? name : ''}
aria-disabled aria-disabled
> >
{renderIcon()} {renderIcon()}
<span <span
className={classNames( className={cn('overflow-hidden whitespace-nowrap transition-all duration-200 ease-in-out',
'overflow-hidden whitespace-nowrap transition-all duration-200 ease-in-out',
mode === 'expand' mode === 'expand'
? 'ml-2 max-w-none opacity-100' ? 'ml-2 max-w-none opacity-100'
: 'ml-0 max-w-0 opacity-0', : 'ml-0 max-w-0 opacity-0')}
)}
> >
{name} {name}
</span> </span>
@@ -79,22 +75,18 @@ const NavLink = ({
<Link <Link
key={name} key={name}
href={href} href={href}
className={classNames( className={cn(isActive
isActive ? 'system-sm-semibold border-b-[0.25px] border-l-[0.75px] border-r-[0.25px] border-t-[0.75px] border-effects-highlight-lightmode-off bg-components-menu-item-bg-active text-text-accent-light-mode-only'
? 'system-sm-semibold border-b-[0.25px] border-l-[0.75px] border-r-[0.25px] border-t-[0.75px] border-effects-highlight-lightmode-off bg-components-menu-item-bg-active text-text-accent-light-mode-only' : 'system-sm-medium text-components-menu-item-text hover:bg-components-menu-item-bg-hover hover:text-components-menu-item-text-hover',
: 'system-sm-medium text-components-menu-item-text hover:bg-components-menu-item-bg-hover hover:text-components-menu-item-text-hover', 'flex h-8 items-center rounded-lg pl-3 pr-1')}
'flex h-8 items-center rounded-lg pl-3 pr-1',
)}
title={mode === 'collapse' ? name : ''} title={mode === 'collapse' ? name : ''}
> >
{renderIcon()} {renderIcon()}
<span <span
className={classNames( className={cn('overflow-hidden whitespace-nowrap transition-all duration-200 ease-in-out',
'overflow-hidden whitespace-nowrap transition-all duration-200 ease-in-out',
mode === 'expand' mode === 'expand'
? 'ml-2 max-w-none opacity-100' ? 'ml-2 max-w-none opacity-100'
: 'ml-0 max-w-0 opacity-0', : 'ml-0 max-w-0 opacity-0')}
)}
> >
{name} {name}
</span> </span>

View File

@@ -1,7 +1,7 @@
import React from 'react' import React from 'react'
import Button from '../base/button' import Button from '../base/button'
import { RiArrowLeftSLine, RiArrowRightSLine } from '@remixicon/react' import { RiArrowLeftSLine, RiArrowRightSLine } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Tooltip from '../base/tooltip' import Tooltip from '../base/tooltip'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { getKeyboardKeyNameBySystem } from '../workflow/utils' import { getKeyboardKeyNameBySystem } from '../workflow/utils'

View File

@@ -3,7 +3,7 @@ import { RiDeleteBinLine } from '@remixicon/react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import Divider from '@/app/components/base/divider' import Divider from '@/app/components/base/divider'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Confirm from '@/app/components/base/confirm' import Confirm from '@/app/components/base/confirm'
const i18nPrefix = 'appAnnotation.batchAction' const i18nPrefix = 'appAnnotation.batchAction'
@@ -38,7 +38,7 @@ const BatchAction: FC<IBatchActionProps> = ({
setIsNotDeleting() setIsNotDeleting()
} }
return ( return (
<div className={classNames('pointer-events-none flex w-full justify-center', className)}> <div className={cn('pointer-events-none flex w-full justify-center', className)}>
<div className='pointer-events-auto flex items-center gap-x-1 rounded-[10px] border border-components-actionbar-border-accent bg-components-actionbar-bg-accent p-1 shadow-xl shadow-shadow-shadow-5 backdrop-blur-[5px]'> <div className='pointer-events-auto flex items-center gap-x-1 rounded-[10px] border border-components-actionbar-border-accent bg-components-actionbar-bg-accent p-1 shadow-xl shadow-shadow-shadow-5 backdrop-blur-[5px]'>
<div className='inline-flex items-center gap-x-2 py-1 pl-2 pr-3'> <div className='inline-flex items-center gap-x-2 py-1 pl-2 pr-3'>
<span className='flex h-5 w-5 items-center justify-center rounded-md bg-text-accent px-1 py-0.5 text-xs font-medium text-text-primary-on-surface'> <span className='flex h-5 w-5 items-center justify-center rounded-md bg-text-accent px-1 py-0.5 text-xs font-medium text-text-primary-on-surface'>

View File

@@ -4,7 +4,7 @@ import React, { useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import { RiDeleteBinLine } from '@remixicon/react' import { RiDeleteBinLine } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { Csv as CSVIcon } from '@/app/components/base/icons/src/public/files' import { Csv as CSVIcon } from '@/app/components/base/icons/src/public/files'
import { ToastContext } from '@/app/components/base/toast' import { ToastContext } from '@/app/components/base/toast'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'

View File

@@ -6,7 +6,7 @@ import { RiDeleteBinLine, RiEditFill, RiEditLine } from '@remixicon/react'
import { Robot, User } from '@/app/components/base/icons/src/public/avatar' import { Robot, User } from '@/app/components/base/icons/src/public/avatar'
import Textarea from '@/app/components/base/textarea' import Textarea from '@/app/components/base/textarea'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
export enum EditItemType { export enum EditItemType {
Query = 'query', Query = 'query',

View File

@@ -17,7 +17,7 @@ import Button from '../../../base/button'
import AddAnnotationModal from '../add-annotation-modal' import AddAnnotationModal from '../add-annotation-modal'
import type { AnnotationItemBasic } from '../type' import type { AnnotationItemBasic } from '../type'
import BatchAddModal from '../batch-add-annotation-modal' import BatchAddModal from '../batch-add-annotation-modal'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import CustomPopover from '@/app/components/base/popover' import CustomPopover from '@/app/components/base/popover'
import { FileDownload02, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' import { FileDownload02, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files'
import { ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows' import { ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows'

View File

@@ -25,7 +25,7 @@ import { sleep } from '@/utils'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import AnnotationFullModal from '@/app/components/billing/annotation-full/modal' import AnnotationFullModal from '@/app/components/billing/annotation-full/modal'
import { type App, AppModeEnum } from '@/types/app' import { type App, AppModeEnum } from '@/types/app'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { delAnnotations } from '@/service/annotation' import { delAnnotations } from '@/service/annotation'
type Props = { type Props = {

View File

@@ -7,7 +7,7 @@ import type { AnnotationItem } from './type'
import RemoveAnnotationConfirmModal from './remove-annotation-confirm-modal' import RemoveAnnotationConfirmModal from './remove-annotation-confirm-modal'
import ActionButton from '@/app/components/base/action-button' import ActionButton from '@/app/components/base/action-button'
import useTimestamp from '@/hooks/use-timestamp' import useTimestamp from '@/hooks/use-timestamp'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Checkbox from '@/app/components/base/checkbox' import Checkbox from '@/app/components/base/checkbox'
import BatchAction from './batch-action' import BatchAction from './batch-action'

View File

@@ -14,7 +14,7 @@ import TabSlider from '@/app/components/base/tab-slider-plain'
import { fetchHitHistoryList } from '@/service/annotation' import { fetchHitHistoryList } from '@/service/annotation'
import { APP_PAGE_LIMIT } from '@/config' import { APP_PAGE_LIMIT } from '@/config'
import useTimestamp from '@/hooks/use-timestamp' import useTimestamp from '@/hooks/use-timestamp'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type Props = { type Props = {
appId: string appId: string

View File

@@ -2,7 +2,7 @@ import { Fragment, useCallback } from 'react'
import type { ReactNode } from 'react' import type { ReactNode } from 'react'
import { Dialog, Transition } from '@headlessui/react' import { Dialog, Transition } from '@headlessui/react'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type DialogProps = { type DialogProps = {
className?: string className?: string

View File

@@ -11,7 +11,7 @@ import Input from '../../base/input'
import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../base/portal-to-follow-elem' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../base/portal-to-follow-elem'
import Loading from '../../base/loading' import Loading from '../../base/loading'
import useAccessControlStore from '../../../../context/access-control-store' import useAccessControlStore from '../../../../context/access-control-store'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useSearchForWhiteListCandidates } from '@/service/access-control' import { useSearchForWhiteListCandidates } from '@/service/access-control'
import type { AccessControlAccount, AccessControlGroup, Subject, SubjectAccount, SubjectGroup } from '@/models/access-control' import type { AccessControlAccount, AccessControlGroup, Subject, SubjectAccount, SubjectGroup } from '@/models/access-control'
import { SubjectType } from '@/models/access-control' import { SubjectType } from '@/models/access-control'
@@ -106,7 +106,7 @@ function SelectedGroupsBreadCrumb() {
setSelectedGroupsForBreadcrumb([]) setSelectedGroupsForBreadcrumb([])
}, [setSelectedGroupsForBreadcrumb]) }, [setSelectedGroupsForBreadcrumb])
return <div className='flex h-7 items-center gap-x-0.5 px-2 py-0.5'> return <div className='flex h-7 items-center gap-x-0.5 px-2 py-0.5'>
<span className={classNames('system-xs-regular text-text-tertiary', selectedGroupsForBreadcrumb.length > 0 && 'cursor-pointer text-text-accent')} onClick={handleReset}>{t('app.accessControlDialog.operateGroupAndMember.allMembers')}</span> <span className={cn('system-xs-regular text-text-tertiary', selectedGroupsForBreadcrumb.length > 0 && 'cursor-pointer text-text-accent')} onClick={handleReset}>{t('app.accessControlDialog.operateGroupAndMember.allMembers')}</span>
{selectedGroupsForBreadcrumb.map((group, index) => { {selectedGroupsForBreadcrumb.map((group, index) => {
return <div key={index} className='system-xs-regular flex items-center gap-x-0.5 text-text-tertiary'> return <div key={index} className='system-xs-regular flex items-center gap-x-0.5 text-text-tertiary'>
<span>/</span> <span>/</span>
@@ -198,7 +198,7 @@ type BaseItemProps = {
children: React.ReactNode children: React.ReactNode
} }
function BaseItem({ children, className }: BaseItemProps) { function BaseItem({ children, className }: BaseItemProps) {
return <div className={classNames('flex cursor-pointer items-center space-x-2 p-1 pl-2 hover:rounded-lg hover:bg-state-base-hover', className)}> return <div className={cn('flex cursor-pointer items-center space-x-2 p-1 pl-2 hover:rounded-lg hover:bg-state-base-hover', className)}>
{children} {children}
</div> </div>
} }

View File

@@ -1,6 +1,6 @@
import type { HTMLProps, PropsWithChildren } from 'react' import type { HTMLProps, PropsWithChildren } from 'react'
import { RiArrowRightUpLine } from '@remixicon/react' import { RiArrowRightUpLine } from '@remixicon/react'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
export type SuggestedActionProps = PropsWithChildren<HTMLProps<HTMLAnchorElement> & { export type SuggestedActionProps = PropsWithChildren<HTMLProps<HTMLAnchorElement> & {
icon?: React.ReactNode icon?: React.ReactNode
@@ -19,11 +19,9 @@ const SuggestedAction = ({ icon, link, disabled, children, className, onClick, .
href={disabled ? undefined : link} href={disabled ? undefined : link}
target='_blank' target='_blank'
rel='noreferrer' rel='noreferrer'
className={classNames( className={cn('flex items-center justify-start gap-2 rounded-lg bg-background-section-burn px-2.5 py-2 text-text-secondary transition-colors [&:not(:first-child)]:mt-1',
'flex items-center justify-start gap-2 rounded-lg bg-background-section-burn px-2.5 py-2 text-text-secondary transition-colors [&:not(:first-child)]:mt-1',
disabled ? 'cursor-not-allowed opacity-30 shadow-xs' : 'cursor-pointer text-text-secondary hover:bg-state-accent-hover hover:text-text-accent', disabled ? 'cursor-not-allowed opacity-30 shadow-xs' : 'cursor-pointer text-text-secondary hover:bg-state-accent-hover hover:text-text-accent',
className, className)}
)}
onClick={handleClick} onClick={handleClick}
{...props} {...props}
> >

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import type { FC, ReactNode } from 'react' import type { FC, ReactNode } from 'react'
import React from 'react' import React from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
export type IFeaturePanelProps = { export type IFeaturePanelProps = {
className?: string className?: string

View File

@@ -6,7 +6,7 @@ import {
RiAddLine, RiAddLine,
RiEditLine, RiEditLine,
} from '@remixicon/react' } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { noop } from 'lodash-es' import { noop } from 'lodash-es'
export type IOperationBtnProps = { export type IOperationBtnProps = {

View File

@@ -14,7 +14,7 @@ import s from './style.module.css'
import MessageTypeSelector from './message-type-selector' import MessageTypeSelector from './message-type-selector'
import ConfirmAddVar from './confirm-add-var' import ConfirmAddVar from './confirm-add-var'
import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap' import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { PromptRole, PromptVariable } from '@/models/debug' import type { PromptRole, PromptVariable } from '@/models/debug'
import { import {
Copy, Copy,

View File

@@ -2,7 +2,7 @@
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import { useBoolean, useClickAway } from 'ahooks' import { useBoolean, useClickAway } from 'ahooks'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { PromptRole } from '@/models/debug' import { PromptRole } from '@/models/debug'
import { ChevronSelectorVertical } from '@/app/components/base/icons/src/vender/line/arrows' import { ChevronSelectorVertical } from '@/app/components/base/icons/src/vender/line/arrows'
type Props = { type Props = {

View File

@@ -2,7 +2,7 @@
import React, { useCallback, useEffect, useState } from 'react' import React, { useCallback, useEffect, useState } from 'react'
import type { FC } from 'react' import type { FC } from 'react'
import { useDebounceFn } from 'ahooks' import { useDebounceFn } from 'ahooks'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type Props = { type Props = {
className?: string className?: string

View File

@@ -7,7 +7,7 @@ import { produce } from 'immer'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import ConfirmAddVar from './confirm-add-var' import ConfirmAddVar from './confirm-add-var'
import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap' import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { PromptVariable } from '@/models/debug' import type { PromptVariable } from '@/models/debug'
import Tooltip from '@/app/components/base/tooltip' import Tooltip from '@/app/components/base/tooltip'
import { AppModeEnum } from '@/types/app' import { AppModeEnum } from '@/types/app'

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
type Props = { type Props = {

View File

@@ -2,7 +2,6 @@
import type { FC } from 'react' import type { FC } from 'react'
import React, { useState } from 'react' import React, { useState } from 'react'
import { ChevronDownIcon } from '@heroicons/react/20/solid' import { ChevronDownIcon } from '@heroicons/react/20/solid'
import classNames from '@/utils/classnames'
import { import {
PortalToFollowElem, PortalToFollowElem,
PortalToFollowElemContent, PortalToFollowElemContent,
@@ -10,7 +9,7 @@ import {
} from '@/app/components/base/portal-to-follow-elem' } from '@/app/components/base/portal-to-follow-elem'
import InputVarTypeIcon from '@/app/components/workflow/nodes/_base/components/input-var-type-icon' import InputVarTypeIcon from '@/app/components/workflow/nodes/_base/components/input-var-type-icon'
import type { InputVarType } from '@/app/components/workflow/types' import type { InputVarType } from '@/app/components/workflow/types'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Badge from '@/app/components/base/badge' import Badge from '@/app/components/base/badge'
import { inputVarTypeToVarType } from '@/app/components/workflow/nodes/_base/components/variable/utils' import { inputVarTypeToVarType } from '@/app/components/workflow/nodes/_base/components/variable/utils'
@@ -47,7 +46,7 @@ const TypeSelector: FC<Props> = ({
> >
<PortalToFollowElemTrigger onClick={() => !readonly && setOpen(v => !v)} className='w-full'> <PortalToFollowElemTrigger onClick={() => !readonly && setOpen(v => !v)} className='w-full'>
<div <div
className={classNames(`group flex h-9 items-center justify-between rounded-lg border-0 bg-components-input-bg-normal px-2 text-sm hover:bg-state-base-hover-alt ${readonly ? 'cursor-not-allowed' : 'cursor-pointer'}`)} className={cn(`group flex h-9 items-center justify-between rounded-lg border-0 bg-components-input-bg-normal px-2 text-sm hover:bg-state-base-hover-alt ${readonly ? 'cursor-not-allowed' : 'cursor-pointer'}`)}
title={selectedItem?.name} title={selectedItem?.name}
> >
<div className='flex items-center'> <div className='flex items-center'>
@@ -69,7 +68,7 @@ const TypeSelector: FC<Props> = ({
</PortalToFollowElemTrigger> </PortalToFollowElemTrigger>
<PortalToFollowElemContent className='z-[61]'> <PortalToFollowElemContent className='z-[61]'>
<div <div
className={classNames('w-[432px] rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg px-1 py-1 text-base shadow-lg focus:outline-none sm:text-sm', popupInnerClassName)} className={cn('w-[432px] rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg px-1 py-1 text-base shadow-lg focus:outline-none sm:text-sm', popupInnerClassName)}
> >
{items.map((item: Item) => ( {items.map((item: Item) => (
<div <div

View File

@@ -4,7 +4,7 @@ import React, { useState } from 'react'
import { RiAddLine, RiDeleteBinLine, RiDraggable } from '@remixicon/react' import { RiAddLine, RiDeleteBinLine, RiDraggable } from '@remixicon/react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { ReactSortable } from 'react-sortablejs' import { ReactSortable } from 'react-sortablejs'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
export type Options = string[] export type Options = string[]
export type IConfigSelectProps = { export type IConfigSelectProps = {

View File

@@ -23,7 +23,7 @@ import { useModalContext } from '@/context/modal-context'
import { useEventEmitterContextContext } from '@/context/event-emitter' import { useEventEmitterContextContext } from '@/context/event-emitter'
import type { InputVar } from '@/app/components/workflow/types' import type { InputVar } from '@/app/components/workflow/types'
import { InputVarType } from '@/app/components/workflow/types' import { InputVarType } from '@/app/components/workflow/types'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
export const ADD_EXTERNAL_DATA_TOOL = 'ADD_EXTERNAL_DATA_TOOL' export const ADD_EXTERNAL_DATA_TOOL = 'ADD_EXTERNAL_DATA_TOOL'

View File

@@ -2,7 +2,7 @@
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { InputVarType } from '@/app/components/workflow/types' import type { InputVarType } from '@/app/components/workflow/types'
import InputVarTypeIcon from '@/app/components/workflow/nodes/_base/components/input-var-type-icon' import InputVarTypeIcon from '@/app/components/workflow/nodes/_base/components/input-var-type-icon'
export type ISelectTypeItemProps = { export type ISelectTypeItemProps = {

View File

@@ -10,7 +10,7 @@ import type { IInputTypeIconProps } from './input-type-icon'
import IconTypeIcon from './input-type-icon' import IconTypeIcon from './input-type-icon'
import { BracketsX as VarIcon } from '@/app/components/base/icons/src/vender/line/development' import { BracketsX as VarIcon } from '@/app/components/base/icons/src/vender/line/development'
import Badge from '@/app/components/base/badge' import Badge from '@/app/components/base/badge'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type ItemProps = { type ItemProps = {
className?: string className?: string

View File

@@ -10,7 +10,7 @@ import {
PortalToFollowElemContent, PortalToFollowElemContent,
PortalToFollowElemTrigger, PortalToFollowElemTrigger,
} from '@/app/components/base/portal-to-follow-elem' } from '@/app/components/base/portal-to-follow-elem'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
const ParamsConfig: FC = () => { const ParamsConfig: FC = () => {
const { t } = useTranslation() const { t } = useTranslation()

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Tooltip from '@/app/components/base/tooltip' import Tooltip from '@/app/components/base/tooltip'
type Props = { type Props = {
className?: string className?: string

View File

@@ -25,7 +25,7 @@ import { MAX_TOOLS_NUM } from '@/config'
import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback' import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
import Tooltip from '@/app/components/base/tooltip' import Tooltip from '@/app/components/base/tooltip'
import { DefaultToolIcon } from '@/app/components/base/icons/src/public/other' import { DefaultToolIcon } from '@/app/components/base/icons/src/public/other'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import ToolPicker from '@/app/components/workflow/block-selector/tool-picker' import ToolPicker from '@/app/components/workflow/block-selector/tool-picker'
import type { ToolDefaultValue, ToolValue } from '@/app/components/workflow/block-selector/types' import type { ToolDefaultValue, ToolValue } from '@/app/components/workflow/block-selector/types'
import { canFindTool } from '@/utils' import { canFindTool } from '@/utils'

View File

@@ -22,7 +22,7 @@ import { CollectionType } from '@/app/components/tools/types'
import { fetchBuiltInToolList, fetchCustomToolList, fetchModelToolList, fetchWorkflowToolList } from '@/service/tools' import { fetchBuiltInToolList, fetchCustomToolList, fetchModelToolList, fetchWorkflowToolList } from '@/service/tools'
import I18n from '@/context/i18n' import I18n from '@/context/i18n'
import { getLanguage } from '@/i18n-config/language' import { getLanguage } from '@/i18n-config/language'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { ToolWithProvider } from '@/app/components/workflow/types' import type { ToolWithProvider } from '@/app/components/workflow/types'
import { import {
AuthCategory, AuthCategory,

View File

@@ -4,7 +4,7 @@ import React from 'react'
import copy from 'copy-to-clipboard' import copy from 'copy-to-clipboard'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { import {
Copy, Copy,
CopyCheck, CopyCheck,

View File

@@ -4,7 +4,7 @@ import React, { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiArrowDownSLine } from '@remixicon/react' import { RiArrowDownSLine } from '@remixicon/react'
import AgentSetting from '../agent/agent-setting' import AgentSetting from '../agent/agent-setting'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { import {
PortalToFollowElem, PortalToFollowElem,
PortalToFollowElemContent, PortalToFollowElemContent,

View File

@@ -3,7 +3,7 @@ import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Textarea from '@/app/components/base/textarea' import Textarea from '@/app/components/base/textarea'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'

View File

@@ -3,7 +3,7 @@ import type { FC } from 'react'
import React from 'react' import React from 'react'
import PromptEditor from '@/app/components/base/prompt-editor' import PromptEditor from '@/app/components/base/prompt-editor'
import type { GeneratorType } from './types' import type { GeneratorType } from './types'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { Node, NodeOutPutVar, ValueSelector } from '@/app/components/workflow/types' import type { Node, NodeOutPutVar, ValueSelector } from '@/app/components/workflow/types'
import { BlockEnum } from '@/app/components/workflow/types' import { BlockEnum } from '@/app/components/workflow/types'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'

View File

@@ -1,7 +1,7 @@
import { RiArrowDownSLine, RiSparklingFill } from '@remixicon/react' import { RiArrowDownSLine, RiSparklingFill } from '@remixicon/react'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import React from 'react' import React from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { Markdown } from '@/app/components/base/markdown' import { Markdown } from '@/app/components/base/markdown'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import s from './style.module.css' import s from './style.module.css'

View File

@@ -1,7 +1,7 @@
import React, { useCallback } from 'react' import React, { useCallback } from 'react'
import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react' import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'

View File

@@ -13,7 +13,7 @@ import Drawer from '@/app/components/base/drawer'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import Badge from '@/app/components/base/badge' import Badge from '@/app/components/base/badge'
import { useKnowledge } from '@/hooks/use-knowledge' import { useKnowledge } from '@/hooks/use-knowledge'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import AppIcon from '@/app/components/base/app-icon' import AppIcon from '@/app/components/base/app-icon'
type ItemProps = { type ItemProps = {

View File

@@ -4,7 +4,7 @@ import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import type { Props } from './var-picker' import type { Props } from './var-picker'
import VarPicker from './var-picker' import VarPicker from './var-picker'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { BracketsX } from '@/app/components/base/icons/src/vender/line/development' import { BracketsX } from '@/app/components/base/icons/src/vender/line/development'
import Tooltip from '@/app/components/base/tooltip' import Tooltip from '@/app/components/base/tooltip'

View File

@@ -3,7 +3,7 @@ import type { FC } from 'react'
import React, { useState } from 'react' import React, { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { ChevronDownIcon } from '@heroicons/react/24/outline' import { ChevronDownIcon } from '@heroicons/react/24/outline'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { import {
PortalToFollowElem, PortalToFollowElem,
PortalToFollowElemContent, PortalToFollowElemContent,

View File

@@ -20,7 +20,7 @@ import type {
DataSet, DataSet,
} from '@/models/datasets' } from '@/models/datasets'
import { RerankingModeEnum } from '@/models/datasets' import { RerankingModeEnum } from '@/models/datasets'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useSelectedDatasetsMode } from '@/app/components/workflow/nodes/knowledge-retrieval/hooks' import { useSelectedDatasetsMode } from '@/app/components/workflow/nodes/knowledge-retrieval/hooks'
import Switch from '@/app/components/base/switch' import Switch from '@/app/components/base/switch'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'

View File

@@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import { RiEqualizer2Line } from '@remixicon/react' import { RiEqualizer2Line } from '@remixicon/react'
import ConfigContent from './config-content' import ConfigContent from './config-content'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import ConfigContext from '@/context/debug-configuration' import ConfigContext from '@/context/debug-configuration'
import Modal from '@/app/components/base/modal' import Modal from '@/app/components/base/modal'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'

View File

@@ -2,7 +2,7 @@ import { memo } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import './weighted-score.css' import './weighted-score.css'
import Slider from '@/app/components/base/slider' import Slider from '@/app/components/base/slider'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { noop } from 'lodash-es' import { noop } from 'lodash-es'
const formatNumber = (value: number) => { const formatNumber = (value: number) => {

View File

@@ -10,7 +10,7 @@ import Button from '@/app/components/base/button'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import Badge from '@/app/components/base/badge' import Badge from '@/app/components/base/badge'
import { useKnowledge } from '@/hooks/use-knowledge' import { useKnowledge } from '@/hooks/use-knowledge'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import AppIcon from '@/app/components/base/app-icon' import AppIcon from '@/app/components/base/app-icon'
import { useInfiniteDatasets } from '@/service/knowledge/use-dataset' import { useInfiniteDatasets } from '@/service/knowledge/use-dataset'
import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'

View File

@@ -4,7 +4,7 @@ import { useMount } from 'ahooks'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { isEqual } from 'lodash-es' import { isEqual } from 'lodash-es'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import IndexMethod from '@/app/components/datasets/settings/index-method' import IndexMethod from '@/app/components/datasets/settings/index-method'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Input from '@/app/components/base/input' import Input from '@/app/components/base/input'

View File

@@ -1,6 +1,6 @@
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import type { FC } from 'react' import type { FC } from 'react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Divider from '@/app/components/base/divider' import Divider from '@/app/components/base/divider'
import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development' import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback' import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'

View File

@@ -7,7 +7,7 @@ import Select from '@/app/components/base/select'
import Textarea from '@/app/components/base/textarea' import Textarea from '@/app/components/base/textarea'
import { DEFAULT_VALUE_MAX_LEN } from '@/config' import { DEFAULT_VALUE_MAX_LEN } from '@/config'
import type { Inputs } from '@/models/debug' import type { Inputs } from '@/models/debug'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import BoolInput from '@/app/components/workflow/nodes/_base/components/before-run-form/bool-input' import BoolInput from '@/app/components/workflow/nodes/_base/components/before-run-form/bool-input'
type Props = { type Props = {

View File

@@ -21,7 +21,7 @@ import FeatureBar from '@/app/components/base/features/new-feature-panel/feature
import type { VisionFile, VisionSettings } from '@/types/app' import type { VisionFile, VisionSettings } from '@/types/app'
import { DEFAULT_VALUE_MAX_LEN } from '@/config' import { DEFAULT_VALUE_MAX_LEN } from '@/config'
import { useStore as useAppStore } from '@/app/components/app/store' import { useStore as useAppStore } from '@/app/components/app/store'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import BoolInput from '@/app/components/workflow/nodes/_base/components/before-run-form/bool-input' import BoolInput from '@/app/components/workflow/nodes/_base/components/before-run-form/bool-input'
export type IPromptValuePanelProps = { export type IPromptValuePanelProps = {

View File

@@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'
import { PlusIcon } from '@heroicons/react/20/solid' import { PlusIcon } from '@heroicons/react/20/solid'
import { AppTypeIcon, AppTypeLabel } from '../../type-selector' import { AppTypeIcon, AppTypeLabel } from '../../type-selector'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { App } from '@/models/explore' import type { App } from '@/models/explore'
import AppIcon from '@/app/components/base/app-icon' import AppIcon from '@/app/components/base/app-icon'

View File

@@ -11,7 +11,7 @@ import AppCard from '../app-card'
import Sidebar, { AppCategories, AppCategoryLabel } from './sidebar' import Sidebar, { AppCategories, AppCategoryLabel } from './sidebar'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import Divider from '@/app/components/base/divider' import Divider from '@/app/components/base/divider'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import ExploreContext from '@/context/explore-context' import ExploreContext from '@/context/explore-context'
import type { App } from '@/models/explore' import type { App } from '@/models/explore'
import { fetchAppDetail, fetchAppList } from '@/service/explore' import { fetchAppDetail, fetchAppList } from '@/service/explore'

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import { RiStickyNoteAddLine, RiThumbUpLine } from '@remixicon/react' import { RiStickyNoteAddLine, RiThumbUpLine } from '@remixicon/react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Divider from '@/app/components/base/divider' import Divider from '@/app/components/base/divider'
export enum AppCategories { export enum AppCategories {
@@ -40,13 +40,13 @@ type CategoryItemProps = {
} }
function CategoryItem({ category, active, onClick }: CategoryItemProps) { function CategoryItem({ category, active, onClick }: CategoryItemProps) {
return <li return <li
className={classNames('group flex h-8 cursor-pointer items-center gap-2 rounded-lg p-1 pl-3 hover:bg-state-base-hover [&.active]:bg-state-base-active', active && 'active')} className={cn('group flex h-8 cursor-pointer items-center gap-2 rounded-lg p-1 pl-3 hover:bg-state-base-hover [&.active]:bg-state-base-active', active && 'active')}
onClick={() => { onClick?.(category) }}> onClick={() => { onClick?.(category) }}>
{category === AppCategories.RECOMMENDED && <div className='inline-flex h-5 w-5 items-center justify-center rounded-md'> {category === AppCategories.RECOMMENDED && <div className='inline-flex h-5 w-5 items-center justify-center rounded-md'>
<RiThumbUpLine className='h-4 w-4 text-components-menu-item-text group-[.active]:text-components-menu-item-text-active' /> <RiThumbUpLine className='h-4 w-4 text-components-menu-item-text group-[.active]:text-components-menu-item-text-active' />
</div>} </div>}
<AppCategoryLabel category={category} <AppCategoryLabel category={category}
className={classNames('system-sm-medium text-components-menu-item-text group-hover:text-components-menu-item-text-hover group-[.active]:text-components-menu-item-text-active', active && 'system-sm-semibold')} /> className={cn('system-sm-medium text-components-menu-item-text group-hover:text-components-menu-item-text-hover group-[.active]:text-components-menu-item-text-active', active && 'system-sm-semibold')} />
</li > </li >
} }

View File

@@ -13,7 +13,7 @@ import AppIconPicker from '../../base/app-icon-picker'
import type { AppIconSelection } from '../../base/app-icon-picker' import type { AppIconSelection } from '../../base/app-icon-picker'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Divider from '@/app/components/base/divider' import Divider from '@/app/components/base/divider'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { basePath } from '@/utils/var' import { basePath } from '@/utils/var'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'

View File

@@ -25,7 +25,7 @@ import { useProviderContext } from '@/context/provider-context'
import AppsFull from '@/app/components/billing/apps-full-in-dialog' import AppsFull from '@/app/components/billing/apps-full-in-dialog'
import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
import { getRedirection } from '@/utils/app-redirection' import { getRedirection } from '@/utils/app-redirection'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks' import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
import { noop } from 'lodash-es' import { noop } from 'lodash-es'
import { trackEvent } from '@/app/components/base/amplitude' import { trackEvent } from '@/app/components/base/amplitude'

View File

@@ -8,7 +8,7 @@ import {
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import { formatFileSize } from '@/utils/format' import { formatFileSize } from '@/utils/format'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { Yaml as YamlIcon } from '@/app/components/base/icons/src/public/files' import { Yaml as YamlIcon } from '@/app/components/base/icons/src/public/files'
import { ToastContext } from '@/app/components/base/toast' import { ToastContext } from '@/app/components/base/toast'
import ActionButton from '@/app/components/base/action-button' import ActionButton from '@/app/components/base/action-button'

View File

@@ -3,7 +3,7 @@ import React, { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import AppIconPicker from '../../base/app-icon-picker' import AppIconPicker from '../../base/app-icon-picker'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Modal from '@/app/components/base/modal' import Modal from '@/app/components/base/modal'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Input from '@/app/components/base/input' import Input from '@/app/components/base/input'

View File

@@ -3,7 +3,7 @@ import type { FC } from 'react'
import React, { useMemo } from 'react' import React, { useMemo } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Log from '@/app/components/app/log' import Log from '@/app/components/app/log'
import WorkflowLog from '@/app/components/app/workflow-log' import WorkflowLog from '@/app/components/app/workflow-log'
import Annotation from '@/app/components/app/annotation' import Annotation from '@/app/components/app/annotation'

View File

@@ -39,7 +39,7 @@ import Tooltip from '@/app/components/base/tooltip'
import CopyIcon from '@/app/components/base/copy-icon' import CopyIcon from '@/app/components/base/copy-icon'
import { buildChatItemTree, getThreadMessages } from '@/app/components/base/chat/utils' import { buildChatItemTree, getThreadMessages } from '@/app/components/base/chat/utils'
import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils' import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { noop } from 'lodash-es' import { noop } from 'lodash-es'
import PromptLogModal from '../../base/prompt-log-modal' import PromptLogModal from '../../base/prompt-log-modal'
import { WorkflowContextProvider } from '@/app/components/workflow/context' import { WorkflowContextProvider } from '@/app/components/workflow/context'

View File

@@ -13,7 +13,7 @@ import {
PortalToFollowElemTrigger, PortalToFollowElemTrigger,
} from '@/app/components/base/portal-to-follow-elem' } from '@/app/components/base/portal-to-follow-elem'
import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
const PARAM_MAP = { const PARAM_MAP = {
temperature: 'Temperature', temperature: 'Temperature',

View File

@@ -9,7 +9,7 @@ import {
} from '@remixicon/react' } from '@remixicon/react'
import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development' import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
import ImagePreview from '@/app/components/base/image-uploader/image-preview' import ImagePreview from '@/app/components/base/image-uploader/image-preview'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type Props = { type Props = {
varList: { label: string; value: string }[] varList: { label: string; value: string }[]

View File

@@ -3,7 +3,7 @@ import type { FC } from 'react'
import React, { useState } from 'react' import React, { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general' import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
import { IS_CE_EDITION } from '@/config' import { IS_CE_EDITION } from '@/config'

View File

@@ -14,7 +14,7 @@ import type { SiteInfo } from '@/models/share'
import { useThemeContext } from '@/app/components/base/chat/embedded-chatbot/theme/theme-context' import { useThemeContext } from '@/app/components/base/chat/embedded-chatbot/theme/theme-context'
import ActionButton from '@/app/components/base/action-button' import ActionButton from '@/app/components/base/action-button'
import { basePath } from '@/utils/var' import { basePath } from '@/utils/var'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type Props = { type Props = {
siteInfo?: SiteInfo siteInfo?: SiteInfo

View File

@@ -25,7 +25,7 @@ import { useModalContext } from '@/context/modal-context'
import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants'
import type { AppIconSelection } from '@/app/components/base/app-icon-picker' import type { AppIconSelection } from '@/app/components/base/app-icon-picker'
import AppIconPicker from '@/app/components/base/app-icon-picker' import AppIconPicker from '@/app/components/base/app-icon-picker'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useDocLink } from '@/context/i18n' import { useDocLink } from '@/context/i18n'
export type ISettingsModalProps = { export type ISettingsModalProps = {

View File

@@ -6,7 +6,7 @@ import { useContext } from 'use-context-selector'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiCloseLine } from '@remixicon/react' import { RiCloseLine } from '@remixicon/react'
import AppIconPicker from '../../base/app-icon-picker' import AppIconPicker from '../../base/app-icon-picker'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import Checkbox from '@/app/components/base/checkbox' import Checkbox from '@/app/components/base/checkbox'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Input from '@/app/components/base/input' import Input from '@/app/components/base/input'

View File

@@ -30,7 +30,7 @@ import type { SiteInfo } from '@/models/share'
import { useChatContext } from '@/app/components/base/chat/chat/context' import { useChatContext } from '@/app/components/base/chat/chat/context'
import ActionButton, { ActionButtonState } from '@/app/components/base/action-button' import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
import NewAudioButton from '@/app/components/base/new-audio-button' import NewAudioButton from '@/app/components/base/new-audio-button'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
const MAX_DEPTH = 3 const MAX_DEPTH = 3

View File

@@ -8,7 +8,7 @@ import {
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import copy from 'copy-to-clipboard' import copy from 'copy-to-clipboard'
import NoData from './no-data' import NoData from './no-data'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { SavedMessage } from '@/models/debug' import type { SavedMessage } from '@/models/debug'
import { Markdown } from '@/app/components/base/markdown' import { Markdown } from '@/app/components/base/markdown'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'

View File

@@ -2,7 +2,7 @@ import { useTranslation } from 'react-i18next'
import React, { useState } from 'react' import React, { useState } from 'react'
import { RiArrowDownSLine, RiCloseCircleFill, RiExchange2Fill, RiFilter3Line } from '@remixicon/react' import { RiArrowDownSLine, RiCloseCircleFill, RiExchange2Fill, RiFilter3Line } from '@remixicon/react'
import Checkbox from '../../base/checkbox' import Checkbox from '../../base/checkbox'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { import {
PortalToFollowElem, PortalToFollowElem,
PortalToFollowElemContent, PortalToFollowElemContent,

View File

@@ -12,7 +12,7 @@ import Drawer from '@/app/components/base/drawer'
import Indicator from '@/app/components/header/indicator' import Indicator from '@/app/components/header/indicator'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import useTimestamp from '@/hooks/use-timestamp' import useTimestamp from '@/hooks/use-timestamp'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { WorkflowRunTriggeredFrom } from '@/models/log' import type { WorkflowRunTriggeredFrom } from '@/models/log'
type ILogs = { type ILogs = {

View File

@@ -5,7 +5,7 @@ import { useContext } from 'use-context-selector'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiBuildingLine, RiGlobalLine, RiLockLine, RiMoreFill, RiVerifiedBadgeLine } from '@remixicon/react' import { RiBuildingLine, RiGlobalLine, RiLockLine, RiMoreFill, RiVerifiedBadgeLine } from '@remixicon/react'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { type App, AppModeEnum } from '@/types/app' import { type App, AppModeEnum } from '@/types/app'
import Toast, { ToastContext } from '@/app/components/base/toast' import Toast, { ToastContext } from '@/app/components/base/toast'
import { copyApp, deleteApp, exportAppConfig, updateAppInfo } from '@/service/apps' import { copyApp, deleteApp, exportAppConfig, updateAppInfo } from '@/service/apps'

View File

@@ -9,7 +9,7 @@ import { useTranslation } from 'react-i18next'
import { CreateFromDSLModalTab } from '@/app/components/app/create-from-dsl-modal' import { CreateFromDSLModalTab } from '@/app/components/app/create-from-dsl-modal'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import dynamic from 'next/dynamic' import dynamic from 'next/dynamic'
const CreateAppModal = dynamic(() => import('@/app/components/app/create-app-modal'), { const CreateAppModal = dynamic(() => import('@/app/components/app/create-app-modal'), {

View File

@@ -1,7 +1,7 @@
import type { CSSProperties } from 'react' import type { CSSProperties } from 'react'
import React from 'react' import React from 'react'
import { type VariantProps, cva } from 'class-variance-authority' import { type VariantProps, cva } from 'class-variance-authority'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
enum ActionButtonState { enum ActionButtonState {
Destructive = 'destructive', Destructive = 'destructive',
@@ -54,10 +54,8 @@ const ActionButton = ({ className, size, state = ActionButtonState.Default, styl
return ( return (
<button <button
type='button' type='button'
className={classNames( className={cn(actionButtonVariants({ className, size }),
actionButtonVariants({ className, size }), getActionButtonState(state))}
getActionButtonState(state),
)}
ref={ref} ref={ref}
style={styleCss} style={styleCss}
{...props} {...props}

View File

@@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next'
import { flatten, uniq } from 'lodash-es' import { flatten, uniq } from 'lodash-es'
import ResultPanel from './result' import ResultPanel from './result'
import TracingPanel from './tracing' import TracingPanel from './tracing'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { ToastContext } from '@/app/components/base/toast' import { ToastContext } from '@/app/components/base/toast'
import Loading from '@/app/components/base/loading' import Loading from '@/app/components/base/loading'
import { fetchAgentLogDetail } from '@/service/log' import { fetchAgentLogDetail } from '@/service/log'

View File

@@ -4,7 +4,7 @@ import { RiCloseLine } from '@remixicon/react'
import { useEffect, useRef, useState } from 'react' import { useEffect, useRef, useState } from 'react'
import { useClickAway } from 'ahooks' import { useClickAway } from 'ahooks'
import AgentLogDetail from './detail' import AgentLogDetail from './detail'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { IChatItem } from '@/app/components/base/chat/chat/type' import type { IChatItem } from '@/app/components/base/chat/chat/type'
type AgentLogModalProps = { type AgentLogModalProps = {

View File

@@ -4,7 +4,7 @@ import type { FC } from 'react'
import ToolCall from './tool-call' import ToolCall from './tool-call'
import Divider from '@/app/components/base/divider' import Divider from '@/app/components/base/divider'
import type { AgentIteration } from '@/models/log' import type { AgentIteration } from '@/models/log'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type Props = { type Props = {
isFinal: boolean isFinal: boolean

View File

@@ -6,7 +6,7 @@ import {
RiErrorWarningLine, RiErrorWarningLine,
} from '@remixicon/react' } from '@remixicon/react'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import BlockIcon from '@/app/components/workflow/block-icon' import BlockIcon from '@/app/components/workflow/block-icon'
import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor' import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
import { CodeLanguage } from '@/app/components/workflow/nodes/code/types' import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'

View File

@@ -3,7 +3,7 @@
import type { FC } from 'react' import type { FC } from 'react'
import { init } from 'emoji-mart' import { init } from 'emoji-mart'
import data from '@emoji-mart/data' import data from '@emoji-mart/data'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { AppIconType } from '@/types/app' import type { AppIconType } from '@/types/app'
init({ data }) init({ data })
@@ -21,8 +21,7 @@ const AnswerIcon: FC<AnswerIconProps> = ({
background, background,
imageUrl, imageUrl,
}) => { }) => {
const wrapperClassName = classNames( const wrapperClassName = cn('flex',
'flex',
'items-center', 'items-center',
'justify-center', 'justify-center',
'w-full', 'w-full',
@@ -30,8 +29,7 @@ const AnswerIcon: FC<AnswerIconProps> = ({
'rounded-full', 'rounded-full',
'border-[0.5px]', 'border-[0.5px]',
'border-black/5', 'border-black/5',
'text-xl', 'text-xl')
)
const isValidImageIcon = iconType === 'image' && imageUrl const isValidImageIcon = iconType === 'image' && imageUrl
return <div return <div
className={wrapperClassName} className={wrapperClassName}

View File

@@ -3,7 +3,7 @@
import type { ChangeEvent, FC } from 'react' import type { ChangeEvent, FC } from 'react'
import { createRef, useEffect, useState } from 'react' import { createRef, useEffect, useState } from 'react'
import Cropper, { type Area, type CropperProps } from 'react-easy-crop' import Cropper, { type Area, type CropperProps } from 'react-easy-crop'
import classNames from 'classnames' import { cn } from '@/utils/classnames'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { ImagePlus } from '../icons/src/vender/line/images' import { ImagePlus } from '../icons/src/vender/line/images'
@@ -90,10 +90,9 @@ const ImageInput: FC<UploaderProps> = ({
} }
return ( return (
<div className={classNames(className, 'w-full px-3 py-1.5')}> <div className={cn(className, 'w-full px-3 py-1.5')}>
<div <div
className={classNames( className={cn(isDragActive && 'border-primary-600',
isDragActive && 'border-primary-600',
'relative flex aspect-square flex-col items-center justify-center rounded-lg border-[1.5px] border-dashed text-gray-500')} 'relative flex aspect-square flex-col items-center justify-center rounded-lg border-[1.5px] border-dashed text-gray-500')}
onDragEnter={handleDragEnter} onDragEnter={handleDragEnter}
onDragOver={handleDragOver} onDragOver={handleDragOver}

View File

@@ -12,7 +12,7 @@ import ImageInput from './ImageInput'
import s from './style.module.css' import s from './style.module.css'
import getCroppedImg from './utils' import getCroppedImg from './utils'
import type { AppIconType, ImageFile } from '@/types/app' import type { AppIconType, ImageFile } from '@/types/app'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { DISABLE_UPLOAD_IMAGE_AS_ICON } from '@/config' import { DISABLE_UPLOAD_IMAGE_AS_ICON } from '@/config'
import { noop } from 'lodash-es' import { noop } from 'lodash-es'
import { RiImageCircleAiLine } from '@remixicon/react' import { RiImageCircleAiLine } from '@remixicon/react'

View File

@@ -5,7 +5,7 @@ import { init } from 'emoji-mart'
import data from '@emoji-mart/data' import data from '@emoji-mart/data'
import { cva } from 'class-variance-authority' import { cva } from 'class-variance-authority'
import type { AppIconType } from '@/types/app' import type { AppIconType } from '@/types/app'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
import { useHover } from 'ahooks' import { useHover } from 'ahooks'
import { RiEditLine } from '@remixicon/react' import { RiEditLine } from '@remixicon/react'
@@ -107,7 +107,7 @@ const AppIcon: FC<AppIconProps> = ({
return ( return (
<span <span
ref={wrapperRef} ref={wrapperRef}
className={classNames(appIconVariants({ size, rounded }), className)} className={cn(appIconVariants({ size, rounded }), className)}
style={{ background: isValidImageIcon ? undefined : (background || '#FFEAD5') }} style={{ background: isValidImageIcon ? undefined : (background || '#FFEAD5') }}
onClick={onClick} onClick={onClick}
> >

View File

@@ -1,5 +1,5 @@
'use client' 'use client'
import classNames from '@/utils/classnames' import { cn } from '@/utils/classnames'
import type { FC } from 'react' import type { FC } from 'react'
import React from 'react' import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@@ -20,7 +20,7 @@ const AppUnavailable: FC<IAppUnavailableProps> = ({
const { t } = useTranslation() const { t } = useTranslation()
return ( return (
<div className={classNames('flex h-screen w-screen items-center justify-center', className)}> <div className={cn('flex h-screen w-screen items-center justify-center', className)}>
<h1 className='mr-5 h-[50px] shrink-0 pr-5 text-[24px] font-medium leading-[50px]' <h1 className='mr-5 h-[50px] shrink-0 pr-5 text-[24px] font-medium leading-[50px]'
style={{ style={{
borderRight: '1px solid rgba(0,0,0,.3)', borderRight: '1px solid rgba(0,0,0,.3)',

View File

@@ -7,7 +7,7 @@ import {
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import useTheme from '@/hooks/use-theme' import useTheme from '@/hooks/use-theme'
import { Theme } from '@/types/app' import { Theme } from '@/types/app'
import cn from '@/utils/classnames' import { cn } from '@/utils/classnames'
type AudioPlayerProps = { type AudioPlayerProps = {
src?: string // Keep backward compatibility src?: string // Keep backward compatibility

Some files were not shown because too many files have changed in this diff Show More