{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "menu",
  "title": "TIS Menu",
  "author": "TIS Experience Engineering",
  "description": "Menu React com comandos, escolhas, foco e teclado por Base UI, preservando o contrato visual do DS TIS.",
  "dependencies": [
    "@base-ui/react@1.6.0",
    "clsx@2.1.1",
    "lucide-react@1.28.0",
    "tailwind-merge@3.6.0",
    "ds-tis@github:tis-experience/ds-tis#dd4c906943847cb7664a72a0c7637a378b39adcc"
  ],
  "files": [
    {
      "path": "registry/tis/menu.tsx",
      "content": "import * as React from \"react\"\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\"\nimport { CheckIcon, ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"./tis-utils\"\n\ntype MenuSize = \"sm\" | \"md\" | \"lg\"\ntype MenuVariant = \"brand\" | \"danger\" | \"ghost\" | \"outline\" | \"secondary\"\n\nfunction Menu<Payload>(props: MenuPrimitive.Root.Props<Payload>) {\n  return <MenuPrimitive.Root {...props} />\n}\n\nfunction MenuTrigger<Payload>({\n  children,\n  className,\n  size = \"md\",\n  variant = \"outline\",\n  ...props\n}: MenuPrimitive.Trigger.Props<Payload> & { size?: MenuSize; variant?: MenuVariant }) {\n  return (\n    <MenuPrimitive.Trigger\n      className={cn(\"ds-button\", `ds-button--${variant}`, `ds-button--${size}`, \"ds-tis-menu__trigger\", className)}\n      data-slot=\"menu-trigger\"\n      {...props}\n    >\n      {children}\n    </MenuPrimitive.Trigger>\n  )\n}\n\nfunction MenuTriggerIndicator({ className, ...props }: React.ComponentProps<typeof ChevronDownIcon>) {\n  return (\n    <ChevronDownIcon\n      aria-hidden=\"true\"\n      className={cn(\"ds-button__icon ds-icon ds-tis-menu__trigger-indicator\", className)}\n      data-slot=\"menu-trigger-indicator\"\n      {...props}\n    />\n  )\n}\n\nfunction MenuPortal(props: MenuPrimitive.Portal.Props) {\n  return <MenuPrimitive.Portal data-slot=\"menu-portal\" {...props} />\n}\n\nfunction MenuPositioner({\n  align = \"start\",\n  className,\n  side = \"bottom\",\n  sideOffset = 8,\n  ...props\n}: MenuPrimitive.Positioner.Props) {\n  return (\n    <MenuPrimitive.Positioner\n      align={align}\n      className={cn(\"ds-tis-menu__positioner\", className)}\n      data-slot=\"menu-positioner\"\n      side={side}\n      sideOffset={sideOffset}\n      {...props}\n    />\n  )\n}\n\nfunction MenuContent({\n  className,\n  fullWidth = false,\n  size = \"md\",\n  ...props\n}: MenuPrimitive.Popup.Props & { fullWidth?: boolean; size?: MenuSize }) {\n  return (\n    <MenuPrimitive.Popup\n      className={cn(\"ds-menu\", size !== \"md\" && `ds-menu--${size}`, fullWidth && \"ds-menu--full\", \"ds-tis-menu__content\", className)}\n      data-slot=\"menu-content\"\n      {...props}\n    />\n  )\n}\n\nfunction menuItemClass(className?: string, destructive = false) {\n  return cn(\"ds-menu__item\", destructive && \"ds-menu__item--destructive\", \"ds-tis-menu__item\", className)\n}\n\nfunction MenuItem({\n  className,\n  destructive = false,\n  ...props\n}: Omit<MenuPrimitive.Item.Props, \"className\"> & { className?: string; destructive?: boolean }) {\n  return (\n    <MenuPrimitive.Item\n      className={menuItemClass(className, destructive)}\n      data-slot=\"menu-item\"\n      {...props}\n    />\n  )\n}\n\nfunction MenuCheckboxItem({\n  className,\n  closeOnClick = true,\n  destructive = false,\n  ...props\n}: Omit<MenuPrimitive.CheckboxItem.Props, \"className\"> & { className?: string; destructive?: boolean }) {\n  return (\n    <MenuPrimitive.CheckboxItem\n      className={menuItemClass(className, destructive)}\n      closeOnClick={closeOnClick}\n      data-slot=\"menu-checkbox-item\"\n      {...props}\n    />\n  )\n}\n\nfunction MenuRadioGroup({ className, ...props }: MenuPrimitive.RadioGroup.Props) {\n  return <MenuPrimitive.RadioGroup className={cn(\"ds-menu__group\", className)} data-slot=\"menu-radio-group\" {...props} />\n}\n\nfunction MenuRadioItem({\n  className,\n  closeOnClick = true,\n  destructive = false,\n  ...props\n}: Omit<MenuPrimitive.RadioItem.Props, \"className\"> & { className?: string; destructive?: boolean }) {\n  return (\n    <MenuPrimitive.RadioItem\n      className={menuItemClass(className, destructive)}\n      closeOnClick={closeOnClick}\n      data-slot=\"menu-radio-item\"\n      {...props}\n    />\n  )\n}\n\nfunction MenuCheckboxIndicator({ className, ...props }: MenuPrimitive.CheckboxItemIndicator.Props) {\n  return (\n    <span aria-hidden=\"true\" className={cn(\"ds-menu__check\", className)}>\n      <MenuPrimitive.CheckboxItemIndicator\n        className=\"ds-tis-menu__indicator\"\n        data-slot=\"menu-checkbox-indicator\"\n        {...props}\n      >\n        <CheckIcon aria-hidden=\"true\" className=\"ds-icon\" />\n      </MenuPrimitive.CheckboxItemIndicator>\n    </span>\n  )\n}\n\nfunction MenuRadioIndicator({ className, ...props }: MenuPrimitive.RadioItemIndicator.Props) {\n  return (\n    <span aria-hidden=\"true\" className={cn(\"ds-menu__check\", className)}>\n      <MenuPrimitive.RadioItemIndicator\n        className=\"ds-tis-menu__indicator\"\n        data-slot=\"menu-radio-indicator\"\n        {...props}\n      >\n        <CheckIcon aria-hidden=\"true\" className=\"ds-icon\" />\n      </MenuPrimitive.RadioItemIndicator>\n    </span>\n  )\n}\n\nfunction MenuItemText({ className, ...props }: React.ComponentProps<\"span\">) {\n  return <span className={cn(\"ds-menu__item-label\", className)} data-slot=\"menu-item-text\" {...props} />\n}\n\nfunction MenuItemIcon({ className, ...props }: React.ComponentProps<\"span\">) {\n  return <span className={cn(\"ds-menu__icon\", className)} data-slot=\"menu-item-icon\" {...props} />\n}\n\nfunction MenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n  return <span className={cn(\"ds-menu__shortcut\", className)} data-slot=\"menu-shortcut\" {...props} />\n}\n\nfunction MenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props) {\n  return <MenuPrimitive.Separator className={cn(\"ds-menu__separator\", className)} data-slot=\"menu-separator\" {...props} />\n}\n\nfunction MenuGroup({ className, ...props }: MenuPrimitive.Group.Props) {\n  return <MenuPrimitive.Group className={cn(\"ds-menu__group\", className)} data-slot=\"menu-group\" {...props} />\n}\n\nfunction MenuGroupLabel({ className, ...props }: MenuPrimitive.GroupLabel.Props) {\n  return <MenuPrimitive.GroupLabel className={cn(\"ds-menu__label\", className)} data-slot=\"menu-group-label\" {...props} />\n}\n\nexport {\n  Menu,\n  MenuCheckboxIndicator,\n  MenuCheckboxItem,\n  MenuContent,\n  MenuGroup,\n  MenuGroupLabel,\n  MenuItem,\n  MenuItemIcon,\n  MenuItemText,\n  MenuPortal,\n  MenuPositioner,\n  MenuRadioGroup,\n  MenuRadioIndicator,\n  MenuRadioItem,\n  MenuSeparator,\n  MenuShortcut,\n  MenuTrigger,\n  MenuTriggerIndicator,\n}\n",
      "type": "registry:ui",
      "target": "@ui/menu.tsx"
    },
    {
      "path": "registry/tis/tis-utils.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",
      "type": "registry:lib",
      "target": "@ui/tis-utils.ts"
    }
  ],
  "css": {
    "@import \"ds-tis/css\"": {},
    ".ds-tis-menu__trigger": {
      "margin": "0"
    },
    ".ds-tis-menu__trigger-indicator": {
      "transition": "transform var(--ds-motion-duration-fast) var(--ds-motion-ease-default)"
    },
    ".ds-tis-menu__trigger[data-popup-open] .ds-tis-menu__trigger-indicator": {
      "transform": "rotate(180deg)"
    },
    ".ds-tis-menu__positioner": {
      "z-index": "var(--ds-z-tooltip)",
      "max-inline-size": "var(--available-width)"
    },
    ".ds-tis-menu__content": {
      "max-block-size": "min(var(--available-height), var(--ds-size-layout-md))",
      "overflow-y": "auto"
    },
    ".ds-tis-menu__indicator": {
      "display": "contents"
    },
    ".ds-tis-menu__indicator .ds-icon": {
      "width": "100%",
      "height": "100%"
    },
    ".ds-tis-menu__item[data-highlighted]": {
      "background": "var(--ds-menu-item-bg-focused)",
      "color": "var(--ds-menu-item-content-color-focused)"
    },
    ".ds-tis-menu__item[data-disabled]": {
      "background": "var(--ds-menu-item-bg-disabled)",
      "color": "var(--ds-menu-item-content-color-disabled)",
      "cursor": "not-allowed"
    },
    ".ds-tis-menu__item[data-checked] .ds-menu__check": {
      "visibility": "visible"
    }
  },
  "meta": {
    "provider": "Base UI",
    "providerRole": "output-provider",
    "status": "beta",
    "wave": "overlay"
  },
  "docs": "Use Menu para comandos contextuais, não para valor de formulário. Mantenha @import \"ds-tis/css\" como o primeiro import do CSS global.",
  "type": "registry:ui"
}