Dropdown Menu
Displays a menu of items that users can select from when triggered.
	<script lang="ts">
  import { Avatar, DropdownMenu } from "bits-ui";
  import Cardholder from "phosphor-svelte/lib/Cardholder";
  import CaretRight from "phosphor-svelte/lib/CaretRight";
  import DotsThree from "phosphor-svelte/lib/DotsThree";
  import GearSix from "phosphor-svelte/lib/GearSix";
  import UserCircle from "phosphor-svelte/lib/UserCircle";
  import UserCirclePlus from "phosphor-svelte/lib/UserCirclePlus";
 
  let checked = $state(false);
  let invited = $state("");
</script>
 
<DropdownMenu.Root>
  <DropdownMenu.Trigger
    class="focus-visible border-bordinput bg-backgrounder-lt text-a-foreground inline-flex h-10 w-10 items-center justify-center rounded-full border text-sm font-medium shadow-btn hover:bg-muted focus-visible:ring-2 focus-visible:ring-foreground focus-visible:ring-offset-2 focus-visible:ring-offset-background active:scale-98"
  >
    <DotsThree class="h-6 w-6 text-foreground" />
  </DropdownMenu.Trigger>
  <DropdownMenu.Portal>
    <DropdownMenu.Content
      class="focus-override w-full max-w-[229px] rounded-xl border border-muted bg-background px-1 py-1.5 shadow-popover outline-none focus-visible:outline-none"
      sideOffset={8}
    >
      <DropdownMenu.Item
        class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
      >
        <div class="flex items-center">
          <UserCircle class="mr-2 size-5 text-foreground-alt" />
          Profile
        </div>
        <div class="ml-auto flex items-center gap-px">
          <kbd
            class="inline-flex size-5 items-center justify-center rounded-button border border-dark-10 bg-background-alt text-xs text-muted-foreground shadow-kbd"
          >
            ⌘
          </kbd>
          <kbd
            class="inline-flex size-5 items-center justify-center rounded-button border border-dark-10 bg-background-alt text-[10px] text-muted-foreground shadow-kbd"
          >
            P
          </kbd>
        </div>
      </DropdownMenu.Item>
      <DropdownMenu.Item
        class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
      >
        <div class="flex items-center">
          <Cardholder class="mr-2 size-5 text-foreground-alt" />
          Billing
        </div>
        <div class="ml-auto flex items-center gap-px">
          <kbd
            class="inline-flex size-5 items-center justify-center rounded-button border border-dark-10 bg-background-alt text-xs text-muted-foreground shadow-kbd"
          >
            ⌘
          </kbd>
          <kbd
            class="inline-flex size-5 items-center justify-center rounded-button border border-dark-10 bg-background-alt text-[10px] text-muted-foreground shadow-kbd"
          >
            B
          </kbd>
        </div>
      </DropdownMenu.Item>
      <DropdownMenu.Item
        class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
      >
        <div class="flex items-center">
          <GearSix class="mr-2 size-5 text-foreground-alt" />
          Settings
        </div>
        <div class="ml-auto flex items-center gap-px">
          <kbd
            class="inline-flex size-5 items-center justify-center rounded-button border border-dark-10 bg-background-alt text-xs text-muted-foreground shadow-kbd"
          >
            ⌘
          </kbd>
          <kbd
            class="inline-flex size-5 items-center justify-center rounded-button border border-dark-10 bg-background-alt text-[10px] text-muted-foreground shadow-kbd"
          >
            S
          </kbd>
        </div>
      </DropdownMenu.Item>
      <DropdownMenu.CheckboxItem
        bind:checked
        class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
      >
        {#snippet children({ checked })}
          <div class="flex items-center">
            <GearSix class="mr-2 size-5 text-foreground-alt" />
            Settings
          </div>
          <div class="ml-auto flex items-center gap-px">
            {#if checked}
              checked
            {:else}
              unchecked
            {/if}
          </div>
        {/snippet}
      </DropdownMenu.CheckboxItem>
      <DropdownMenu.Sub>
        <DropdownMenu.SubTrigger
          class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted data-[state=open]:bg-muted"
        >
          <div class="flex items-center">
            <UserCirclePlus class="mr-2 size-5 text-foreground-alt" />
            Invite users
          </div>
          <div class="ml-auto flex items-center gap-px">
            <CaretRight class="size-5 text-foreground-alt" />
          </div>
        </DropdownMenu.SubTrigger>
        <DropdownMenu.SubContent
          id="subcontent"
          class="w-full max-w-[209px] rounded-xl border border-muted bg-background px-1 py-1.5 shadow-popover !ring-0 !ring-transparent"
          sideOffset={10}
        >
          <DropdownMenu.RadioGroup bind:value={invited}>
            <DropdownMenu.RadioItem
              value="huntabyte"
              class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
            >
              {#snippet children({ checked })}
                <Avatar.Root
                  class="relative mr-3 flex size-5 shrink-0 overflow-hidden rounded-full border border-foreground/50"
                >
                  <Avatar.Image
                    src="https://github.com/huntabyte.png"
                    alt="@huntabyte"
                    class="aspect-square h-full w-full"
                  />
                  <Avatar.Fallback
                    class="flex h-full w-full items-center justify-center rounded-full bg-muted text-xxs"
                    >HJ</Avatar.Fallback
                  >
                </Avatar.Root>
                @huntabyte
                {#if checked}
                  ×
                {/if}
              {/snippet}
            </DropdownMenu.RadioItem>
            <DropdownMenu.RadioItem
              value="pavel"
              class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
            >
              {#snippet children({ checked })}
                <Avatar.Root
                  class="relative mr-3 flex size-5 shrink-0 overflow-hidden rounded-full border border-foreground/50"
                >
                  <Avatar.Image
                    src="https://github.com/pavelstianko.png"
                    alt="@pavel_stianko"
                    class="aspect-square h-full w-full"
                  />
                  <Avatar.Fallback
                    class="flex h-full w-full items-center justify-center rounded-full bg-muted text-xs"
                    >PS</Avatar.Fallback
                  >
                </Avatar.Root>
                @pavel_stianko
                {#if checked}
                  ×
                {/if}
              {/snippet}
            </DropdownMenu.RadioItem>
            <DropdownMenu.RadioItem
              value="cokakoala"
              class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
            >
              {#snippet children({ checked })}
                <Avatar.Root
                  class="relative mr-3 flex size-5 shrink-0 overflow-hidden rounded-full border border-foreground/50"
                >
                  <Avatar.Image
                    src="https://github.com/adriangonz97.png"
                    alt="@cokakoala_"
                    class="aspect-square h-full w-full"
                  />
                  <Avatar.Fallback
                    class="flex h-full w-full items-center justify-center rounded-full bg-muted text-xs"
                    >CK</Avatar.Fallback
                  >
                </Avatar.Root>
                @cokakoala_
                {#if checked}
                  ×
                {/if}
              {/snippet}
            </DropdownMenu.RadioItem>
            <DropdownMenu.RadioItem
              value="tglide"
              class="flex h-10 select-none items-center rounded-button py-3 pl-3 pr-1.5 text-sm font-medium !ring-0 !ring-transparent data-[highlighted]:bg-muted"
            >
              {#snippet children({ checked })}
                <Avatar.Root
                  class="relative mr-3 flex size-5 shrink-0 overflow-hidden rounded-full border border-foreground/50"
                >
                  <Avatar.Image
                    src="https://github.com/tglide.png"
                    alt="@tglide"
                    class="aspect-square h-full w-full"
                  />
                  <Avatar.Fallback
                    class="flex h-full w-full items-center justify-center rounded-full bg-muted text-xs"
                    >TL</Avatar.Fallback
                  >
                </Avatar.Root>
                @thomasglopes
                {#if checked}
                  ×
                {/if}
              {/snippet}
            </DropdownMenu.RadioItem>
          </DropdownMenu.RadioGroup>
        </DropdownMenu.SubContent>
      </DropdownMenu.Sub>
    </DropdownMenu.Content>
  </DropdownMenu.Portal>
</DropdownMenu.Root>
	import typography from "@tailwindcss/typography";
	import animate from "tailwindcss-animate";
	import { fontFamily } from "tailwindcss/defaultTheme";
	 
	/** @type {import('tailwindcss').Config} */
	export default {
		darkMode: "class",
		content: ["./src/**/*.{html,js,svelte,ts}"],
		theme: {
			container: {
				center: true,
				screens: {
					"2xl": "1440px",
				},
			},
			extend: {
				colors: {
					border: {
						DEFAULT: "hsl(var(--border-card))",
						input: "hsl(var(--border-input))",
						"input-hover": "hsl(var(--border-input-hover))",
					},
					background: {
						DEFAULT: "hsl(var(--background) / <alpha-value>)",
						alt: "hsl(var(--background-alt) / <alpha-value>)",
					},
					foreground: {
						DEFAULT: "hsl(var(--foreground) / <alpha-value>)",
						alt: "hsl(var(--foreground-alt) / <alpha-value>)",
					},
					muted: {
						DEFAULT: "hsl(var(--muted) / <alpha-value>)",
						foreground: "hsl(var(--muted-foreground))",
					},
					dark: {
						DEFAULT: "hsl(var(--dark) / <alpha-value>)",
						4: "hsl(var(--dark-04))",
						10: "hsl(var(--dark-10))",
						40: "hsl(var(--dark-40))",
					},
					accent: {
						DEFAULT: "hsl(var(--accent) / <alpha-value>)",
						foreground: "hsl(var(--accent-foreground) / <alpha-value>)",
					},
					destructive: {
						DEFAULT: "hsl(var(--destructive) / <alpha-value>)",
					},
					contrast: {
						DEFAULT: "hsl(var(--contrast) / <alpha-value>)",
					},
				},
				fontFamily: {
					sans: ["Inter", ...fontFamily.sans],
					mono: ["Source Code Pro", ...fontFamily.mono],
					alt: ["Courier", ...fontFamily.sans],
				},
				fontSize: {
					xxs: "10px",
				},
				borderWidth: {
					6: "6px",
				},
				borderRadius: {
					card: "16px",
					"card-lg": "20px",
					"card-sm": "10px",
					input: "9px",
					button: "5px",
					"5px": "5px",
					"9px": "9px",
					"10px": "10px",
					"15px": "15px",
				},
				height: {
					input: "3rem",
					"input-sm": "2.5rem",
				},
				boxShadow: {
					mini: "var(--shadow-mini)",
					"mini-inset": "var(--shadow-mini-inset)",
					popover: "var(--shadow-popover)",
					kbd: "var(--shadow-kbd)",
					btn: "var(--shadow-btn)",
					card: "var(--shadow-card)",
					"date-field-focus": "var(--shadow-date-field-focus)",
				},
				opacity: {
					8: "0.08",
				},
				scale: {
					80: ".80",
					98: ".98",
					99: ".99",
				},
			},
			keyframes: {
				"accordion-down": {
					from: { height: "0" },
					to: { height: "var(--bits-accordion-content-height)" },
				},
				"accordion-up": {
					from: { height: "var(--bits-accordion-content-height)" },
					to: { height: "0" },
				},
				"caret-blink": {
					"0%,70%,100%": { opacity: "1" },
					"20%,50%": { opacity: "0" },
				},
			},
			animation: {
				"accordion-down": "accordion-down 0.2s ease-out",
				"accordion-up": "accordion-up 0.2s ease-out",
				"caret-blink": "caret-blink 1.25s ease-out infinite",
			},
		},
		plugins: [typography, animate],
	};
		@import url("https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap");
 
@tailwind base;
@tailwind components;
@tailwind utilities;
 
@layer base {
	:root {
		/* Colors */
		--background: 0 0% 100%;
		--background-alt: 0 0% 100%;
		--foreground: 0 0% 9%;
		--foreground-alt: 0 0% 32%;
		--muted: 240 5% 96%;
		--muted-foreground: 0 0% 9% / 0.4;
		--border: 240 6% 10%;
		--border-input: 240 6% 10% / 0.17;
		--border-input-hover: 240 6% 10% / 0.4;
		--border-card: 240 6% 10% / 0.1;
		--dark: 240 6% 10%;
		--dark-10: 240 6% 10% / 0.1;
		--dark-40: 240 6% 10% / 0.4;
		--dark-04: 240 6% 10% / 0.04;
		--accent: 204 94% 94%;
		--accent-foreground: 204 80% 16%;
		--destructive: 347 77% 50%;
 
		/* black */
		--constrast: 0 0% 0%;
 
		/* Shadows */
		--shadow-mini: 0px 1px 0px 1px rgba(0, 0, 0, 0.04);
		--shadow-mini-inset: 0px 1px 0px 0px rgba(0, 0, 0, 0.04) inset;
		--shadow-popover: 0px 7px 12px 3px hsla(var(--dark-10));
		--shadow-kbd: 0px 2px 0px 0px rgba(0, 0, 0, 0.07);
		--shadow-btn: 0px 1px 0px 1px rgba(0, 0, 0, 0.03);
		--shadow-card: 0px 2px 0px 1px rgba(0, 0, 0, 0.04);
		--shadow-date-field-focus: 0px 0px 0px 3px rgba(24, 24, 27, 0.17);
	}
 
	.dark {
		/* Colors */
		--background: 0 0% 5%;
		--background-alt: 0 0% 8%;
		--foreground: 0 0% 95%;
		--foreground-alt: 0 0% 70%;
		--muted: 240 4% 16%;
		--muted-foreground: 0 0% 100% / 0.4;
		--border: 0 0% 96%;
		--border-input: 0 0% 96% / 0.17;
		--border-input-hover: 0 0% 96% / 0.4;
		--border-card: 0 0% 96% / 0.1;
		--dark: 0 0% 96%;
		--dark-40: 0 0% 96% / 0.4;
		--dark-10: 0 0% 96% / 0.1;
		--dark-04: 0 0% 96% / 0.04;
		--accent: 204 90 90%;
		--accent-foreground: 204 94% 94%;
		--destructive: 350 89% 60%;
 
		/* white */
		--constrast: 0 0% 100%;
 
		/* Shadows */
		--shadow-mini: 0px 1px 0px 1px rgba(0, 0, 0, 0.3);
		--shadow-mini-inset: 0px 1px 0px 0px rgba(0, 0, 0, 0.5) inset;
		--shadow-popover: 0px 7px 12px 3px hsla(0deg 0% 0% / 30%);
		--shadow-kbd: 0px 2px 0px 0px rgba(255, 255, 255, 0.07);
		--shadow-btn: 0px 1px 0px 1px rgba(0, 0, 0, 0.2);
		--shadow-card: 0px 2px 0px 1px rgba(0, 0, 0, 0.4);
		--shadow-date-field-focus: 0px 0px 0px 3px rgba(244, 244, 245, 0.1);
	}
}
 
@layer base {
	* {
		@apply border-border;
	}
	html {
		-webkit-text-size-adjust: 100%;
		font-variation-settings: normal;
	}
	body {
		@apply bg-background text-foreground;
		font-feature-settings:
			"rlig" 1,
			"calt" 1;
	}
 
	/* Mobile tap highlight */
	/* https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-tap-highlight-color */
	html {
		-webkit-tap-highlight-color: rgba(128, 128, 128, 0.5);
	}
	::selection {
		background: #fdffa4;
		color: black;
	}
 
	/* === Scrollbars === */
 
	::-webkit-scrollbar {
		@apply w-2;
		@apply h-2;
	}
 
	::-webkit-scrollbar-track {
		@apply !bg-transparent;
	}
	::-webkit-scrollbar-thumb {
		@apply rounded-card-lg !bg-dark-10;
	}
 
	::-webkit-scrollbar-corner {
		background: rgba(0, 0, 0, 0);
	}
 
	/* Firefox */
	/* https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-color#browser_compatibility */
 
	html {
		scrollbar-color: var(--bg-muted);
	}
 
	.antialised {
		-webkit-font-smoothing: antialiased;
		-moz-osx-font-smoothing: grayscale;
	}
}
 
@layer utilities {
	.step {
		counter-increment: step;
	}
 
	.step:before {
		@apply absolute inline-flex h-9 w-9 items-center justify-center rounded-full border-4 border-background bg-muted text-center -indent-px font-mono text-base font-medium;
		@apply ml-[-50px] mt-[-4px];
		content: counter(step);
	}
}
 
@layer components {
	*:not(body):not(.focus-override) {
		outline: none !important;
		&:focus-visible {
			@apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground focus-visible:ring-offset-2 focus-visible:ring-offset-background;
		}
	}
 
	.link {
		@apply inline-flex items-center gap-1 rounded-sm font-medium underline underline-offset-4 hover:text-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground focus-visible:ring-offset-2 focus-visible:ring-offset-background;
	}
 
	input::-webkit-outer-spin-button,
	input::-webkit-inner-spin-button {
		-webkit-appearance: none;
		margin: 0;
	}
 
	/* Firefox */
	input[type="number"] {
		-moz-appearance: textfield;
	}
}
API Reference
The root component which manages & scopes the state of the dropdown menu.
| Property | Type | Description | 
|---|---|---|
| openbindable prop | boolean | The open state of the menu. Default:  false | 
| onOpenChange | function | A callback that is fired when the menu's open state changes. Default:  undefined | 
| dir | enum | The reading direction of the app. Default:  ltr | 
| children | Snippet | The children content to render. Default:  undefined | 
The button element which toggles the dropdown menu.
| Property | Type | Description | 
|---|---|---|
| disabled | boolean | Whether or not the menu trigger is disabled. Default:  false | 
| refbindable prop | HTMLButtonElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-state | enum | The open state of the menu or submenu the element controls or belongs to. | 
| data-menu-trigger | '' | Present on the trigger element. | 
The content displayed when the dropdown menu is open.
| Property | Type | Description | 
|---|---|---|
| side | enum | The preferred side of the anchor to render the floating element against when open. Will be reversed when collisions occur. Default:  bottom | 
| sideOffset | number | The distance in pixels from the anchor to the floating element. Default:  0 | 
| align | enum | The preferred alignment of the anchor to render the floating element against when open. This may change when collisions occur. Default:  start | 
| alignOffset | number | The distance in pixels from the anchor to the floating element. Default:  0 | 
| arrowPadding | number | The amount in pixels of virtual padding around the viewport edges to check for overflow which will cause a collision. Default:  0 | 
| avoidCollisions | boolean | When  Default:  true | 
| collisionBoundary | union | A boundary element or array of elements to check for collisions against. Default:  undefined | 
| collisionPadding | union | The amount in pixels of virtual padding around the viewport edges to check for overflow which will cause a collision. Default:  0 | 
| sticky | enum | The sticky behavior on the align axis.  Default:  partial | 
| hideWhenDetached | boolean | When  Default:  true | 
| updatePositionStrategy | enum | The strategy to use when updating the position of the content. When  Default:  optimized | 
| strategy | enum | The positioning strategy to use for the floating element. When  Default:  fixed | 
| preventScroll | boolean | When  Default:  true | 
| onEscapeKeydown | function | Callback fired when an escape keydown event occurs in the floating content. You can call  Default:  undefined | 
| escapeKeydownBehavior | enum | The behavior to use when an escape keydown event occurs in the floating content.  Default:  close | 
| onInteractOutside | function | Callback fired when an outside interaction event completes, which is either a  Default:  undefined | 
| onInteractOutsideStart | function | Callback fired when an outside interaction event starts, which is either a  Default:  undefined | 
| onFocusOutside | function | Callback fired when focus leaves the dismissable layer. You can call  Default:  undefined | 
| interactOutsideBehavior | enum | The behavior to use when an interaction occurs outside of the floating content.  Default:  close | 
| onMountAutoFocus | function | Event handler called when auto-focusing the content as it is mounted. Can be prevented. Default:  undefined | 
| onDestroyAutoFocus | function | Event handler called when auto-focusing the content as it is destroyed. Can be prevented. Default:  undefined | 
| forceMount | boolean | Whether or not to forcefully mount the content. This is useful if you want to use Svelte transitions or another animation library for the content. Default:  false | 
| preventOverflowTextSelection | boolean | When  Default:  true | 
| dir | enum | The reading direction of the app. Default:  ltr | 
| loop | boolean | Whether or not to loop through the menu items in when navigating with the keyboard. Default:  false | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-state | enum | The open state of the menu or submenu the element controls or belongs to. | 
| data-menu-content | '' | Present on the content element. | 
A menu item within the dropdown menu.
| Property | Type | Description | 
|---|---|---|
| disabled | boolean | Whether or not the menu item is disabled. Default:  false | 
| textValue | string | The text value of the checkbox menu item. This is used for typeahead. Default:  undefined | 
| onSelect | function | A callback that is fired when the menu item is selected. Default:  undefined | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-orientation | vertical | |
| data-highlighted | '' | Present when the menu item is highlighted. | 
| data-disabled | '' | Present when the menu item is disabled. | 
| data-menu-item | '' | Present on the item element. | 
A menu item that can be controlled and toggled like a checkbox.
| Property | Type | Description | 
|---|---|---|
| disabled | boolean | Whether or not the checkbox menu item is disabled. Disabled items cannot be interacted with and are skipped when navigating with the keyboard. Default:  false | 
| checkedbindable prop | union | The checkbox menu item's checked state. Default:  false | 
| onCheckedChange | function | A callback that is fired when the checkbox menu item's checked state changes. Default:  undefined | 
| textValue | string | The text value of the checkbox menu item. This is used for typeahead. Default:  undefined | 
| onSelect | function | A callback that is fired when the menu item is selected. Default:  undefined | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-orientation | vertical | |
| data-highlighted | '' | Present when the menu item is highlighted. | 
| data-disabled | '' | Present when the menu item is disabled. | 
| data-state | enum | The checkbox menu item's checked state. | 
A group of radio menu items, where only one can be checked at a time.
| Property | Type | Description | 
|---|---|---|
| valuebindable prop | string | The value of the currently checked radio menu item. Default:  undefined | 
| onValueChange | function | A callback that is fired when the radio group's value changes. Default:  undefined | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-menu-radio-group | '' | Present on the radio group element. | 
A menu item that can be controlled and toggled like a radio button. It must be a child of a RadioGroup.
| Property | Type | Description | 
|---|---|---|
| valueRequired | string | The value of the radio item. When checked, the parent  Default:  undefined | 
| disabled | boolean | Whether or not the radio menu item is disabled. Disabled items cannot be interacted with and are skipped when navigating with the keyboard. Default:  false | 
| textValue | string | The text value of the checkbox menu item. This is used for typeahead. Default:  undefined | 
| onSelect | function | A callback that is fired when the menu item is selected. Default:  undefined | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-orientation | vertical | |
| data-highlighted | '' | Present when the menu item is highlighted. | 
| data-disabled | '' | Present when the menu item is disabled. | 
| data-state | enum | The radio menu item's checked state. | 
| data-value | '' | The value of the radio item. | 
| data-menu-radio-item | '' | Present on the radio item element. | 
A horizontal line to visually separate menu items.
| Property | Type | Description | 
|---|---|---|
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-orientation | vertical | The orientation of the separator. | 
| data-menu-separator | '' | Present on the separator element. | 
An optional arrow which points to the dropdown menu's anchor/trigger point.
| Property | Type | Description | 
|---|---|---|
| width | number | The width of the arrow in pixels. Default:  8 | 
| height | number | The height of the arrow in pixels. Default:  8 | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-state | enum | The open state of the menu or submenu the element controls or belongs to. | 
| data-menu-arrow | '' | Present on the arrow element. | 
A group of menu items. It can be used along with the Menu.Label component to provide a visual label for a group of menu items. When a label is within a group, appropriate aria attributes will be applied to the group.
| Property | Type | Description | 
|---|---|---|
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-menu-group | '' | Present on the group element. | 
A label which will be skipped when navigating with the keyboard. It is used to provide a visual label for a group of menu items. When a label is within a Menu.Group, appropriate aria attributes will be applied to the group.
| Property | Type | Description | 
|---|---|---|
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-menu-label | '' | Present on the group label element. | 
A submenu belonging to the parent dropdown menu. Responsible for managing the state of the submenu.
| Property | Type | Description | 
|---|---|---|
| openbindable prop | boolean | The open state of the submenu. Default:  false | 
| onOpenChange | function | A callback that is fired when the submenu's open state changes. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
A menu item which when pressed or hovered, opens the submenu.
| Property | Type | Description | 
|---|---|---|
| disabled | boolean | Whether or not the submenu trigger is disabled. Default:  false | 
| textValue | string | The text value of the checkbox menu item. This is used for typeahead. Default:  undefined | 
| onSelect | function | A callback that is fired when the menu item is selected. Default:  undefined | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-orientation | vertical | |
| data-highlighted | '' | Present when the menu item is highlighted. | 
| data-disabled | '' | Present when the menu item is disabled. | 
| data-state | enum | The open state of the menu or submenu the element controls or belongs to. | 
| data-menu-subtrigger | '' | Present on the submenu trigger element. | 
The submenu content displayed when the parent submenu is open.
| Property | Type | Description | 
|---|---|---|
| side | enum | The preferred side of the anchor to render the floating element against when open. Will be reversed when collisions occur. Default:  bottom | 
| sideOffset | number | The distance in pixels from the anchor to the floating element. Default:  0 | 
| align | enum | The preferred alignment of the anchor to render the floating element against when open. This may change when collisions occur. Default:  start | 
| alignOffset | number | The distance in pixels from the anchor to the floating element. Default:  0 | 
| arrowPadding | number | The amount in pixels of virtual padding around the viewport edges to check for overflow which will cause a collision. Default:  0 | 
| avoidCollisions | boolean | When  Default:  true | 
| collisionBoundary | union | A boundary element or array of elements to check for collisions against. Default:  undefined | 
| collisionPadding | union | The amount in pixels of virtual padding around the viewport edges to check for overflow which will cause a collision. Default:  0 | 
| sticky | enum | The sticky behavior on the align axis.  Default:  partial | 
| hideWhenDetached | boolean | When  Default:  true | 
| updatePositionStrategy | enum | The strategy to use when updating the position of the content. When  Default:  optimized | 
| strategy | enum | The positioning strategy to use for the floating element. When  Default:  fixed | 
| preventScroll | boolean | When  Default:  true | 
| onEscapeKeydown | function | Callback fired when an escape keydown event occurs in the floating content. You can call  Default:  undefined | 
| escapeKeydownBehavior | enum | The behavior to use when an escape keydown event occurs in the floating content.  Default:  close | 
| onInteractOutside | function | Callback fired when an outside interaction event completes, which is either a  Default:  undefined | 
| onInteractOutsideStart | function | Callback fired when an outside interaction event starts, which is either a  Default:  undefined | 
| onFocusOutside | function | Callback fired when focus leaves the dismissable layer. You can call  Default:  undefined | 
| interactOutsideBehavior | enum | The behavior to use when an interaction occurs outside of the floating content.  Default:  close | 
| onMountAutoFocus | function | Event handler called when auto-focusing the content as it is mounted. Can be prevented. Default:  undefined | 
| onDestroyAutoFocus | function | Event handler called when auto-focusing the content as it is destroyed. Can be prevented. Default:  undefined | 
| forceMount | boolean | Whether or not to forcefully mount the content. This is useful if you want to use Svelte transitions or another animation library for the content. Default:  false | 
| preventOverflowTextSelection | boolean | When  Default:  true | 
| dir | enum | The reading direction of the app. Default:  ltr | 
| loop | boolean | Whether or not to loop through the menu items in when navigating with the keyboard. Default:  false | 
| refbindable prop | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default:  undefined | 
| children | Snippet | The children content to render. Default:  undefined | 
| child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default:  undefined | 
| Data Attribute | Value | Description | 
|---|---|---|
| data-state | enum | The open state of the menu or submenu the element controls or belongs to. | 
| data-menu-subcontent | '' | Present on the submenu content element. |