import { Button as ButtonPrimitive } from "@base-ui/react/button"
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "cn"
const buttonVariants = cva(
"cn-button group/button inline-flex shrink-0 items-center justify-center whitespace-nowrap transition-all outline-none select-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
{
variants: {
variant: {
default: "cn-button-variant-default",
outline: "cn-button-variant-outline",
secondary: "cn-button-variant-secondary",
ghost: "cn-button-variant-ghost",
destructive: "cn-button-variant-destructive",
link: "cn-button-variant-link",
},
size: {
default: "cn-button-size-default",
xs: "cn-button-size-xs",
sm: "cn-button-size-sm",
lg: "cn-button-size-lg",
icon: "cn-button-size-icon",
"icon-xs": "cn-button-size-icon-xs",
"icon-sm": "cn-button-size-icon-sm",
"icon-lg": "cn-button-size-icon-lg",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
function Button({
className,
variant = "default",
size = "default",
...props
}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {
return (
<ButtonPrimitive
data-slot="button"
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>
)
}
export { Button, buttonVariants }
Publish controls with split button and overflow
By Sean Hello
Try the interaction, copy the React source files, or download the complete example.
About Publish controls with split button and overflow
Publish controls with split button and overflow is an animated React and Tailwind CSS button by Sean Hello. Try the interaction, copy the React source, or download the example with creator credit.
- Effects and categories
- Hover effects, Animated
- Using this example
- Copy a TSX file or download the original source and standalone demo. Test keyboard focus, motion and contrast in your own project.
Usage, Tailwind and licensing questions
Read the source files
registry-reui/bases/base/components/button-group/c-button-group-53.tsx
import {
Avatar,
AvatarFallback,
AvatarGroup,
AvatarImage,
} from "@/registry/bases/base/ui/avatar"
import { Button } from "@/registry/bases/base/ui/button"
import {
ButtonGroup,
ButtonGroupSeparator,
} from "@/registry/bases/base/ui/button-group"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/registry/bases/base/ui/dropdown-menu"
import { Separator } from "@/registry/bases/base/ui/separator"
const viewers = [
{
src: "https://images.unsplash.com/photo-1519699047748-de8e457a634e?w=96&h=96&dpr=2&q=80",
initials: "SC",
name: "Sarah Chen",
},
{
src: "https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=96&h=96&dpr=2&q=80",
initials: "AJ",
name: "Alex Johnson",
},
]
export default function Pattern() {
return (
<div className="flex shrink-0 items-center gap-2">
<AvatarGroup>
{viewers.map((viewer) => (
<Avatar key={viewer.name} size="sm">
<AvatarImage src={viewer.src} alt={viewer.name} />
<AvatarFallback>{viewer.initials}</AvatarFallback>
</Avatar>
))}
</AvatarGroup>
<Separator orientation="vertical" className="my-auto h-4" />
<Button variant="outline" size="sm">
<ImportedEyeIcon
aria-hidden="true"
/>
<span className="hidden md:block">Preview</span>
</Button>
<ButtonGroup className="**:data-[slot=button]:border-r-0">
<Button size="sm">
<ImportedSendIcon
aria-hidden="true"
/>
Publish
</Button>
<ButtonGroupSeparator className="bg-primary/72" />
<DropdownMenu>
<DropdownMenuTrigger
render={
<Button
size="icon-sm"
className="border-primary-foreground/20 rounded-l-none border-l"
aria-label="More publish options"
/>
}
>
<ImportedChevronDownIcon
aria-hidden="true"
/>
</DropdownMenuTrigger>
<DropdownMenuContent sideOffset={8} align="end" className="w-48">
<DropdownMenuGroup>
<DropdownMenuItem>
<ImportedCalendarIcon
className="size-4 opacity-60"
aria-hidden="true"
/>
Schedule for later
</DropdownMenuItem>
<DropdownMenuItem>
<ImportedFileIcon
className="size-4 opacity-60"
aria-hidden="true"
/>
Save as draft
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</ButtonGroup>
<DropdownMenu>
<DropdownMenuTrigger
render={
<Button variant="ghost" size="icon-sm" aria-label="More actions" />
}
>
<ImportedMoreHorizontalIcon
aria-hidden="true"
/>
</DropdownMenuTrigger>
<DropdownMenuContent sideOffset={8} align="end" className="w-40">
<DropdownMenuGroup>
<DropdownMenuItem>
<ImportedCopyIcon
className="size-4 opacity-60"
aria-hidden="true"
/>
Duplicate
</DropdownMenuItem>
<DropdownMenuItem>
<ImportedHistoryIcon
className="size-4 opacity-60"
aria-hidden="true"
/>
View history
</DropdownMenuItem>
<DropdownMenuItem>
<ImportedArchiveIcon
className="size-4 opacity-60"
aria-hidden="true"
/>
Archive
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">
<ImportedTrashIcon
aria-hidden="true"
/>
Delete
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</div>
)
}
import {EyeIcon as ImportedEyeIcon,SendIcon as ImportedSendIcon,ChevronDownIcon as ImportedChevronDownIcon,CalendarIcon as ImportedCalendarIcon,FileIcon as ImportedFileIcon,MoreHorizontalIcon as ImportedMoreHorizontalIcon,CopyIcon as ImportedCopyIcon,HistoryIcon as ImportedHistoryIcon,ArchiveIcon as ImportedArchiveIcon,TrashIcon as ImportedTrashIcon} from "lucide-react";
registry/bases/base/ui/button-group.tsx
import { mergeProps } from "@base-ui/react/merge-props"
import { useRender } from "@base-ui/react/use-render"
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "cn"
import { Separator } from "@/registry/bases/base/ui/separator"
const buttonGroupVariants = cva(
"cn-button-group flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
{
variants: {
orientation: {
horizontal:
"cn-button-group-orientation-horizontal *:data-slot:rounded-r-none [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0",
vertical:
"cn-button-group-orientation-vertical flex-col *:data-slot:rounded-b-none [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0",
},
},
defaultVariants: {
orientation: "horizontal",
},
}
)
function ButtonGroup({
className,
orientation,
...props
}: React.ComponentProps<"div"> & VariantProps<typeof buttonGroupVariants>) {
return (
<div
role="group"
data-slot="button-group"
data-orientation={orientation}
className={cn(buttonGroupVariants({ orientation }), className)}
{...props}
/>
)
}
function ButtonGroupText({
className,
render,
...props
}: useRender.ComponentProps<"div">) {
return useRender({
defaultTagName: "div",
props: mergeProps<"div">(
{
className: cn(
"cn-button-group-text flex items-center [&_svg]:pointer-events-none",
className
),
},
props
),
render,
state: {
slot: "button-group-text",
},
})
}
function ButtonGroupSeparator({
className,
orientation = "vertical",
...props
}: React.ComponentProps<typeof Separator>) {
return (
<Separator
data-slot="button-group-separator"
orientation={orientation}
className={cn(
"cn-button-group-separator relative self-stretch data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto",
className
)}
{...props}
/>
)
}
export {
ButtonGroup,
ButtonGroupSeparator,
ButtonGroupText,
buttonGroupVariants,
}
registry/bases/base/ui/button.tsx
import { Button as ButtonPrimitive } from "@base-ui/react/button"
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "cn"
const buttonVariants = cva(
"cn-button group/button inline-flex shrink-0 items-center justify-center whitespace-nowrap transition-all outline-none select-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
{
variants: {
variant: {
default: "cn-button-variant-default",
outline: "cn-button-variant-outline",
secondary: "cn-button-variant-secondary",
ghost: "cn-button-variant-ghost",
destructive: "cn-button-variant-destructive",
link: "cn-button-variant-link",
},
size: {
default: "cn-button-size-default",
xs: "cn-button-size-xs",
sm: "cn-button-size-sm",
lg: "cn-button-size-lg",
icon: "cn-button-size-icon",
"icon-xs": "cn-button-size-icon-xs",
"icon-sm": "cn-button-size-icon-sm",
"icon-lg": "cn-button-size-icon-lg",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
function Button({
className,
variant = "default",
size = "default",
...props
}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {
return (
<ButtonPrimitive
data-slot="button"
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>
)
}
export { Button, buttonVariants }
registry/bases/base/ui/avatar.tsx
"use client"
import * as React from "react"
import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"
import { cn } from "cn"
function Avatar({
className,
size = "default",
...props
}: AvatarPrimitive.Root.Props & {
size?: "default" | "sm" | "lg"
}) {
return (
<AvatarPrimitive.Root
data-slot="avatar"
data-size={size}
className={cn(
"cn-avatar group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:border-border after:mix-blend-darken dark:after:mix-blend-lighten",
className
)}
{...props}
/>
)
}
function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {
return (
<AvatarPrimitive.Image
data-slot="avatar-image"
className={cn(
"cn-avatar-image aspect-square size-full object-cover",
className
)}
{...props}
/>
)
}
function AvatarFallback({
className,
...props
}: AvatarPrimitive.Fallback.Props) {
return (
<AvatarPrimitive.Fallback
data-slot="avatar-fallback"
className={cn(
"cn-avatar-fallback flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs",
className
)}
{...props}
/>
)
}
function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
return (
<span
data-slot="avatar-badge"
className={cn(
"cn-avatar-badge absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 select-none",
"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
className
)}
{...props}
/>
)
}
function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="avatar-group"
className={cn(
"cn-avatar-group group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background",
className
)}
{...props}
/>
)
}
function AvatarGroupCount({
className,
...props
}: React.ComponentProps<"div">) {
return (
<div
data-slot="avatar-group-count"
className={cn(
"cn-avatar-group-count relative flex shrink-0 items-center justify-center ring-2 ring-background",
"",
className
)}
{...props}
/>
)
}
export {
Avatar,
AvatarImage,
AvatarFallback,
AvatarGroup,
AvatarGroupCount,
AvatarBadge,
}
registry/bases/base/ui/dropdown-menu.tsx
"use client"
import * as React from "react"
import { Menu as MenuPrimitive } from "@base-ui/react/menu"
import { cn } from "cn"
function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {
return <MenuPrimitive.Root data-slot="dropdown-menu" {...props} />
}
function DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {
return <MenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
}
function DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {
return <MenuPrimitive.Trigger data-slot="dropdown-menu-trigger" {...props} />
}
function DropdownMenuContent({
align = "start",
alignOffset = 0,
side = "bottom",
sideOffset = 4,
className,
...props
}: MenuPrimitive.Popup.Props &
Pick<
MenuPrimitive.Positioner.Props,
"align" | "alignOffset" | "side" | "sideOffset"
>) {
return (
<MenuPrimitive.Portal>
<MenuPrimitive.Positioner
className="isolate z-50 outline-none"
align={align}
alignOffset={alignOffset}
side={side}
sideOffset={sideOffset}
>
<MenuPrimitive.Popup
data-slot="dropdown-menu-content"
className={cn(
"cn-dropdown-menu-content cn-dropdown-menu-content-logical cn-menu-target cn-menu-translucent z-50 max-h-(--available-height) w-(--anchor-width) origin-(--transform-origin) overflow-x-hidden overflow-y-auto outline-none data-closed:overflow-hidden",
className
)}
{...props}
/>
</MenuPrimitive.Positioner>
</MenuPrimitive.Portal>
)
}
function DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {
return <MenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
}
function DropdownMenuLabel({
className,
inset,
...props
}: MenuPrimitive.GroupLabel.Props & {
inset?: boolean
}) {
return (
<MenuPrimitive.GroupLabel
data-slot="dropdown-menu-label"
data-inset={inset}
className={cn("cn-dropdown-menu-label", className)}
{...props}
/>
)
}
function DropdownMenuItem({
className,
inset,
variant = "default",
...props
}: MenuPrimitive.Item.Props & {
inset?: boolean
variant?: "default" | "destructive"
}) {
return (
<MenuPrimitive.Item
data-slot="dropdown-menu-item"
data-inset={inset}
data-variant={variant}
className={cn(
"cn-dropdown-menu-item group/dropdown-menu-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
className
)}
{...props}
/>
)
}
function DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {
return <MenuPrimitive.SubmenuRoot data-slot="dropdown-menu-sub" {...props} />
}
function DropdownMenuSubTrigger({
className,
inset,
children,
...props
}: MenuPrimitive.SubmenuTrigger.Props & {
inset?: boolean
}) {
return (
<MenuPrimitive.SubmenuTrigger
data-slot="dropdown-menu-sub-trigger"
data-inset={inset}
className={cn(
"cn-dropdown-menu-sub-trigger flex cursor-default items-center outline-hidden select-none data-popup-open:bg-accent data-popup-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0",
className
)}
{...props}
>
{children}
<ImportedChevronRightIcon
className="cn-rtl-flip ml-auto"
/>
</MenuPrimitive.SubmenuTrigger>
)
}
function DropdownMenuSubContent({
align = "start",
alignOffset = -3,
side = "right",
sideOffset = 0,
className,
...props
}: React.ComponentProps<typeof DropdownMenuContent>) {
return (
<DropdownMenuContent
data-slot="dropdown-menu-sub-content"
className={cn(
"cn-dropdown-menu-sub-content cn-menu-target cn-menu-translucent w-auto",
className
)}
align={align}
alignOffset={alignOffset}
side={side}
sideOffset={sideOffset}
{...props}
/>
)
}
function DropdownMenuCheckboxItem({
className,
children,
checked,
inset,
...props
}: MenuPrimitive.CheckboxItem.Props & {
inset?: boolean
}) {
return (
<MenuPrimitive.CheckboxItem
data-slot="dropdown-menu-checkbox-item"
data-inset={inset}
className={cn(
"cn-dropdown-menu-checkbox-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
className
)}
checked={checked}
{...props}
>
<span
className="cn-dropdown-menu-item-indicator pointer-events-none"
data-slot="dropdown-menu-checkbox-item-indicator"
>
<MenuPrimitive.CheckboxItemIndicator>
<ImportedCheckIcon
/>
</MenuPrimitive.CheckboxItemIndicator>
</span>
{children}
</MenuPrimitive.CheckboxItem>
)
}
function DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {
return (
<MenuPrimitive.RadioGroup
data-slot="dropdown-menu-radio-group"
{...props}
/>
)
}
function DropdownMenuRadioItem({
className,
children,
inset,
...props
}: MenuPrimitive.RadioItem.Props & {
inset?: boolean
}) {
return (
<MenuPrimitive.RadioItem
data-slot="dropdown-menu-radio-item"
data-inset={inset}
className={cn(
"cn-dropdown-menu-radio-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
className
)}
{...props}
>
<span
className="cn-dropdown-menu-item-indicator pointer-events-none"
data-slot="dropdown-menu-radio-item-indicator"
>
<MenuPrimitive.RadioItemIndicator>
<ImportedCheckIcon
/>
</MenuPrimitive.RadioItemIndicator>
</span>
{children}
</MenuPrimitive.RadioItem>
)
}
function DropdownMenuSeparator({
className,
...props
}: MenuPrimitive.Separator.Props) {
return (
<MenuPrimitive.Separator
data-slot="dropdown-menu-separator"
className={cn("cn-dropdown-menu-separator", className)}
{...props}
/>
)
}
function DropdownMenuShortcut({
className,
...props
}: React.ComponentProps<"span">) {
return (
<span
data-slot="dropdown-menu-shortcut"
className={cn("cn-dropdown-menu-shortcut", className)}
{...props}
/>
)
}
export {
DropdownMenu,
DropdownMenuPortal,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuLabel,
DropdownMenuItem,
DropdownMenuCheckboxItem,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuSub,
DropdownMenuSubTrigger,
DropdownMenuSubContent,
}
import {ChevronRightIcon as ImportedChevronRightIcon,CheckIcon as ImportedCheckIcon} from "lucide-react";
registry/bases/base/ui/separator.tsx
"use client"
import { Separator as SeparatorPrimitive } from "@base-ui/react/separator"
import { cn } from "cn"
function Separator({
className,
orientation = "horizontal",
...props
}: SeparatorPrimitive.Props) {
return (
<SeparatorPrimitive
data-slot="separator"
orientation={orientation}
className={cn(
"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
className
)}
{...props}
/>
)
}
export { Separator }
demo.tsx
export { default as default } from "@/registry-reui/bases/base/components/button-group/c-button-group-53";CSS
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
:root, :host {
--font-sans: var(--font-sans);
--font-mono: var(--font-mono);
--color-red-600: oklch(57.7% 0.245 27.325);
--color-red-800: oklch(44.4% 0.177 26.899);
--color-yellow-500: oklch(79.5% 0.184 86.047);
--color-yellow-600: oklch(68.1% 0.162 75.834);
--color-yellow-900: oklch(42.1% 0.095 57.708);
--color-emerald-500: oklch(69.6% 0.17 162.48);
--color-emerald-600: oklch(59.6% 0.145 163.225);
--color-emerald-900: oklch(37.8% 0.077 168.94);
--color-violet-500: oklch(60.6% 0.25 292.717);
--color-violet-600: oklch(54.1% 0.281 293.009);
--color-violet-900: oklch(38% 0.189 293.745);
--color-zinc-50: oklch(98.5% 0 none);
--color-zinc-700: oklch(37% 0.013 285.805);
--color-zinc-900: oklch(21% 0.006 285.885);
--spacing: 0.25rem;
--text-xs: 0.75rem;
--text-xs--line-height: calc(1 / 0.75);
--text-sm: 0.875rem;
--text-sm--line-height: calc(1.25 / 0.875);
--font-weight-medium: 500;
--radius-md: calc(var(--radius) - 2px);
--default-transition-duration: 150ms;
--default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
--default-font-family: var(--font-sans);
--default-mono-font-family: var(--font-mono);
--font-heading: var(--font-heading);
--font-inter: var(--font-inter);
}
}
@layer base {
*, ::after, ::before, ::backdrop, ::file-selector-button {
box-sizing: border-box;
margin: 0;
padding: 0;
border: 0 solid;
}
html, :host {
line-height: 1.5;
-webkit-text-size-adjust: 100%;
tab-size: 4;
font-family: var(--default-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
font-feature-settings: var(--default-font-feature-settings, normal);
font-variation-settings: var(--default-font-variation-settings, normal);
-webkit-tap-highlight-color: transparent;
}
hr {
height: 0;
color: inherit;
border-top-width: 1px;
}
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
h1, h2, h3, h4, h5, h6 {
font-size: inherit;
font-weight: inherit;
}
a {
color: inherit;
-webkit-text-decoration: inherit;
text-decoration: inherit;
}
b, strong {
font-weight: bolder;
}
code, kbd, samp, pre {
font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
font-feature-settings: var(--default-mono-font-feature-settings, normal);
font-variation-settings: var(--default-mono-font-variation-settings, normal);
font-size: 1em;
}
small {
font-size: 80%;
}
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
table {
text-indent: 0;
border-color: inherit;
border-collapse: collapse;
}
:-moz-focusring:where(:not(iframe)) {
outline: auto;
}
progress {
vertical-align: baseline;
}
summary {
display: list-item;
}
ol, ul, menu {
list-style: none;
}
img, svg, video, canvas, audio, iframe, embed, object {
display: block;
vertical-align: middle;
}
img, video {
max-width: 100%;
height: auto;
}
button, input, select, optgroup, textarea, ::file-selector-button {
font: inherit;
font-feature-settings: inherit;
font-variation-settings: inherit;
letter-spacing: inherit;
color: inherit;
border-radius: 0;
background-color: transparent;
opacity: 1;
}
:where(select:is([multiple], [size])) optgroup {
font-weight: bolder;
}
:where(select:is([multiple], [size])) optgroup option {
padding-inline-start: 20px;
}
::file-selector-button {
margin-inline-end: 4px;
}
::placeholder {
opacity: 1;
}
@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
::placeholder {
color: currentcolor;
@supports (color: color-mix(in lab, red, red)) {
color: color-mix(in oklab, currentcolor 50%, transparent);
}
}
}
textarea {
resize: vertical;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-date-and-time-value {
min-height: 1lh;
text-align: inherit;
}
::-webkit-datetime-edit {
display: inline-flex;
}
::-webkit-datetime-edit-fields-wrapper {
padding: 0;
}
::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
padding-block: 0;
}
::-webkit-calendar-picker-indicator {
line-height: 1;
}
:-moz-ui-invalid {
box-shadow: none;
}
button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
appearance: button;
}
::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
height: auto;
}
[hidden]:where(:not([hidden="until-found"])) {
display: none !important;
}
}
@layer utilities {
.pointer-events-none {
pointer-events: none;
}
.absolute {
position: absolute;
}
.relative {
position: relative;
}
.right-0 {
right: 0px;
}
.bottom-0 {
bottom: 0px;
}
.isolate {
isolation: isolate;
}
.z-10 {
z-index: 10;
}
.z-50 {
z-index: 50;
}
.my-auto {
margin-block: auto;
}
.ml-auto {
margin-left: auto;
}
.flex {
display: flex;
}
.hidden {
display: none;
}
.inline-flex {
display: inline-flex;
}
.aspect-square {
aspect-ratio: 1 / 1;
}
.size-4 {
width: calc(var(--spacing) * 4);
height: calc(var(--spacing) * 4);
}
.size-full {
width: 100%;
height: 100%;
}
.h-4 {
height: calc(var(--spacing) * 4);
}
.max-h-\(--available-height\) {
max-height: var(--available-height);
}
.w-\(--anchor-width\) {
width: var(--anchor-width);
}
.w-40 {
width: calc(var(--spacing) * 40);
}
.w-48 {
width: calc(var(--spacing) * 48);
}
.w-auto {
width: auto;
}
.w-fit {
width: fit-content;
}
.shrink-0 {
flex-shrink: 0;
}
.origin-\(--transform-origin\) {
transform-origin: var(--transform-origin);
}
.cursor-default {
cursor: default;
}
.flex-col {
flex-direction: column;
}
.items-center {
align-items: center;
}
.items-stretch {
align-items: stretch;
}
.justify-center {
justify-content: center;
}
.gap-2 {
gap: calc(var(--spacing) * 2);
}
:where(.-space-x-2 > :not(:last-child)) {
--tw-space-x-reverse: 0;
margin-inline-start: calc(calc(var(--spacing) * -2) * var(--tw-space-x-reverse));
margin-inline-end: calc(calc(var(--spacing) * -2) * calc(1 - var(--tw-space-x-reverse)));
}
.self-stretch {
align-self: stretch;
}
.overflow-x-hidden {
overflow-x: hidden;
}
.overflow-y-auto {
overflow-y: auto;
}
.rounded-full {
border-radius: calc(infinity * 1px);
}
.rounded-l-none {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.border-l {
border-left-style: var(--tw-border-style);
border-left-width: 1px;
}
.border-primary-foreground\/20 {
border-color: var(--primary-foreground);
@supports (color: color-mix(in lab, red, red)) {
border-color: color-mix(in oklab, var(--primary-foreground) 20%, transparent);
}
}
.bg-border {
background-color: var(--border);
}
.bg-primary\/72 {
background-color: var(--primary);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--primary) 72%, transparent);
}
}
.object-cover {
object-fit: cover;
}
.text-sm {
font-size: var(--text-sm);
line-height: var(--tw-leading, var(--text-sm--line-height));
}
.whitespace-nowrap {
white-space: nowrap;
}
.opacity-60 {
opacity: 60%;
}
.bg-blend-color {
background-blend-mode: color;
}
.ring-2 {
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
}
.ring-background {
--tw-ring-color: var(--background);
}
.outline-hidden {
--tw-outline-style: none;
outline-style: none;
@media (forced-colors: active) {
outline: 2px solid transparent;
outline-offset: 2px;
}
}
.outline {
outline-style: var(--tw-outline-style);
outline-width: 1px;
}
.transition-all {
transition-property: all;
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
transition-duration: var(--tw-duration, var(--default-transition-duration));
}
.outline-none {
--tw-outline-style: none;
outline-style: none;
}
.select-none {
-webkit-user-select: none;
user-select: none;
}
.group-data-\[size\=default\]\/avatar\:size-2\.5:is(:where(.group\/avatar)[data-size="default"] *) {
width: calc(var(--spacing) * 2.5);
height: calc(var(--spacing) * 2.5);
}
.group-data-\[size\=lg\]\/avatar\:size-3:is(:where(.group\/avatar)[data-size="lg"] *) {
width: calc(var(--spacing) * 3);
height: calc(var(--spacing) * 3);
}
.group-data-\[size\=sm\]\/avatar\:size-2:is(:where(.group\/avatar)[data-size="sm"] *) {
width: calc(var(--spacing) * 2);
height: calc(var(--spacing) * 2);
}
.group-data-\[size\=sm\]\/avatar\:text-xs:is(:where(.group\/avatar)[data-size="sm"] *) {
font-size: var(--text-xs);
line-height: var(--tw-leading, var(--text-xs--line-height));
}
.after\:absolute::after {
content: var(--tw-content);
position: absolute;
}
.after\:inset-0::after {
content: var(--tw-content);
inset: 0px;
}
.after\:border::after {
content: var(--tw-content);
border-style: var(--tw-border-style);
border-width: 1px;
}
.after\:border-border::after {
content: var(--tw-content);
border-color: var(--border);
}
.after\:mix-blend-darken::after {
content: var(--tw-content);
mix-blend-mode: darken;
}
:is(.\*\:focus-visible\:relative > *):focus-visible {
position: relative;
}
:is(.\*\:focus-visible\:z-10 > *):focus-visible {
z-index: 10;
}
.disabled\:pointer-events-none:disabled {
pointer-events: none;
}
.disabled\:opacity-50:disabled {
opacity: 50%;
}
.data-closed\:overflow-hidden[data-closed] {
overflow: hidden;
}
.data-disabled\:pointer-events-none[data-disabled] {
pointer-events: none;
}
.data-disabled\:opacity-50[data-disabled] {
opacity: 50%;
}
.data-horizontal\:mx-px[data-horizontal] {
margin-inline: 1px;
}
.data-horizontal\:h-px[data-horizontal] {
height: 1px;
}
.data-horizontal\:w-auto[data-horizontal] {
width: auto;
}
.data-horizontal\:w-full[data-horizontal] {
width: 100%;
}
.data-popup-open\:bg-accent[data-popup-open] {
background-color: var(--accent);
}
.data-popup-open\:text-accent-foreground[data-popup-open] {
color: var(--accent-foreground);
}
:is(.\*\:data-slot\:rounded-r-none > *)[data-slot] {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
:is(.\*\:data-slot\:rounded-b-none > *)[data-slot] {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.data-vertical\:my-px[data-vertical] {
margin-block: 1px;
}
.data-vertical\:h-auto[data-vertical] {
height: auto;
}
.data-vertical\:w-px[data-vertical] {
width: 1px;
}
.data-vertical\:self-stretch[data-vertical] {
align-self: stretch;
}
:is(.\*\:data-\[slot\=avatar\]\:ring-2 > *)[data-slot="avatar"] {
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
}
:is(.\*\:data-\[slot\=avatar\]\:ring-background > *)[data-slot="avatar"] {
--tw-ring-color: var(--background);
}
:is(.\*\*\:data-\[slot\=button\]\:border-r-0 *)[data-slot="button"] {
border-right-style: var(--tw-border-style);
border-right-width: 0px;
}
@media (width >= 48rem) {
.md\:block {
display: block;
}
}
.dark\:after\:mix-blend-lighten:where(.dark, .dark *)::after {
content: var(--tw-content);
mix-blend-mode: lighten;
}
.\[\&_svg\]\:pointer-events-none svg {
pointer-events: none;
}
.\[\&_svg\]\:shrink-0 svg {
flex-shrink: 0;
}
.\[\&\>\[data-slot\=select-trigger\]\:not\(\[class\*\=\'w-\'\]\)\]\:w-fit > [data-slot=select-trigger]:not([class*='w-']) {
width: fit-content;
}
.\[\&\>\[data-slot\]\~\[data-slot\]\]\:rounded-t-none > [data-slot] ~ [data-slot] {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.\[\&\>\[data-slot\]\~\[data-slot\]\]\:rounded-l-none > [data-slot] ~ [data-slot] {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.\[\&\>\[data-slot\]\~\[data-slot\]\]\:border-t-0 > [data-slot] ~ [data-slot] {
border-top-style: var(--tw-border-style);
border-top-width: 0px;
}
.\[\&\>\[data-slot\]\~\[data-slot\]\]\:border-l-0 > [data-slot] ~ [data-slot] {
border-left-style: var(--tw-border-style);
border-left-width: 0px;
}
.\[\&\>input\]\:flex-1 > input {
flex: 1;
}
.group-data-\[size\=default\]\/avatar\:\[\&\>svg\]\:size-2:is(:where(.group\/avatar)[data-size="default"] *) > svg {
width: calc(var(--spacing) * 2);
height: calc(var(--spacing) * 2);
}
.group-data-\[size\=lg\]\/avatar\:\[\&\>svg\]\:size-2:is(:where(.group\/avatar)[data-size="lg"] *) > svg {
width: calc(var(--spacing) * 2);
height: calc(var(--spacing) * 2);
}
.group-data-\[size\=sm\]\/avatar\:\[\&\>svg\]\:hidden:is(:where(.group\/avatar)[data-size="sm"] *) > svg {
display: none;
}
}
:root {
--background: #fff;
--foreground: #111;
--primary: #171717;
--primary-foreground: #fff;
--secondary: #eee;
--secondary-foreground: #171717;
--muted: #eee;
--muted-foreground: #666;
--accent: #eee;
--accent-foreground: #171717;
--border: #ddd;
--input: #ddd;
--ring: #777;
--destructive: #dc2626;
--destructive-foreground: #fff;
--popover: #fff;
--popover-foreground: #111;
--success: #15803d;
--success-foreground: #fff;
--radius: .625rem;
--hairline: 1px;
}
.dark {
--background: #090909;
--foreground: #fafafa;
--primary: #fafafa;
--primary-foreground: #171717;
--secondary: #262626;
--secondary-foreground: #fafafa;
--muted: #262626;
--muted-foreground: #a3a3a3;
--accent: #262626;
--accent-foreground: #fafafa;
--border: #333;
--input: #333;
--popover: #171717;
--popover-foreground: #fafafa;
}
@keyframes collapsible-down {
from {
height: 0;
}
to {
height: var(--radix-collapsible-content-height);
}
}
@keyframes collapsible-up {
from {
height: var(--radix-collapsible-content-height);
}
to {
height: 0;
}
}
@keyframes marquee-left {
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
}
@keyframes marquee-right {
from {
transform: translateX(-50%);
}
to {
transform: translateX(0);
}
}
@keyframes marquee-up {
from {
transform: translateY(0);
}
to {
transform: translateY(-50%);
}
}
:root {
--font-sans: var(--font-inter);
--font-heading: var(--font-inter);
--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
--radius: 0.625rem;
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
--destructive-foreground: var(--color-red-800);
--success: var(--color-emerald-500);
--success-foreground: var(--color-emerald-900);
--info: var(--color-violet-500);
--info-foreground: var(--color-violet-900);
--warning: var(--color-yellow-500);
--warning-foreground: var(--color-yellow-900);
--invert: var(--color-zinc-900);
--invert-foreground: var(--color-zinc-50);
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.205 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.269 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.922 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.371 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.556 0 0);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.439 0 0);
--destructive-foreground: var(--color-red-600);
--success: var(--color-emerald-500);
--success-foreground: var(--color-emerald-600);
--info: var(--color-violet-500);
--info-foreground: var(--color-violet-600);
--warning: var(--color-yellow-500);
--warning-foreground: var(--color-yellow-600);
--invert: var(--color-zinc-700);
--invert-foreground: var(--color-zinc-50);
}
:root {
--surface: oklch(0.98 0 0);
--surface-foreground: var(--foreground);
--code: var(--surface);
--code-foreground: var(--surface-foreground);
--code-highlight: oklch(0.96 0 0);
--code-number: oklch(0.56 0 0);
--selection: oklch(0.145 0 0);
--selection-foreground: oklch(1 0 0);
}
.dark {
--surface: oklch(0.2 0 0);
--surface-foreground: oklch(0.708 0 0);
--code: var(--surface);
--code-foreground: var(--surface-foreground);
--code-highlight: oklch(0.27 0 0);
--code-number: oklch(0.72 0 0);
--selection: oklch(0.922 0 0);
--selection-foreground: oklch(0.205 0 0);
}
.cn-button {
border-radius: calc(var(--radius) - 2px);
border-style: var(--tw-border-style);
border-width: 1px;
border-color: transparent;
background-clip: padding-box;
font-size: var(--text-sm);
line-height: var(--tw-leading, var(--text-sm--line-height));
--tw-font-weight: var(--font-weight-medium);
font-weight: var(--font-weight-medium);
&:focus-visible {
border-color: var(--ring);
}
&:focus-visible {
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
}
&:focus-visible {
--tw-ring-color: var(--ring);
@supports (color: color-mix(in lab, red, red)) {
--tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);
}
}
&:active {
&:not(*[aria-haspopup]) {
--tw-translate-y: 1px;
translate: var(--tw-translate-x) var(--tw-translate-y);
}
}
&[aria-invalid="true"] {
border-color: var(--destructive);
}
&[aria-invalid="true"] {
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
}
&[aria-invalid="true"] {
--tw-ring-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
--tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);
}
}
&:where(.dark, .dark *) {
&[aria-invalid="true"] {
border-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
border-color: color-mix(in oklab, var(--destructive) 50%, transparent);
}
}
}
&:where(.dark, .dark *) {
&[aria-invalid="true"] {
--tw-ring-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
--tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);
}
}
}
& svg:not([class*='size-']) {
width: calc(var(--spacing) * 4);
height: calc(var(--spacing) * 4);
}
}
.cn-button-variant-default {
background-color: var(--primary);
color: var(--primary-foreground);
&:hover {
@media (hover: hover) {
background-color: var(--primary);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--primary) 80%, transparent);
}
}
}
}
.cn-button-variant-outline {
border-color: var(--border);
background-color: var(--background);
--tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
&:hover {
@media (hover: hover) {
background-color: var(--muted);
}
}
&:hover {
@media (hover: hover) {
color: var(--foreground);
}
}
&[aria-expanded="true"] {
background-color: var(--muted);
}
&[aria-expanded="true"] {
color: var(--foreground);
}
&:where(.dark, .dark *) {
border-color: var(--input);
}
&:where(.dark, .dark *) {
background-color: var(--input);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--input) 30%, transparent);
}
}
&:where(.dark, .dark *) {
&:hover {
@media (hover: hover) {
background-color: var(--input);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--input) 50%, transparent);
}
}
}
}
}
.cn-button-variant-secondary {
background-color: var(--secondary);
color: var(--secondary-foreground);
&:hover {
@media (hover: hover) {
background-color: var(--secondary);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklch,var(--secondary),var(--foreground) 5%);
}
}
}
&[aria-expanded="true"] {
background-color: var(--secondary);
}
&[aria-expanded="true"] {
color: var(--secondary-foreground);
}
}
@media (hover: hover) {
.cn-button-variant-ghost:hover {
background-color: var(--muted);
color: var(--foreground);
}
}
.cn-button-variant-ghost[aria-expanded="true"] {
background-color: var(--muted);
color: var(--foreground);
}
@media (hover: hover) {
.cn-button-variant-ghost:where(.dark, .dark *):hover {
background-color: var(--muted);
}
@supports (color: color-mix(in lab, red, red)) {
.cn-button-variant-ghost:where(.dark, .dark *):hover {
background-color: color-mix(in oklab, var(--muted) 50%, transparent);
}
}
}
.cn-button-variant-destructive {
background-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--destructive) 10%, transparent);
}
color: var(--destructive);
&:hover {
@media (hover: hover) {
background-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--destructive) 20%, transparent);
}
}
}
&:focus-visible {
border-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
border-color: color-mix(in oklab, var(--destructive) 40%, transparent);
}
}
&:focus-visible {
--tw-ring-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
--tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);
}
}
&:where(.dark, .dark *) {
background-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--destructive) 20%, transparent);
}
}
&:where(.dark, .dark *) {
&:hover {
@media (hover: hover) {
background-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--destructive) 30%, transparent);
}
}
}
}
&:where(.dark, .dark *) {
&:focus-visible {
--tw-ring-color: var(--destructive);
@supports (color: color-mix(in lab, red, red)) {
--tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);
}
}
}
}
.cn-button-variant-link {
color: var(--primary);
text-underline-offset: 4px;
&:hover {
@media (hover: hover) {
text-decoration-line: underline;
}
}
}
.cn-button-size-xs {
height: calc(var(--spacing) * 6);
gap: var(--spacing);
border-radius: min(var(--radius-md), 8px);
padding-inline: calc(var(--spacing) * 2);
font-size: var(--text-xs);
line-height: var(--tw-leading, var(--text-xs--line-height));
:where(*[data-slot="button-group"]) & {
border-radius: calc(var(--radius) - 2px);
}
&:has(*[data-icon="inline-end"]) {
padding-right: calc(var(--spacing) * 1.5);
}
&:has(*[data-icon="inline-start"]) {
padding-left: calc(var(--spacing) * 1.5);
}
& svg:not([class*='size-']) {
width: calc(var(--spacing) * 3);
height: calc(var(--spacing) * 3);
}
}
.cn-button-size-sm {
height: calc(var(--spacing) * 8);
gap: var(--spacing);
border-radius: min(var(--radius-md), 10px);
padding-inline: calc(var(--spacing) * 2.5);
:where(*[data-slot="button-group"]) & {
border-radius: calc(var(--radius) - 2px);
}
&:has(*[data-icon="inline-end"]) {
padding-right: calc(var(--spacing) * 1.5);
}
&:has(*[data-icon="inline-start"]) {
padding-left: calc(var(--spacing) * 1.5);
}
}
.cn-button-size-default {
height: calc(var(--spacing) * 9);
gap: calc(var(--spacing) * 1.5);
padding-inline: calc(var(--spacing) * 2.5);
:where(*[data-slot="button-group"]) & {
border-radius: calc(var(--radius) - 2px);
}
&:has(*[data-icon="inline-end"]) {
padding-right: calc(var(--spacing) * 2);
}
&:has(*[data-icon="inline-start"]) {
padding-left: calc(var(--spacing) * 2);
}
}
.cn-button-size-lg {
height: calc(var(--spacing) * 10);
gap: calc(var(--spacing) * 1.5);
padding-inline: calc(var(--spacing) * 2.5);
&:has(*[data-icon="inline-end"]) {
padding-right: calc(var(--spacing) * 2);
}
&:has(*[data-icon="inline-start"]) {
padding-left: calc(var(--spacing) * 2);
}
}
.cn-button-size-icon-xs {
width: calc(var(--spacing) * 6);
height: calc(var(--spacing) * 6);
border-radius: min(var(--radius-md), 8px);
:where(*[data-slot="button-group"]) & {
border-radius: calc(var(--radius) - 2px);
}
& svg:not([class*='size-']) {
width: calc(var(--spacing) * 3);
height: calc(var(--spacing) * 3);
}
}
.cn-button-size-icon-sm {
width: calc(var(--spacing) * 8);
height: calc(var(--spacing) * 8);
border-radius: min(var(--radius-md), 10px);
:where(*[data-slot="button-group"]) & {
border-radius: calc(var(--radius) - 2px);
}
}
.cn-button-size-icon {
width: calc(var(--spacing) * 9);
height: calc(var(--spacing) * 9);
}
.cn-button-size-icon-lg {
width: calc(var(--spacing) * 10);
height: calc(var(--spacing) * 10);
}
.cn-button-group:has( > [data-slot=button-group]) {
gap: calc(var(--spacing) * 2);
}
.cn-button-group:has(:is(select[aria-hidden=true]:last-child)) > [data-slot=select-trigger]:last-of-type {
border-top-right-radius: calc(var(--radius) - 2px);
border-bottom-right-radius: calc(var(--radius) - 2px);
}
.cn-button-group-orientation-horizontal > [data-slot]:not(:has( ~ [data-slot])) {
border-top-right-radius: calc(var(--radius) - 2px) !important;
border-bottom-right-radius: calc(var(--radius) - 2px) !important;
}
.cn-button-group-orientation-vertical > [data-slot]:not(:has( ~ [data-slot])) {
border-bottom-right-radius: calc(var(--radius) - 2px) !important;
border-bottom-left-radius: calc(var(--radius) - 2px) !important;
}
.cn-button-group-text {
gap: calc(var(--spacing) * 2);
border-radius: calc(var(--radius) - 2px);
border-style: var(--tw-border-style);
border-width: 1px;
background-color: var(--muted);
padding-inline: calc(var(--spacing) * 2.5);
font-size: var(--text-sm);
line-height: var(--tw-leading, var(--text-sm--line-height));
--tw-font-weight: var(--font-weight-medium);
font-weight: var(--font-weight-medium);
--tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
& svg:not([class*='size-']) {
width: calc(var(--spacing) * 4);
height: calc(var(--spacing) * 4);
}
}
.cn-button-group-separator {
background-color: var(--input);
}
@property --tw-space-x-reverse {
syntax: "*";
inherits: false;
initial-value: 0;
}
@property --tw-border-style {
syntax: "*";
inherits: false;
initial-value: solid;
}
@property --tw-shadow {
syntax: "*";
inherits: false;
initial-value: 0 0 #0000;
}
@property --tw-shadow-color {
syntax: "*";
inherits: false;
}
@property --tw-shadow-alpha {
syntax: "<percentage>";
inherits: false;
initial-value: 100%;
}
@property --tw-inset-shadow {
syntax: "*";
inherits: false;
initial-value: 0 0 #0000;
}
@property --tw-inset-shadow-color {
syntax: "*";
inherits: false;
}
@property --tw-inset-shadow-alpha {
syntax: "<percentage>";
inherits: false;
initial-value: 100%;
}
@property --tw-ring-color {
syntax: "*";
inherits: false;
}
@property --tw-ring-shadow {
syntax: "*";
inherits: false;
initial-value: 0 0 #0000;
}
@property --tw-inset-ring-color {
syntax: "*";
inherits: false;
}
@property --tw-inset-ring-shadow {
syntax: "*";
inherits: false;
initial-value: 0 0 #0000;
}
@property --tw-ring-inset {
syntax: "*";
inherits: false;
}
@property --tw-ring-offset-width {
syntax: "<length>";
inherits: false;
initial-value: 0px;
}
@property --tw-ring-offset-color {
syntax: "*";
inherits: false;
initial-value: #fff;
}
@property --tw-ring-offset-shadow {
syntax: "*";
inherits: false;
initial-value: 0 0 #0000;
}
@property --tw-outline-style {
syntax: "*";
inherits: false;
initial-value: solid;
}
@property --tw-content {
syntax: "*";
initial-value: "";
inherits: false;
}
@property --tw-font-weight {
syntax: "*";
inherits: false;
}
@property --tw-translate-x {
syntax: "*";
inherits: false;
initial-value: 0;
}
@property --tw-translate-y {
syntax: "*";
inherits: false;
initial-value: 0;
}
@property --tw-translate-z {
syntax: "*";
inherits: false;
initial-value: 0;
}
@layer properties {
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
*, ::before, ::after, ::backdrop {
--tw-space-x-reverse: 0;
--tw-border-style: solid;
--tw-shadow: 0 0 #0000;
--tw-shadow-color: initial;
--tw-shadow-alpha: 100%;
--tw-inset-shadow: 0 0 #0000;
--tw-inset-shadow-color: initial;
--tw-inset-shadow-alpha: 100%;
--tw-ring-color: initial;
--tw-ring-shadow: 0 0 #0000;
--tw-inset-ring-color: initial;
--tw-inset-ring-shadow: 0 0 #0000;
--tw-ring-inset: initial;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-offset-shadow: 0 0 #0000;
--tw-outline-style: solid;
--tw-content: "";
--tw-font-weight: initial;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-translate-z: 0;
}
}
}