| | |
| | | PortalToFollowElemTrigger, |
| | | } from '@/app/components/base/portal-to-follow-elem' |
| | | import { BubbleTextMod, ChatBot, ListSparkle, Logic } from '@/app/components/base/icons/src/vender/solid/communication' |
| | | import type { AppMode } from '@/types/app' |
| | | import { type AppMode } from '@/types/app' |
| | | export type AppSelectorProps = { |
| | | value: Array<AppMode> |
| | | onChange: (value: AppSelectorProps['value']) => void |
| | |
| | | className='block' |
| | | > |
| | | <div className={cn( |
| | | 'flex cursor-pointer items-center justify-between space-x-1 rounded-md px-2 hover:bg-state-base-hover', |
| | | 'flex items-center justify-between rounded-md cursor-pointer px-2 space-x-1 hover:bg-state-base-hover', |
| | | )}> |
| | | <AppTypeSelectTrigger values={value} /> |
| | | {value && value.length > 0 && <div className='h-4 w-4' onClick={(e) => { |
| | | {value && value.length > 0 && <div className='w-4 h-4' onClick={(e) => { |
| | | e.stopPropagation() |
| | | onChange([]) |
| | | }}> |
| | | <RiCloseCircleFill className='h-3.5 w-3.5 cursor-pointer text-text-quaternary hover:text-text-tertiary' /> |
| | | <RiCloseCircleFill className='w-3.5 h-3.5 text-text-quaternary hover:text-text-tertiary cursor-pointer' /> |
| | | </div>} |
| | | </div> |
| | | </PortalToFollowElemTrigger> |
| | | <PortalToFollowElemContent className='z-[1002]'> |
| | | <ul className='relative w-[240px] rounded-xl border border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-[5px]'> |
| | | <ul className='relative p-1 w-[240px] bg-components-panel-bg-blur backdrop-blur-[5px] rounded-xl shadow-lg border border-components-panel-border'> |
| | | {allTypes.map(mode => ( |
| | | <AppTypeSelectorItem key={mode} type={mode} |
| | | checked={Boolean(value.length > 0 && value?.indexOf(mode) !== -1)} |
| | |
| | | const { t } = useTranslation() |
| | | if (!values || values.length === 0) { |
| | | return <div className={cn( |
| | | 'flex h-8 items-center justify-between gap-1', |
| | | 'flex items-center justify-between gap-1 h-8', |
| | | )}> |
| | | <RiFilter3Line className='h-4 w-4 text-text-tertiary' /> |
| | | <div className='system-sm-medium min-w-[65px] grow text-center text-text-tertiary'>{t('app.typeSelector.all')}</div> |
| | | <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' /> |
| | | <RiFilter3Line className='w-4 h-4 text-text-tertiary' /> |
| | | <div className='grow min-w-[65px] text-center system-sm-medium text-text-tertiary'>{t('app.typeSelector.all')}</div> |
| | | <RiArrowDownSLine className='w-4 h-4 text-text-tertiary' /> |
| | | </div> |
| | | } |
| | | if (values.length === 1) { |
| | | return <div className={cn( |
| | | 'flex h-8 flex-nowrap items-center justify-between gap-1', |
| | | 'flex items-center justify-between gap-1 h-8 flex-nowrap', |
| | | )}> |
| | | <AppTypeIcon type={values[0]} /> |
| | | <div className='line-clamp-1 flex flex-1 items-center text-center'> |
| | | <div className='flex flex-1 items-center text-center line-clamp-1'> |
| | | <AppTypeLabel type={values[0]} className="system-sm-medium text-components-menu-item-text" /> |
| | | </div> |
| | | </div> |
| | | } |
| | | return <div className={cn( |
| | | 'relative flex h-8 items-center justify-between -space-x-2', |
| | | 'flex items-center justify-between h-8 -space-x-2 relative', |
| | | )}> |
| | | {values.map((mode, index) => (<AppTypeIcon key={mode} type={mode} wrapperClassName='border border-components-panel-on-panel-item-bg' style={{ zIndex: 5 - index }} />))} |
| | | </div> |
| | |
| | | onClick: () => void |
| | | } |
| | | function AppTypeSelectorItem({ checked, type, onClick }: AppTypeSelectorItemProps) { |
| | | return <li className='flex cursor-pointer items-center space-x-2 rounded-lg py-1 pl-2 pr-1 hover:bg-state-base-hover' onClick={onClick}> |
| | | return <li className='flex items-center space-x-2 pl-2 py-1 pr-1 rounded-lg cursor-pointer hover:bg-state-base-hover' onClick={onClick}> |
| | | <Checkbox checked={checked} /> |
| | | <AppTypeIcon type={type} /> |
| | | <div className='grow p-1 pl-0'> |
| | |
| | | } |
| | | |
| | | export function AppTypeIcon({ type, className, wrapperClassName, style }: AppTypeIconProps) { |
| | | const wrapperClassNames = cn('inline-flex h-5 w-5 items-center justify-center rounded-md border border-divider-regular', wrapperClassName) |
| | | const iconClassNames = cn('h-3.5 w-3.5 text-components-avatar-shape-fill-stop-100', className) |
| | | const wrapperClassNames = cn('w-5 h-5 inline-flex items-center justify-center rounded-md border border-divider-regular', wrapperClassName) |
| | | const iconClassNames = cn('w-3.5 h-3.5 text-components-avatar-shape-fill-stop-100', className) |
| | | if (type === 'chat') { |
| | | return <div style={style} className={cn(wrapperClassNames, 'bg-components-icon-bg-blue-solid')}> |
| | | <ChatBot className={iconClassNames} /> |