{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "tooltip",
  "type": "registry:ui",
  "title": "Tooltip",
  "description": "React Aria backed supplemental tooltip primitive with provider-aware portals, token-backed content and arrow styling, delay controls, focus and hover triggers, placement props, reduced-motion overlay transitions, and non-interactive content semantics.",
  "dependencies": [
    "react-aria@^3.52.1",
    "react-aria-components@^1.21.1"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://components.dethink.co.uk/r/dethink-base.json",
    "https://components.dethink.co.uk/r/button.json"
  ],
  "files": [
    {
      "path": "packages/components/src/components/tooltip/tooltip.tsx",
      "type": "registry:file",
      "target": "~/components/dethink/components/tooltip/tooltip.tsx",
      "content": "import {\n  Focusable,\n  Tooltip as AriaTooltip,\n  TooltipTrigger as AriaTooltipTrigger,\n  type TooltipProps as AriaTooltipProps,\n  type TooltipTriggerComponentProps as AriaTooltipTriggerProps,\n} from \"react-aria-components\";\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport {\n  buttonClassNames,\n  type ButtonSize,\n  type ButtonVariant,\n} from \"../button\";\nimport {\n  DethinkPortalProvider,\n  useProviderPortalRoot,\n  useScopedOverlayState,\n} from \"../../utils/provider-portal\";\nimport {\n  PositionedOverlayArrow,\n  type PositionedOverlayArrowProps,\n  positionedOverlayArrowClassNames,\n  positionedOverlayTooltipDefaults,\n  positionedOverlaySurfaceClassNames,\n  resolvePositionedOverlayPositionProps,\n} from \"../../utils/positioned-overlay\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface TooltipProps extends Omit<\n  AriaTooltipTriggerProps,\n  \"children\" | \"isDisabled\" | \"isOpen\" | \"onOpenChange\"\n> {\n  \"data-slot\"?: string;\n  children?: ReactNode;\n  className?: string;\n  disabled?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  open?: boolean;\n}\n\nexport interface TooltipTriggerProps extends Omit<\n  ButtonHTMLAttributes<HTMLButtonElement>,\n  \"className\" | \"disabled\" | \"size\"\n> {\n  children?: ReactNode;\n  className?: string;\n  disabled?: boolean;\n  size?: ButtonSize;\n  variant?: ButtonVariant;\n}\n\nexport interface TooltipContentProps extends Omit<\n  AriaTooltipProps,\n  | \"children\"\n  | \"className\"\n  | \"defaultOpen\"\n  | \"isOpen\"\n  | \"onOpenChange\"\n  | \"UNSTABLE_portalContainer\"\n> {\n  arrowClassName?: string;\n  arrowShapeClassName?: string;\n  children?: ReactNode;\n  className?: string;\n  showArrow?: boolean;\n}\n\nexport interface TooltipArrowProps extends PositionedOverlayArrowProps {}\n\nconst tooltipRootClasses = \"contents\";\n\nconst tooltipContentClasses =\n  \"min-w-0 max-w-[min(var(--dt-tooltip-max-width,18rem),calc(100vw_-_var(--dt-space-4)))] overflow-visible rounded-md border-border/40 bg-foreground px-[var(--dt-space-2)] py-[var(--dt-space-1-5)] text-xs leading-5 text-background shadow-md\";\n\nconst tooltipArrowShapeClasses = \"fill-foreground stroke-border/40\";\n\nexport function tooltipClassNames({\n  className,\n}: Pick<TooltipProps, \"className\"> = {}) {\n  return cn(tooltipRootClasses, className);\n}\n\nexport function tooltipTriggerClassNames({\n  className,\n  size = \"md\",\n  variant = \"outline\",\n}: Pick<TooltipTriggerProps, \"className\" | \"size\" | \"variant\"> = {}) {\n  return buttonClassNames({ className, size, variant });\n}\n\nexport function tooltipContentClassNames({\n  className,\n}: Pick<TooltipContentProps, \"className\"> = {}) {\n  return cn(\n    positionedOverlaySurfaceClassNames(),\n    tooltipContentClasses,\n    className,\n  );\n}\n\nexport function tooltipArrowClassNames({\n  className,\n}: Pick<TooltipArrowProps, \"className\"> = {}) {\n  return positionedOverlayArrowClassNames({ className });\n}\n\nexport function tooltipArrowShapeClassNames({\n  className,\n}: {\n  className?: string;\n} = {}) {\n  return cn(tooltipArrowShapeClasses, className);\n}\n\nexport const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(\n  (\n    {\n      \"data-slot\": dataSlot,\n      children,\n      className,\n      disabled = false,\n      defaultOpen,\n      onOpenChange,\n      open,\n      ...props\n    },\n    ref,\n  ) => {\n    const [resolvedOpen, handleOpenChange] = useScopedOverlayState({\n      open,\n      defaultOpen,\n      onOpenChange,\n    });\n    const { portalContainer, rootRef } = useProviderPortalRoot<HTMLDivElement>({\n      forwardedRef: ref,\n      portalSlot: \"tooltip-portal-container\",\n    });\n\n    return (\n      <div\n        ref={rootRef}\n        data-slot={dataSlot ?? \"tooltip\"}\n        data-open={resolvedOpen ? \"\" : undefined}\n        className={tooltipClassNames({ className })}\n      >\n        <DethinkPortalProvider container={portalContainer}>\n          <AriaTooltipTrigger\n            {...props}\n            isDisabled={disabled}\n            isOpen={resolvedOpen}\n            onOpenChange={handleOpenChange}\n          >\n            {children}\n          </AriaTooltipTrigger>\n        </DethinkPortalProvider>\n      </div>\n    );\n  },\n);\n\nTooltip.displayName = \"Tooltip\";\n\nexport const TooltipTrigger = forwardRef<\n  HTMLButtonElement,\n  TooltipTriggerProps\n>(\n  (\n    {\n      children,\n      className,\n      disabled = false,\n      size = \"md\",\n      type = \"button\",\n      variant = \"outline\",\n      ...props\n    },\n    ref,\n  ) => (\n    <Focusable ref={ref} isDisabled={disabled}>\n      <button\n        {...props}\n        type={type}\n        data-disabled={disabled ? \"true\" : undefined}\n        data-slot=\"tooltip-trigger\"\n        disabled={disabled}\n        className={tooltipTriggerClassNames({ className, size, variant })}\n      >\n        {children}\n      </button>\n    </Focusable>\n  ),\n);\n\nTooltipTrigger.displayName = \"TooltipTrigger\";\n\nexport const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(\n  (\n    {\n      arrowBoundaryOffset,\n      arrowClassName,\n      arrowShapeClassName,\n      children,\n      className,\n      containerPadding,\n      crossOffset,\n      offset,\n      placement,\n      shouldFlip,\n      showArrow = false,\n      ...props\n    },\n    ref,\n  ) => {\n    const positionProps = resolvePositionedOverlayPositionProps(\n      {\n        arrowBoundaryOffset,\n        containerPadding,\n        crossOffset,\n        offset,\n        placement,\n        shouldFlip,\n      },\n      positionedOverlayTooltipDefaults,\n    );\n\n    return (\n      <AriaTooltip\n        {...props}\n        {...positionProps}\n        ref={ref}\n        data-slot=\"tooltip-content\"\n        className={tooltipContentClassNames({ className })}\n      >\n        {showArrow ? (\n          <TooltipArrow\n            className={arrowClassName}\n            shapeClassName={arrowShapeClassName}\n          />\n        ) : null}\n        {children}\n      </AriaTooltip>\n    );\n  },\n);\n\nTooltipContent.displayName = \"TooltipContent\";\n\nexport const TooltipArrow = forwardRef<HTMLDivElement, TooltipArrowProps>(\n  ({ className, shapeClassName, ...props }, ref) => (\n    <PositionedOverlayArrow\n      {...props}\n      ref={ref}\n      data-slot=\"tooltip-arrow\"\n      shapeDataSlot=\"tooltip-arrow-shape\"\n      className={tooltipArrowClassNames({ className })}\n      shapeClassName={tooltipArrowShapeClassNames({\n        className: shapeClassName,\n      })}\n    />\n  ),\n);\n\nTooltipArrow.displayName = \"TooltipArrow\";\n"
    },
    {
      "path": "packages/components/src/components/tooltip/index.ts",
      "type": "registry:file",
      "target": "~/components/dethink/components/tooltip/index.ts",
      "content": "export {\n  Tooltip,\n  TooltipArrow,\n  TooltipContent,\n  TooltipTrigger,\n  tooltipArrowClassNames,\n  tooltipArrowShapeClassNames,\n  tooltipClassNames,\n  tooltipContentClassNames,\n  tooltipTriggerClassNames,\n  type TooltipArrowProps,\n  type TooltipContentProps,\n  type TooltipProps,\n  type TooltipTriggerProps,\n} from \"./tooltip\";\n"
    },
    {
      "path": "packages/components/src/utils/provider-portal.tsx",
      "type": "registry:file",
      "target": "~/components/dethink/utils/provider-portal.tsx",
      "content": "import {\n  createContext,\n  type ForwardedRef,\n  type ReactNode,\n  type RefCallback,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { UNSAFE_PortalProvider } from \"react-aria/PortalProvider\";\nimport { setDethinkPortalOwner } from \"./portal-owner\";\n\nconst providerPortalDefaultClasses = \"bg-background font-sans text-foreground\";\nconst providerPortalMirroredAttributes = [\n  \"data-theme\",\n  \"data-density\",\n  \"dir\",\n] as const;\n\nexport type ProviderPortalMirroredAttribute =\n  (typeof providerPortalMirroredAttributes)[number];\n\nexport interface ProviderPortalRootOptions<T extends HTMLElement> {\n  forwardedRef?: ForwardedRef<T>;\n  portalSlot: string;\n}\n\nexport interface ProviderPortalRootState<T extends HTMLElement> {\n  portalContainer: HTMLElement | null;\n  rootRef: RefCallback<T>;\n}\n\nexport interface DethinkPortalProviderProps {\n  children?: ReactNode;\n  container: HTMLElement | null;\n}\n\nconst DethinkPortalContext = createContext(false);\nconst OverlayVisibilityContext = createContext(true);\n\n/** Persistent surfaces can dismiss overlays without unmounting their content. */\nexport function DethinkOverlayScope({\n  visible,\n  children,\n}: {\n  visible: boolean;\n  children?: ReactNode;\n}) {\n  const parentVisible = useContext(OverlayVisibilityContext);\n  return (\n    <OverlayVisibilityContext.Provider value={visible && parentVisible}>\n      {children}\n    </OverlayVisibilityContext.Provider>\n  );\n}\n\nexport function useScopedOverlayState({\n  open,\n  defaultOpen = false,\n  onOpenChange,\n}: {\n  open?: boolean;\n  defaultOpen?: boolean;\n  onOpenChange?: (open: boolean) => void;\n}): readonly [boolean, (open: boolean) => void] {\n  const visible = useContext(OverlayVisibilityContext);\n  const [localOpen, setLocalOpen] = useState(defaultOpen);\n  const requestedOpen = open ?? localOpen;\n  const closeRequested = useRef(false);\n  const setOpen = useCallback(\n    (next: boolean) => {\n      if (next && !visible) return;\n      if (open === undefined) setLocalOpen(next);\n      onOpenChange?.(next);\n    },\n    [open, onOpenChange, visible],\n  );\n  useEffect(() => {\n    if (visible) closeRequested.current = false;\n    else if (requestedOpen && !closeRequested.current) {\n      closeRequested.current = true;\n      // Synchronize overlay state with the containing surface's lifecycle.\n      setOpen(false);\n    }\n  }, [visible, requestedOpen, setOpen]);\n  return [visible && requestedOpen, setOpen];\n}\n\nfunction assignForwardedRef<T>(\n  ref: ForwardedRef<T> | undefined,\n  value: T | null,\n) {\n  if (typeof ref === \"function\") {\n    ref(value);\n  } else if (ref) {\n    ref.current = value;\n  }\n}\n\nfunction fallbackProviderAttribute(name: ProviderPortalMirroredAttribute) {\n  if (typeof document === \"undefined\") {\n    return null;\n  }\n\n  if (name === \"data-density\") {\n    return \"default\";\n  }\n\n  if (name === \"data-theme\") {\n    return document.documentElement.getAttribute(name) ?? \"system\";\n  }\n\n  return document.documentElement.getAttribute(\"dir\") ?? document.dir ?? \"ltr\";\n}\n\nexport function syncDethinkPortalContainer({\n  container,\n  portalSlot,\n  provider,\n}: {\n  container: HTMLElement;\n  portalSlot: string;\n  provider: HTMLElement | null;\n}) {\n  const source =\n    provider ??\n    (typeof document === \"undefined\" ? null : document.documentElement);\n\n  container.setAttribute(\"data-slot\", portalSlot);\n  container.setAttribute(\"data-dethink-provider\", \"\");\n  container.className = provider?.className || providerPortalDefaultClasses;\n  container.style.cssText = provider?.getAttribute(\"style\") ?? \"\";\n  container.style.display = \"contents\";\n\n  for (const attribute of providerPortalMirroredAttributes) {\n    const value =\n      source?.getAttribute(attribute) ?? fallbackProviderAttribute(attribute);\n\n    if (value) {\n      container.setAttribute(attribute, value);\n    } else {\n      container.removeAttribute(attribute);\n    }\n  }\n}\n\nexport function useProviderPortalRoot<T extends HTMLElement>({\n  forwardedRef,\n  portalSlot,\n}: ProviderPortalRootOptions<T>): ProviderPortalRootState<T> {\n  const [portalContainer] = useState<HTMLElement | null>(() => {\n    if (typeof document === \"undefined\") {\n      return null;\n    }\n\n    return document.createElement(\"div\");\n  });\n  const [rootElement, setRootElement] = useState<T | null>(null);\n\n  const rootRef = useCallback(\n    (node: T | null) => {\n      setRootElement(node);\n      assignForwardedRef(forwardedRef, node);\n\n      if (node && portalContainer && typeof document !== \"undefined\") {\n        setDethinkPortalOwner(portalContainer, node);\n        const provider =\n          node.closest<HTMLElement>(\"[data-dethink-provider]\") ?? null;\n\n        syncDethinkPortalContainer({\n          container: portalContainer,\n          portalSlot,\n          provider,\n        });\n\n        if (!portalContainer.isConnected) {\n          document.body.appendChild(portalContainer);\n        }\n      }\n    },\n    [forwardedRef, portalContainer, portalSlot],\n  );\n\n  useEffect(() => {\n    if (!portalContainer || typeof document === \"undefined\") {\n      return undefined;\n    }\n\n    const provider =\n      rootElement?.closest<HTMLElement>(\"[data-dethink-provider]\") ?? null;\n    const syncContainer = () => {\n      syncDethinkPortalContainer({\n        container: portalContainer,\n        portalSlot,\n        provider,\n      });\n    };\n\n    syncContainer();\n    document.body.appendChild(portalContainer);\n\n    const observerTarget = provider ?? document.documentElement;\n    const observer = new MutationObserver(syncContainer);\n    observer.observe(observerTarget, {\n      attributeFilter: [\"class\", \"data-density\", \"data-theme\", \"dir\", \"style\"],\n      attributes: true,\n    });\n\n    return () => {\n      observer.disconnect();\n      portalContainer.remove();\n    };\n  }, [portalContainer, portalSlot, rootElement]);\n\n  return {\n    portalContainer,\n    rootRef,\n  };\n}\n\nexport function DethinkPortalProvider({\n  children,\n  container,\n}: DethinkPortalProviderProps) {\n  const hasDethinkPortalParent = useContext(DethinkPortalContext);\n  const content = hasDethinkPortalParent ? (\n    children\n  ) : (\n    <UNSAFE_PortalProvider getContainer={() => container}>\n      {children}\n    </UNSAFE_PortalProvider>\n  );\n\n  return (\n    <DethinkPortalContext.Provider value>\n      {content}\n    </DethinkPortalContext.Provider>\n  );\n}\n"
    },
    {
      "path": "packages/components/src/utils/portal-owner.ts",
      "type": "registry:file",
      "target": "~/components/dethink/utils/portal-owner.ts",
      "content": "/**\n * Links a Dethink portal container on <body> to the component root that owns\n * it, so a modal surface (the mobile sidebar) can keep overlays opened from\n * inside it usable while it makes the rest of the page inert. A global symbol\n * key, so components copied from the registry agree without sharing imports.\n */\nconst PORTAL_OWNER: unique symbol = Symbol.for(\"dethink.portal-owner\");\n\ntype OwnedElement = Element & { [PORTAL_OWNER]?: Element };\n\nexport function setDethinkPortalOwner(container: Element, owner: Element) {\n  (container as OwnedElement)[PORTAL_OWNER] = owner;\n}\n\n/** The element owning a Dethink portal container, or null for any other element. */\nexport function getDethinkPortalOwner(element: Element): Element | null {\n  return (element as OwnedElement)[PORTAL_OWNER] ?? null;\n}\n"
    },
    {
      "path": "packages/components/src/utils/positioned-overlay.tsx",
      "type": "registry:file",
      "target": "~/components/dethink/utils/positioned-overlay.tsx",
      "content": "import { forwardRef } from \"react\";\nimport {\n  OverlayArrow as AriaOverlayArrow,\n  type OverlayArrowProps as AriaOverlayArrowProps,\n} from \"react-aria-components\";\nimport type { Placement } from \"react-aria/useOverlayPosition\";\nimport { cn } from \"./cn\";\n\nexport type PositionedOverlayPlacement = Placement;\n\nexport interface PositionedOverlayPositionProps {\n  arrowBoundaryOffset?: number;\n  containerPadding?: number;\n  crossOffset?: number;\n  offset?: number;\n  placement?: PositionedOverlayPlacement;\n  shouldFlip?: boolean;\n}\n\nexport interface PositionedOverlaySurfaceClassNameOptions {\n  animation?: \"css\" | \"none\";\n  className?: string;\n}\n\nexport interface PositionedOverlayArrowClassNameOptions {\n  className?: string;\n}\n\nexport interface PositionedOverlayArrowProps extends Omit<\n  AriaOverlayArrowProps,\n  \"children\" | \"className\"\n> {\n  \"data-slot\"?: string;\n  className?: string;\n  shapeDataSlot?: string;\n  shapeClassName?: string;\n}\n\nexport const positionedOverlayPositionDefaults = {\n  arrowBoundaryOffset: 0,\n  containerPadding: 12,\n  crossOffset: 0,\n  offset: 0,\n  placement: \"bottom\",\n  shouldFlip: true,\n} satisfies Required<PositionedOverlayPositionProps>;\n\nexport const positionedOverlayPopoverDefaults = {\n  ...positionedOverlayPositionDefaults,\n  offset: 8,\n} satisfies Required<PositionedOverlayPositionProps>;\n\nexport const positionedOverlayTooltipDefaults = {\n  ...positionedOverlayPositionDefaults,\n  offset: 8,\n  placement: \"top\",\n} satisfies Required<PositionedOverlayPositionProps>;\n\nexport const positionedOverlayDropdownMenuDefaults = {\n  ...positionedOverlayPositionDefaults,\n  offset: 8,\n  placement: \"bottom start\",\n} satisfies Required<PositionedOverlayPositionProps>;\n\nexport const positionedOverlayDropdownSubmenuDefaults = {\n  ...positionedOverlayPositionDefaults,\n  crossOffset: -4,\n  offset: -2,\n  placement: \"right top\",\n} satisfies Required<PositionedOverlayPositionProps>;\n\nconst positionedOverlaySurfaceBaseClasses =\n  \"z-50 max-h-[min(var(--dt-overlay-max-height,18rem),calc(100dvh_-_var(--dt-space-4)))] min-w-[var(--dt-overlay-min-width,12rem)] overflow-auto rounded-md border border-border bg-background p-[var(--dt-space-3)] text-foreground shadow-lg outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring [--dt-overlay-motion-x:0px] [--dt-overlay-motion-y:var(--dt-space-1)] data-[placement=bottom]:[--dt-overlay-motion-y:calc(0px_-_var(--dt-space-1))] data-[placement=top]:[--dt-overlay-motion-y:var(--dt-space-1)] data-[placement=left]:[--dt-overlay-motion-x:var(--dt-space-1)] data-[placement=left]:[--dt-overlay-motion-y:0px] data-[placement=right]:[--dt-overlay-motion-x:calc(0px_-_var(--dt-space-1))] data-[placement=right]:[--dt-overlay-motion-y:0px] origin-center data-[placement=top]:origin-bottom data-[placement=bottom]:origin-top data-[placement=left]:origin-right data-[placement=right]:origin-left\";\n\nconst positionedOverlaySurfaceCssAnimationClasses =\n  \"motion-safe:data-[entering]:animate-overlay-in motion-safe:data-[exiting]:animate-overlay-out motion-reduce:animate-none\";\n\nconst positionedOverlayArrowBaseClasses =\n  \"group z-50 flex size-3 items-center justify-center text-background [filter:drop-shadow(0_1px_0.5px_rgb(0_0_0_/_0.06))]\";\n\nconst positionedOverlayArrowShapeBaseClasses =\n  \"block size-3 fill-background stroke-border group-data-[placement=bottom]:rotate-180 group-data-[placement=left]:-rotate-90 group-data-[placement=right]:rotate-90 [stroke-linejoin:round] [stroke-width:1px]\";\n\nexport function resolvePositionedOverlayPositionProps(\n  props: PositionedOverlayPositionProps = {},\n  defaults: Required<PositionedOverlayPositionProps> = positionedOverlayPositionDefaults,\n): Required<PositionedOverlayPositionProps> {\n  return {\n    arrowBoundaryOffset:\n      props.arrowBoundaryOffset ?? defaults.arrowBoundaryOffset,\n    containerPadding: props.containerPadding ?? defaults.containerPadding,\n    crossOffset: props.crossOffset ?? defaults.crossOffset,\n    offset: props.offset ?? defaults.offset,\n    placement: props.placement ?? defaults.placement,\n    shouldFlip: props.shouldFlip ?? defaults.shouldFlip,\n  };\n}\n\nexport function positionedOverlaySurfaceClassNames({\n  animation = \"css\",\n  className,\n}: PositionedOverlaySurfaceClassNameOptions = {}) {\n  return cn(\n    positionedOverlaySurfaceBaseClasses,\n    animation === \"css\" && positionedOverlaySurfaceCssAnimationClasses,\n    className,\n  );\n}\n\nexport function positionedOverlayArrowClassNames({\n  className,\n}: PositionedOverlayArrowClassNameOptions = {}) {\n  return cn(positionedOverlayArrowBaseClasses, className);\n}\n\nexport function positionedOverlayArrowShapeClassNames({\n  className,\n}: PositionedOverlayArrowClassNameOptions = {}) {\n  return cn(positionedOverlayArrowShapeBaseClasses, className);\n}\n\nexport const PositionedOverlayArrow = forwardRef<\n  HTMLDivElement,\n  PositionedOverlayArrowProps\n>(\n  (\n    {\n      \"data-slot\": dataSlot = \"positioned-overlay-arrow\",\n      className,\n      shapeClassName,\n      shapeDataSlot,\n      ...props\n    },\n    ref,\n  ) => (\n    <AriaOverlayArrow\n      {...props}\n      ref={ref}\n      data-slot={dataSlot}\n      className={positionedOverlayArrowClassNames({ className })}\n    >\n      <svg\n        aria-hidden=\"true\"\n        data-slot={shapeDataSlot ?? `${dataSlot}-shape`}\n        focusable=\"false\"\n        viewBox=\"0 0 12 12\"\n        className={positionedOverlayArrowShapeClassNames({\n          className: shapeClassName,\n        })}\n      >\n        <path d=\"M0 0 L6 12 L12 0\" />\n      </svg>\n    </AriaOverlayArrow>\n  ),\n);\n\nPositionedOverlayArrow.displayName = \"PositionedOverlayArrow\";\n"
    },
    {
      "path": "packages/components/src/utils/cn.ts",
      "type": "registry:file",
      "target": "~/components/dethink/utils/cn.ts",
      "content": "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n"
    }
  ]
}
