CI / changes (push) Successful in 5s
CI / openapi (push) Successful in 39s
CI / web (push) Successful in 55s
CI / go (push) Successful in 2m40s
CI / bird2 (push) Successful in 16s
CI / commitlint (push) Skipped
CI / release (push) Successful in 18s
Выровнять KPI на IconTile, вынести settings из settings-7, Sheet/AlertDialog и skip-link в общем chrome. Co-authored-by: Cursor <cursoragent@cursor.com>
54 lines
1.3 KiB
TypeScript
54 lines
1.3 KiB
TypeScript
import { type ReactNode } from 'react'
|
|
|
|
import { cn } from '@evobgp/ui/lib/utils'
|
|
import {
|
|
Frame,
|
|
FrameDescription,
|
|
FrameFooter,
|
|
FrameHeader,
|
|
FramePanel,
|
|
FrameTitle,
|
|
} from '@/components/reui/frame'
|
|
|
|
interface SettingsCardProps {
|
|
title: string
|
|
description?: string
|
|
children: ReactNode
|
|
footer?: ReactNode
|
|
className?: string
|
|
contentClassName?: string
|
|
footerClassName?: string
|
|
}
|
|
|
|
/** Settings section — Frame surface. Preview: https://reui.io/preview/base/settings-16 · https://reui.io/preview/base/settings-3 */
|
|
export function SettingsCard({
|
|
title,
|
|
description,
|
|
children,
|
|
footer,
|
|
className,
|
|
contentClassName,
|
|
footerClassName,
|
|
}: SettingsCardProps) {
|
|
return (
|
|
<Frame dense spacing="sm" className={cn('w-full gap-0 p-0', className)}>
|
|
<FramePanel className="flex flex-col gap-0 p-0 shadow-xs">
|
|
<FrameHeader className="gap-0 border-b px-5 py-3">
|
|
<FrameTitle>{title}</FrameTitle>
|
|
{description ? <FrameDescription>{description}</FrameDescription> : null}
|
|
</FrameHeader>
|
|
|
|
<div className={cn('min-w-0', contentClassName)}>{children}</div>
|
|
|
|
{footer ? (
|
|
<FrameFooter
|
|
className={cn('justify-end gap-2 border-t px-5 py-3', footerClassName)}
|
|
>
|
|
{footer}
|
|
</FrameFooter>
|
|
) : null}
|
|
</FramePanel>
|
|
</Frame>
|
|
)
|
|
}
|