{
  "schemaVersion": 2,
  "components": {
    "actionbar": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ActionBar",
      "id": "actionbar",
      "name": "ActionBar",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "experimental-components-actionbar--default",
          "code": "() => (\n  <ActionBar aria-label=\"Toolbar\">\n    <ActionBar.IconButton\n      icon={BoldIcon}\n      aria-label=\"Bold\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={ItalicIcon}\n      aria-label=\"Italic\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={CodeIcon}\n      aria-label=\"Code\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={LinkIcon}\n      aria-label=\"Link\"\n    ></ActionBar.IconButton>\n    <ActionBar.Divider />\n    <ActionBar.IconButton\n      icon={FileAddedIcon}\n      aria-label=\"File Added\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={SearchIcon}\n      aria-label=\"Search\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={QuoteIcon}\n      aria-label=\"Insert Quote\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={ListUnorderedIcon}\n      aria-label=\"Unordered List\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={ListOrderedIcon}\n      aria-label=\"Ordered List\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={TasklistIcon}\n      aria-label=\"Task List\"\n      onClick={() => alert('Task List clicked')}\n    ></ActionBar.IconButton>\n  </ActionBar>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "required": false,
          "description": "When provided, a label is added to the action bar"
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "required": false,
          "description": "When provided, uses the element with that ID as the accessible name for the ActionBar"
        },
        {
          "name": "children",
          "type": "ReactNode",
          "required": false,
          "description": "Buttons in the action bar",
          "defaultValue": ""
        },
        {
          "name": "size",
          "type": "'small' | 'large' | 'medium'",
          "required": false,
          "defaultValue": "'medium'",
          "description": "Size of the action bar"
        },
        {
          "name": "flush",
          "type": "boolean",
          "required": false,
          "defaultValue": "false",
          "description": "Allows ActionBar to be flush with the container"
        },
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Custom className",
          "defaultValue": ""
        },
        {
          "name": "gap",
          "type": "'none' | 'condensed'",
          "required": false,
          "defaultValue": "'condensed'",
          "description": "Horizontal gap scale between items (restricted to none or condensed)."
        }
      ],
      "subcomponents": [
        {
          "name": "ActionBar.IconButton",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "This will be the Button description."
            },
            {
              "name": "icon",
              "type": "Component",
              "defaultValue": "",
              "description": "Provide an octicon. It will be placed in the center of the button"
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "description": "Use an aria label to describe the functionality of the button. Please refer to [our guidance on alt text](https://primer.style/guides/accessibility/alternative-text-for-images) for tips on writing good alternative text."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "description": "Provides a disabled state for the button. The button will remain focusable, and have `aria-disabled` applied."
            }
          ],
          "passthrough": {
            "element": "IconButton",
            "url": "/react/IconButton"
          }
        },
        {
          "name": "ActionBar.Divider",
          "props": []
        },
        {
          "name": "ActionBar.Group",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "ActionBar.Menu",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "required": true,
              "description": "Accessible label for the menu button."
            },
            {
              "name": "icon",
              "type": "Component",
              "required": true,
              "description": "Icon for the menu button."
            },
            {
              "name": "items",
              "type": "ActionBarMenuItemProps[]",
              "required": true,
              "description": "Array of menu items to render in the menu. Each item can be an action, group, or divider."
            },
            {
              "name": "overflowIcon",
              "type": "Component | 'none'",
              "required": false,
              "description": "Icon displayed when the menu item is within the overflow menu. If 'none' is provided, no icon will be shown in the overflow menu."
            },
            {
              "name": "returnFocusRef",
              "type": "React.RefObject<HTMLElement>",
              "required": false,
              "description": "A ref to an element that should receive focus when the menu is closed."
            }
          ]
        }
      ]
    },
    "action_list": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ActionList",
      "id": "action_list",
      "name": "ActionList",
      "status": "beta",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-actionlist--default",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>Copy link</ActionList.Item>\n    <ActionList.Item>Quote reply</ActionList.Item>\n    <ActionList.Item>Edit comment</ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--simple-list",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>Copy link</ActionList.Item>\n    <ActionList.Item>Quote reply</ActionList.Item>\n    <ActionList.Item>Edit comment</ActionList.Item>\n    <ActionList.Divider />\n    <ActionList.Item variant=\"danger\">Delete file</ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--with-visual-list-heading",
          "code": "() => (\n  <ActionList>\n    <ActionList.Heading as=\"h2\" size=\"small\">\n      Filter by\n    </ActionList.Heading>\n    <ActionList.Group>\n      <ActionList.GroupHeading as=\"h3\">Repositories</ActionList.GroupHeading>\n      <ActionList.Item onSelect={() => {}}>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        app/assets/modules\n      </ActionList.Item>\n      <ActionList.Item onSelect={() => {}}>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        src/react/components\n      </ActionList.Item>\n      <ActionList.Item onSelect={() => {}}>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        memex/shared-ui/components\n      </ActionList.Item>\n      <ActionList.Item onSelect={() => {}}>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        views/assets/modules\n      </ActionList.Item>\n    </ActionList.Group>\n\n    <ActionList.Group>\n      <ActionList.GroupHeading as=\"h3\">Advanced</ActionList.GroupHeading>\n      <ActionList.Item onSelect={() => {}}>\n        <ActionList.LeadingVisual>\n          <PlusCircleIcon />\n        </ActionList.LeadingVisual>\n        Owner\n      </ActionList.Item>\n      <ActionList.Item onSelect={() => {}}>\n        <ActionList.LeadingVisual>\n          <PlusCircleIcon />\n        </ActionList.LeadingVisual>\n        Symbol\n      </ActionList.Item>\n      <ActionList.Item onSelect={() => {}}>\n        <ActionList.LeadingVisual>\n          <PlusCircleIcon />\n        </ActionList.LeadingVisual>\n        Exclude archived\n      </ActionList.Item>\n    </ActionList.Group>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--with-custom-heading",
          "code": "() => (\n  <>\n    <Heading as=\"h1\" id=\"list-heading\" className={classes.HeadingLarge}>\n      Details\n    </Heading>\n    <ActionList aria-labelledby=\"list-heading\">\n      <ActionList.LinkItem href=\"https://github.com/primer/react#readme\">\n        <ActionList.LeadingVisual>\n          <BookIcon />\n        </ActionList.LeadingVisual>\n        Readme\n      </ActionList.LinkItem>\n      <ActionList.LinkItem href=\"https://github.com/primer/react/blob/main/LICENSE\">\n        <ActionList.LeadingVisual>\n          <LawIcon />\n        </ActionList.LeadingVisual>\n        MIT License\n      </ActionList.LinkItem>\n      <ActionList.LinkItem href=\"https://github.com/primer/react/stargazers\">\n        <ActionList.LeadingVisual>\n          <StarIcon />\n        </ActionList.LeadingVisual>\n        <strong>1.5k</strong> stars\n      </ActionList.LinkItem>\n      <ActionList.LinkItem href=\"https://github.com/primer/react/watchers\">\n        <ActionList.LeadingVisual>\n          <EyeIcon />\n        </ActionList.LeadingVisual>\n        <strong>21</strong> watching\n      </ActionList.LinkItem>\n      <ActionList.LinkItem href=\"https://github.com/primer/react/network/members\">\n        <ActionList.LeadingVisual>\n          <RepoForkedIcon />\n        </ActionList.LeadingVisual>\n        <strong>225</strong> forks\n      </ActionList.LinkItem>\n    </ActionList>\n  </>\n)"
        },
        {
          "id": "components-actionlist-features--with-icons",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <LinkIcon />\n      </ActionList.LeadingVisual>\n      github.com/primer\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <LawIcon />\n      </ActionList.LeadingVisual>\n      MIT License\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <StarIcon />\n      </ActionList.LeadingVisual>\n      256 stars\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <RepoForkedIcon />\n      </ActionList.LeadingVisual>\n      3 forks\n    </ActionList.Item>\n    <ActionList.Item variant=\"danger\">\n      <ActionList.LeadingVisual>\n        <AlertIcon />\n      </ActionList.LeadingVisual>\n      4 vulnerabilities\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--with-avatars",
          "code": "() => (\n  <ActionList>\n    {users.map((user) => (\n      <ActionList.Item key={user.login}>\n        <ActionList.LeadingVisual>\n          <Avatar src={`https://github.com/${user.login}.png`} />\n        </ActionList.LeadingVisual>\n        {user.login}\n      </ActionList.Item>\n    ))}\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--item-dividers",
          "code": "() => (\n  <ActionList showDividers>\n    <ActionList.Item>Copy link</ActionList.Item>\n    <ActionList.Item>Quote reply</ActionList.Item>\n    <ActionList.Item>Edit comment</ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--single-divider",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>Copy link</ActionList.Item>\n    <ActionList.Item>Quote reply</ActionList.Item>\n    <ActionList.Item>Edit comment</ActionList.Item>\n    <ActionList.Divider />\n    <ActionList.Item variant=\"danger\">Delete file</ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--inline-description",
          "code": "() => (\n  <ActionList>\n    {users.map((user) => (\n      <ActionList.Item key={user.login}>\n        <ActionList.LeadingVisual>\n          <Avatar src={`https://github.com/${user.login}.png`} />\n        </ActionList.LeadingVisual>\n        {user.login}\n        <ActionList.Description>{user.name}</ActionList.Description>\n      </ActionList.Item>\n    ))}\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--block-description",
          "code": "() => (\n  <ActionList>\n    {users.map((user) => (\n      <ActionList.Item key={user.login}>\n        <ActionList.LeadingVisual>\n          <Avatar src={`https://github.com/${user.login}.png`} />\n        </ActionList.LeadingVisual>\n        {user.login}\n        <ActionList.Description variant=\"block\">\n          {user.name}\n        </ActionList.Description>\n      </ActionList.Item>\n    ))}\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--single-select",
          "code": "() => {\n  const [selectedIndex, setSelectedIndex] = React.useState(0)\n  return (\n    <ActionList\n      selectionVariant=\"single\"\n      showDividers\n      role=\"menu\"\n      aria-label=\"Project\"\n    >\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          role=\"menuitemradio\"\n          selected={index === selectedIndex}\n          aria-checked={index === selectedIndex}\n          onSelect={() => setSelectedIndex(index)}\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--inactive-single-select",
          "code": "() => {\n  const [selectedIndex, setSelectedIndex] = React.useState(1)\n  return (\n    <ActionList\n      selectionVariant=\"single\"\n      showDividers\n      role=\"menu\"\n      aria-label=\"Project\"\n    >\n      {/* menuitem because state is inactive */}\n      <ActionList.Item\n        role=\"menuitem\"\n        selected={false}\n        inactiveText=\"Unavailable due to an outage\"\n      >\n        Inactive item\n      </ActionList.Item>\n      <ActionList.Item\n        role=\"menuitemradio\"\n        selected={selectedIndex === 1}\n        aria-checked={selectedIndex === 1}\n        onSelect={() => setSelectedIndex(1)}\n      >\n        Item 2\n      </ActionList.Item>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--multi-select",
          "code": "() => {\n  const [selectedIndices, setSelectedIndices] = React.useState<number[]>([0])\n  const handleSelect = (index: number) => {\n    if (selectedIndices.includes(index)) {\n      setSelectedIndices(selectedIndices.filter((i) => i !== index))\n    } else {\n      setSelectedIndices([...selectedIndices, index])\n    }\n  }\n  return (\n    <ActionList\n      selectionVariant=\"multiple\"\n      showDividers\n      role=\"menu\"\n      aria-label=\"Project\"\n    >\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          role=\"menuitemcheckbox\"\n          selected={selectedIndices.includes(index)}\n          aria-checked={selectedIndices.includes(index)}\n          onSelect={() => handleSelect(index)}\n          disabled={index === 3 ? true : undefined}\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--listbox-single-select",
          "code": "() => {\n  const [selectedIndice, setSelectedIndice] = React.useState<number>(0)\n  const handleSelect = (index: number) => {\n    setSelectedIndice(index)\n  }\n  return (\n    <ActionList selectionVariant=\"single\" role=\"listbox\" aria-label=\"Projects\">\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          selected={selectedIndice === index}\n          aria-checked={selectedIndice === index}\n          onSelect={() => handleSelect(index)}\n          disabled={index === 3 ? true : undefined}\n          role=\"option\"\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--listbox-multi-select",
          "code": "() => {\n  const [selectedIndices, setSelectedIndices] = React.useState<number[]>([0])\n  const handleSelect = (index: number) => {\n    if (selectedIndices.includes(index)) {\n      setSelectedIndices(selectedIndices.filter((i) => i !== index))\n    } else {\n      setSelectedIndices([...selectedIndices, index])\n    }\n  }\n  return (\n    <ActionList role=\"menu\" selectionVariant=\"multiple\" aria-label=\"Projects\">\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          role=\"menuitemcheckbox\"\n          selected={selectedIndices.includes(index)}\n          aria-checked={selectedIndices.includes(index)}\n          onSelect={() => handleSelect(index)}\n          disabled={index === 3 ? true : undefined}\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--with-dynamic-content",
          "code": "() => {\n  const [isTrue, setIsTrue] = React.useState(false)\n  return (\n    <ActionList>\n      <ActionList.Item\n        onSelect={() => {\n          setIsTrue(!isTrue)\n        }}\n      >\n        Activated? {isTrue ? 'Yes' : 'No'}\n      </ActionList.Item>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--disabled-selected-multiselect",
          "code": "() => (\n  <ActionList selectionVariant=\"multiple\" role=\"menu\" aria-label=\"Project\">\n    <ActionList.Item role=\"menuitemcheckbox\" selected aria-checked disabled>\n      Selected disabled item\n    </ActionList.Item>\n    <ActionList.Item\n      role=\"menuitemcheckbox\"\n      selected={false}\n      aria-checked={false}\n    >\n      Item 2\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--disabled-multiselect",
          "code": "() => (\n  <ActionList selectionVariant=\"multiple\" role=\"menu\" aria-label=\"Project\">\n    <ActionList.Item\n      role=\"menuitemcheckbox\"\n      selected={false}\n      aria-checked={false}\n      disabled\n    >\n      Disabled item\n    </ActionList.Item>\n    <ActionList.Item\n      role=\"menuitemcheckbox\"\n      selected={false}\n      aria-checked={false}\n    >\n      Item 2\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--inactive-multiselect",
          "code": "() => {\n  const [selectedIndices, setSelectedIndices] = React.useState<number[]>([0])\n  const handleSelect = (index: number) => {\n    if (selectedIndices.includes(index)) {\n      setSelectedIndices(selectedIndices.filter((i) => i !== index))\n    } else {\n      setSelectedIndices([...selectedIndices, index])\n    }\n  }\n  return (\n    <ActionList selectionVariant=\"multiple\" role=\"menu\" aria-label=\"Project\">\n      {/* menuitem because state is inactive */}\n      <ActionList.Item\n        role=\"menuitem\"\n        selected={false}\n        inactiveText=\"Unavailable due to an outage\"\n      >\n        Inactive item\n      </ActionList.Item>\n      <ActionList.Item\n        role=\"menuitemcheckbox\"\n        selected={selectedIndices.includes(1)}\n        aria-checked={selectedIndices.includes(1)}\n        onSelect={() => handleSelect(1)}\n      >\n        Item 2\n      </ActionList.Item>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--disabled-item",
          "code": "() => {\n  const [selectedIndex, setSelectedIndex] = React.useState(0)\n  return (\n    <ActionList\n      selectionVariant=\"single\"\n      showDividers\n      role=\"menu\"\n      aria-label=\"Project\"\n    >\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          role=\"menuitemradio\"\n          selected={index === selectedIndex}\n          aria-checked={index === selectedIndex}\n          onSelect={() => setSelectedIndex(index)}\n          disabled={index === 1}\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--inactive-item",
          "code": "() => {\n  return (\n    <ActionList aria-label=\"Project\">\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          inactiveText={\n            index === 1 ? 'Unavailable due to an outage' : undefined\n          }\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--loading-item",
          "code": "() => {\n  return (\n    <ActionList aria-label=\"Project\">\n      {projects.map((project, index) => (\n        <ActionList.Item key={index} loading={index === 1}>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--links",
          "code": "() => (\n  <ActionList>\n    <ActionList.Heading as=\"h1\" className={classes.HeadingSmall}>\n      Details\n    </ActionList.Heading>\n    <ActionList.LinkItem href=\"https://github.com/primer/react#readme\">\n      <ActionList.LeadingVisual>\n        <BookIcon />\n      </ActionList.LeadingVisual>\n      Readme\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/blob/main/LICENSE\">\n      <ActionList.LeadingVisual>\n        <LawIcon />\n      </ActionList.LeadingVisual>\n      MIT License\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/stargazers\">\n      <ActionList.LeadingVisual>\n        <StarIcon />\n      </ActionList.LeadingVisual>\n      <strong>1.5k</strong> stars\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/watchers\">\n      <ActionList.LeadingVisual>\n        <EyeIcon />\n      </ActionList.LeadingVisual>\n      <strong>21</strong> watching\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/network/members\">\n      <ActionList.LeadingVisual>\n        <RepoForkedIcon />\n      </ActionList.LeadingVisual>\n      <strong>225</strong> forks\n    </ActionList.LinkItem>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--custom-item-children",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <ArrowRightIcon />\n      </ActionList.LeadingVisual>\n      <Label>Choose this one</Label>\n      <ActionList.TrailingVisual>\n        <ArrowLeftIcon />\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--text-wrap-and-truncation",
          "code": "() => (\n  <div className={classes.BoxWithMaxWidth}>\n    <ActionList showDividers>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        Block Description. Long text should wrap\n        <ActionList.Description variant=\"block\">\n          This description is long, but it is block so it wraps\n        </ActionList.Description>\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        Inline Description\n        <ActionList.Description truncate>\n          This description gets truncated because it is inline with truncation\n        </ActionList.Description>\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        Description with truncation and complex children\n        <ActionList.Description truncate>\n          With <strong>bold</strong> and <em>italic</em> text, and it should\n          truncate if it is too long\n        </ActionList.Description>\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        Inline Description\n        <ActionList.Description>\n          This description wraps because it is inline without truncation\n        </ActionList.Description>\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        Really long text without a description should wrap so it wraps\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        SomethingSomething/SomethingElse.Some.Thing.Lalala.la\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n    </ActionList>\n  </div>\n)"
        },
        {
          "id": "components-actionlist-features--conditional-children",
          "code": "() => {\n  type reviewerType = {\n    name: string\n    id?: string\n    type?: string\n    login?: string\n    slug?: string\n    members?: number\n  }\n  const potentialReviewers: reviewerType[] = [...teams, ...users]\n  return (\n    <ActionList showDividers>\n      {potentialReviewers.map((reviewer, index) => (\n        <ActionList.Item key={index}>\n          <ActionList.LeadingVisual>\n            {reviewer.type === 'team' ? (\n              <Avatar\n                src={`https://avatars.githubusercontent.com/t/${reviewer.id}`}\n              />\n            ) : (\n              <Avatar\n                src={`https://avatars.githubusercontent.com/${reviewer.login}`}\n              />\n            )}\n          </ActionList.LeadingVisual>\n          {reviewer.login || reviewer.slug}\n          {reviewer.type === 'team' ? (\n            <ActionList.Description variant=\"block\">\n              {reviewer.name}\n            </ActionList.Description>\n          ) : (\n            <ActionList.Description>{reviewer.name}</ActionList.Description>\n          )}\n          {reviewer.type === 'team' && (\n            <ActionList.TrailingVisual>\n              <PeopleIcon />\n              {reviewer.members}\n            </ActionList.TrailingVisual>\n          )}\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--child-with-side-effects",
          "code": "() => {\n  const user = users[0]\n  const [selected, setSelected] = React.useState(true)\n  return (\n    <ActionList\n      selectionVariant=\"multiple\"\n      role=\"listbox\"\n      aria-label=\"Assignees\"\n    >\n      <ActionList.Item\n        selected={selected}\n        onSelect={() => setSelected(!selected)}\n        role=\"option\"\n      >\n        <ActionList.LeadingVisual>\n          <Avatar src={`https://avatars.githubusercontent.com/${user.login}`} />\n        </ActionList.LeadingVisual>\n        {user.login}\n        <ActionList.Description>\n          <SideEffectDescription />\n        </ActionList.Description>\n      </ActionList.Item>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--inside-overlay",
          "code": "() => {\n  const [open, setOpen] = React.useState(false)\n  const toggle = () => setOpen(!open)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={toggle}\n      onClose={toggle}\n      renderAnchor={(props) => (\n        <button type=\"button\" {...props}>\n          toggle overlay\n        </button>\n      )}\n    >\n      <ActionList role=\"menu\">\n        <ActionList.Item role=\"menuitem\">\n          Use your arrow keys\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item role=\"menuitem\">\n          keep going\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item role=\"menuitem\">\n          more more\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Item variant=\"danger\" role=\"menuitem\">\n          now go up!\n          <ActionList.TrailingVisual>↑</ActionList.TrailingVisual>\n        </ActionList.Item>\n      </ActionList>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--group-with-subtle-title",
          "code": "() => {\n  const [assignees, setAssignees] = React.useState(users.slice(0, 1))\n  const toggleAssignee = (assignee: (typeof users)[number]) => {\n    const assigneeIndex = assignees.findIndex((a) => a.login === assignee.login)\n    if (assigneeIndex === -1) setAssignees([...assignees, assignee])\n    else setAssignees(assignees.filter((_, index) => index !== assigneeIndex))\n  }\n  return (\n    <ActionList\n      selectionVariant=\"multiple\"\n      role=\"menu\"\n      showDividers\n      aria-label=\"Reviewers\"\n    >\n      <ActionList.Group>\n        <ActionList.GroupHeading>Everyone</ActionList.GroupHeading>\n        {users.slice(2).map((user) => (\n          <ActionList.Item\n            role=\"menuitemcheckbox\"\n            key={user.login}\n            selected={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            aria-checked={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            onSelect={() => toggleAssignee(user)}\n          >\n            <ActionList.LeadingVisual>\n              <Avatar src={`https://github.com/${user.login}.png`} />\n            </ActionList.LeadingVisual>\n            {user.login}\n            <ActionList.Description>{user.name}</ActionList.Description>\n          </ActionList.Item>\n        ))}\n      </ActionList.Group>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--group-with-filled-title",
          "code": "() => {\n  const [assignees, setAssignees] = React.useState(users.slice(0, 1))\n  const toggleAssignee = (assignee: (typeof users)[number]) => {\n    const assigneeIndex = assignees.findIndex((a) => a.login === assignee.login)\n    if (assigneeIndex === -1) setAssignees([...assignees, assignee])\n    else setAssignees(assignees.filter((_, index) => index !== assigneeIndex))\n  }\n  return (\n    <ActionList\n      selectionVariant=\"multiple\"\n      role=\"menu\"\n      showDividers\n      aria-label=\"Reviewers\"\n    >\n      <ActionList.Group>\n        <ActionList.GroupHeading variant=\"filled\">\n          Everyone\n        </ActionList.GroupHeading>\n        {users.slice(2).map((user) => (\n          <ActionList.Item\n            role=\"menuitemcheckbox\"\n            key={user.login}\n            selected={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            aria-checked={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            onSelect={() => toggleAssignee(user)}\n          >\n            <ActionList.LeadingVisual>\n              <Avatar src={`https://github.com/${user.login}.png`} />\n            </ActionList.LeadingVisual>\n            {user.login}\n            <ActionList.Description>{user.name}</ActionList.Description>\n          </ActionList.Item>\n        ))}\n      </ActionList.Group>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--with-custom-trailing-visuals",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <IssueOpenedIcon />\n      </ActionList.LeadingVisual>\n      Issues\n      <ActionList.TrailingVisual>\n        <CounterLabel>20</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <GitPullRequestIcon />\n      </ActionList.LeadingVisual>\n      PRs\n      <ActionList.TrailingVisual>\n        <CounterLabel>12</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <ProjectIcon />\n      </ActionList.LeadingVisual>\n      Projects\n      <ActionList.TrailingVisual>\n        <CounterLabel>2</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--with-keyboard-shortcuts",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>\n      New file\n      <ActionList.TrailingVisual>\n        <KeybindingHint keys=\"Mod+N\" />\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      Open file\n      <ActionList.TrailingVisual>\n        <KeybindingHint keys=\"Mod+O\" />\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      Save\n      <ActionList.TrailingVisual>\n        <KeybindingHint keys=\"Mod+S\" />\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Divider />\n    <ActionList.Item variant=\"danger\">\n      Delete\n      <ActionList.TrailingVisual>\n        <KeybindingHint keys=\"Mod+D\" />\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--with-trailing-count",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <IssueOpenedIcon />\n      </ActionList.LeadingVisual>\n      Open issues\n      <ActionList.TrailingVisual>\n        <CounterLabel>24</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <GitPullRequestIcon />\n      </ActionList.LeadingVisual>\n      Pull requests\n      <ActionList.TrailingVisual>\n        <CounterLabel>8</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <ProjectIcon />\n      </ActionList.LeadingVisual>\n      Projects\n      <ActionList.TrailingVisual>\n        <CounterLabel>3</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item variant=\"danger\">\n      <ActionList.LeadingVisual>\n        <AlertIcon />\n      </ActionList.LeadingVisual>\n      Alerts\n      <ActionList.TrailingVisual>\n        <CounterLabel>12</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--with-trailing-action",
          "code": "() => {\n  const [loadingState, setLoadingState] = React.useState(false)\n\n  // Auto-toggle every 2.5 seconds to continuously show transitions\n  React.useEffect(() => {\n    const interval = setInterval(() => {\n      setLoadingState((prev) => !prev)\n    }, 2500)\n    return () => clearInterval(interval)\n  }, [])\n  return (\n    <ActionList>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        Item 1 (with default TrailingAction)\n        <ActionList.TrailingAction\n          label=\"Expand sidebar\"\n          icon={ArrowLeftIcon}\n        />\n      </ActionList.Item>\n      <ActionList.Item>\n        Item 2 (with link TrailingAction)\n        <ActionList.TrailingAction\n          as=\"a\"\n          href=\"#\"\n          label=\"Some action 1\"\n          icon={ArrowRightIcon}\n        />\n      </ActionList.Item>\n      <ActionList.Item>\n        Item 3\n        <ActionList.Description>\n          This is an inline description.\n        </ActionList.Description>\n        <ActionList.TrailingAction label=\"Some action 2\" icon={BookIcon} />\n      </ActionList.Item>\n      <ActionList.Item>\n        Item 4\n        <ActionList.Description variant=\"block\">\n          This is a block description.\n        </ActionList.Description>\n        <ActionList.TrailingAction label=\"Some action 3\" icon={BookIcon} />\n      </ActionList.Item>\n      <ActionList.Item>\n        Item 5\n        <ActionList.Description variant=\"block\">\n          This is a block description.\n        </ActionList.Description>\n        <ActionList.TrailingAction label=\"Some action 4\" />\n      </ActionList.Item>\n      <ActionList.Item>\n        Item 6\n        <ActionList.TrailingAction href=\"#\" as=\"a\" label=\"Some action 5\" />\n      </ActionList.Item>\n      <ActionList.Item>\n        Icon button loading state\n        <ActionList.Description>\n          Shows how IconButton maintains width and centers spinner when loading\n        </ActionList.Description>\n        <ActionList.TrailingAction\n          label=\"Process item\"\n          icon={ArrowRightIcon}\n          loading\n        />\n      </ActionList.Item>\n      <ActionList.Item>\n        Icon button with transitions\n        <ActionList.Description>\n          Automatically toggles loading state every 2.5 seconds to show\n          transitions\n        </ActionList.Description>\n        <ActionList.TrailingAction\n          label=\"Toggle loading\"\n          icon={ArrowRightIcon}\n          loading={loadingState}\n        />\n      </ActionList.Item>\n      <ActionList.Item>\n        Text button loading state\n        <ActionList.Description>\n          Shows how text button aligns spinner to the right and preserves width\n        </ActionList.Description>\n        <ActionList.TrailingAction label=\"Save changes\" loading />\n      </ActionList.Item>\n      <ActionList.Item>\n        Text button with transitions\n        <ActionList.Description>\n          Automatically toggles loading state every 2.5 seconds to show\n          transitions\n        </ActionList.Description>\n        <ActionList.TrailingAction\n          label=\"Apply settings\"\n          loading={loadingState}\n        />\n      </ActionList.Item>\n      <ActionList.LinkItem href=\"#\">\n        LinkItem 1\n        <ActionList.Description>\n          with TrailingAction this is a long description and should not cause\n          horizontal scroll on smaller screen sizes\n        </ActionList.Description>\n        <ActionList.TrailingAction label=\"Another action\" />\n      </ActionList.LinkItem>\n      <ActionList.LinkItem href=\"#\">\n        LinkItem 2\n        <ActionList.Description>\n          with TrailingVisual this is a long description and should not cause\n          horizontal scroll on smaller screen sizes\n        </ActionList.Description>\n        <ActionList.TrailingVisual>\n          <TableIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.LinkItem>\n      <ActionList.Item inactiveText=\"Unavailable due to an outage\">\n        Inactive Item\n        <ActionList.Description>With TrailingAction</ActionList.Description>\n        <ActionList.TrailingAction\n          as=\"a\"\n          href=\"#\"\n          label=\"Some action 8\"\n          icon={ArrowRightIcon}\n        />\n      </ActionList.Item>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--with-trailing-action-on-group-heading",
          "code": "() => (\n  <FeatureFlags\n    flags={{\n      primer_react_action_list_group_heading_trailing_action: true,\n    }}\n  >\n    <ActionList>\n      <ActionList.Group>\n        <ActionList.GroupHeading as=\"h3\">\n          Custom fields\n          <ActionList.GroupHeading.TrailingAction\n            label=\"New field\"\n            icon={PlusIcon}\n          />\n        </ActionList.GroupHeading>\n        <ActionList.Item>\n          <ActionList.LeadingVisual>\n            <FileDirectoryIcon />\n          </ActionList.LeadingVisual>\n          Field 1\n        </ActionList.Item>\n        <ActionList.Item>\n          <ActionList.LeadingVisual>\n            <FileDirectoryIcon />\n          </ActionList.LeadingVisual>\n          Field 2\n        </ActionList.Item>\n      </ActionList.Group>\n      <ActionList.Group>\n        <ActionList.GroupHeading as=\"h3\" variant=\"filled\">\n          Repositories\n          <ActionList.GroupHeading.TrailingAction\n            as=\"a\"\n            href=\"#\"\n            label=\"Manage repositories\"\n            icon={ProjectIcon}\n          />\n        </ActionList.GroupHeading>\n        <ActionList.Item>primer/react</ActionList.Item>\n        <ActionList.Item>primer/primitives</ActionList.Item>\n      </ActionList.Group>\n    </ActionList>\n  </FeatureFlags>\n)"
        },
        {
          "id": "components-actionlist-features--full-variant",
          "code": "() => (\n  <ActionList variant=\"full\">\n    <ActionList.Item>Copy link</ActionList.Item>\n    <ActionList.Item>Quote reply</ActionList.Item>\n    <ActionList.Item>Edit comment</ActionList.Item>\n    <ActionList.Divider />\n    <ActionList.Item variant=\"danger\">Delete file</ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--large-item",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item size=\"large\">Large item</ActionList.Item>\n    <ActionList.Item size=\"large\">\n      Large item\n      <ActionList.Description>With inline description</ActionList.Description>\n    </ActionList.Item>\n    <ActionList.Item size=\"large\">\n      Large item\n      <ActionList.Description variant=\"block\">\n        With block description\n      </ActionList.Description>\n    </ActionList.Item>\n  </ActionList>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "ActionList.Item[] | ActionList.LinkItem[] | ActionList.Group[]",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "variant",
          "type": "'inset' | 'horizontal-inset' | 'full'",
          "defaultValue": "'inset'",
          "description": "`inset` children are offset (vertically and/or horizontally) from list edges. `full` children are flush (vertically and horizontally) with list edges"
        },
        {
          "name": "selectionVariant",
          "type": "'single' | 'multiple'",
          "defaultValue": "",
          "description": "Whether multiple items or a single item can be selected."
        },
        {
          "name": "showDividers",
          "type": "boolean",
          "description": "Display a divider above each `Item` in this `List` when it does not follow a `Header` or `Divider`.",
          "defaultValue": ""
        },
        {
          "name": "role",
          "type": "AriaRole",
          "defaultValue": "",
          "description": "ARIA role describing the function of the list. `listbox` and `menu` are a common values."
        }
      ],
      "subcomponents": [
        {
          "name": "ActionList.Item",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode | ActionList.LeadingVisual | ActionList.Description | ActionList.TrailingVisual",
              "defaultValue": "",
              "required": true,
              "description": "Primary content for an Item"
            },
            {
              "name": "variant",
              "type": "'default' | 'danger'",
              "defaultValue": "'default'",
              "description": "`danger` indicates that the item is destructive."
            },
            {
              "name": "size",
              "type": "'medium' | 'large'",
              "defaultValue": "'medium'",
              "description": "The block size of the ActionList items."
            },
            {
              "name": "onSelect",
              "type": "(event: React.MouseEvent<HTMLLIElement> | React.KeyboardEvent<HTMLLIElement>) => void",
              "defaultValue": "",
              "description": "Callback that is called when the item is selected using either the mouse or keyboard. `event.preventDefault()` will prevent a menu from closing when within an `<ActionMenu />`. This is not called for disabled or inactive items."
            },
            {
              "name": "selected",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Indicate whether the item is selected. Only applies to items that can be selected."
            },
            {
              "name": "active",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Indicate whether the item is active. There should never be more than one active item."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Items that are disabled can not be clicked, selected, or navigated to."
            },
            {
              "name": "inactiveText",
              "type": "string",
              "defaultValue": "",
              "description": "Text describing why the item is inactive. This may be used when an item's usual functionality is unavailable due to a system error such as a database outage.\nIf there is a leading visual, the alert icon will replace the leading visual.\nIf there is a trailing visual, it will replace the trailing visual.\nIf there is no visual passed, it will be shown in the trailing visual slot to preserve left alignment of item content.\nText will appear in a tooltip triggered by the alert icon in ActionList items, but text will appear below the description or title on ActionMenu items."
            },
            {
              "name": "loading",
              "type": "boolean",
              "description": "Whether the item is loading."
            },
            {
              "name": "role",
              "type": "AriaRole",
              "defaultValue": "",
              "description": "ARIA role describing the function of the item. `option` is a common value."
            },
            {
              "name": "id",
              "type": "string",
              "required": false,
              "description": "id to attach to the root element of the Item",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "ActionList.Heading",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Use to give a heading to list"
            },
            {
              "name": "as",
              "type": "h1 | h2 | h3 | h4 | h5 | h6",
              "defaultValue": "h3",
              "required": false,
              "description": "The level of the heading"
            },
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "required": false,
              "description": "",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "ActionList.LinkItem",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode | ActionList.LeadingVisual | ActionList.Description | ActionList.TrailingVisual",
              "defaultValue": "",
              "required": true,
              "description": ""
            },
            {
              "name": "active",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Indicate whether the item is active. There should never be more than one active item."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLAnchorElement>"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            },
            {
              "name": "inactiveText",
              "type": "string",
              "required": false,
              "description": "Text describing why the item is inactive. This may be used when an item's usual functionality\nis unavailable due to a system error such as a database outage.",
              "defaultValue": ""
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes"
          }
        },
        {
          "name": "ActionList.LeadingVisual",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Icon (or similar) positioned before item text."
            }
          ]
        },
        {
          "name": "ActionList.TrailingVisual",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Visual positioned after item text."
            }
          ]
        },
        {
          "name": "ActionList.TrailingAction",
          "props": [
            {
              "name": "as",
              "type": "a | button",
              "defaultValue": "button",
              "required": false,
              "description": "HTML element to render as."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Accessible name for the control."
            },
            {
              "name": "icon",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Octicon to pass into IconButton. When this is not set, TrailingAction renders as a `Button` instead of an `IconButton`."
            },
            {
              "name": "href",
              "type": "string",
              "description": "href when the TrailingAction is rendered as a link."
            },
            {
              "name": "loading",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the TrailingAction is in a loading state. When true, the TrailingAction will render a spinner instead of an icon. Only available when `as` is 'button'."
            }
          ]
        },
        {
          "name": "ActionList.Description",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": ""
            },
            {
              "name": "variant",
              "type": "'inline' | 'block'",
              "defaultValue": "'inline'",
              "description": "`inline` descriptions are positioned beside primary text. `block` descriptions are positioned below primary text."
            },
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the inline description should truncate the text on overflow."
            }
          ]
        },
        {
          "name": "ActionList.GroupHeading",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Use to give a heading to the groups"
            },
            {
              "name": "variant",
              "type": "'filled' | 'subtle'",
              "defaultValue": "'subtle'",
              "description": "`filled` style has a background color and top and bottom borders. Subtle style has no background or borders."
            },
            {
              "name": "auxiliaryText",
              "type": "string",
              "required": false,
              "description": "Secondary text which provides additional information about a `Group`.",
              "defaultValue": ""
            },
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "required": false,
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "as",
              "type": "h1 | h2 | h3 | h4 | h5 | h6",
              "defaultValue": "h3",
              "required": false,
              "description": "The level of the heading and it is only required (enforce by runtime warning) for lists. (i.e. not required for ActionMenu or listbox roles)"
            }
          ]
        },
        {
          "name": "ActionList.Group",
          "props": [
            {
              "name": "children",
              "type": "ActionList.Item[] | ActionList.LinkItem[]",
              "defaultValue": "",
              "required": true,
              "description": ""
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "",
              "description": "Please use `ActionList.GroupHeading` instead.",
              "deprecated": true
            },
            {
              "name": "auxiliaryText",
              "type": "string",
              "defaultValue": "",
              "description": "Secondary text that provides additional information about the group."
            },
            {
              "name": "variant",
              "type": "'filled' | 'subtle'",
              "defaultValue": "'subtle'",
              "description": "`inline` descriptions are positioned beside primary text. `block` descriptions are positioned below primary text."
            },
            {
              "name": "selectionVariant",
              "type": "'single' | 'multiple' | false",
              "defaultValue": "",
              "description": "Set `selectionVariant` at the group level."
            },
            {
              "name": "role",
              "type": "AriaRole",
              "defaultValue": "",
              "description": "ARIA role describing the function of the list inside the group. `listbox` and `menu` are a common values."
            }
          ]
        }
      ]
    },
    "action_menu": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ActionMenu",
      "id": "action_menu",
      "name": "ActionMenu",
      "status": "beta",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-actionmenu--default",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Button>Open menu</ActionMenu.Button>\n    <ActionMenu.Overlay width=\"medium\">\n      <ActionList>\n        <ActionList.Item onSelect={() => alert('Copy link clicked')}>\n          Copy link\n          <ActionList.TrailingVisual>⌘C</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Quote reply clicked')}>\n          Quote reply\n          <ActionList.TrailingVisual>⌘Q</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Edit comment clicked')}>\n          Edit comment\n          <ActionList.TrailingVisual>⌘E</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Item\n          variant=\"danger\"\n          onSelect={() => alert('Delete file clicked')}\n        >\n          Delete file\n          <ActionList.TrailingVisual>⌘D</ActionList.TrailingVisual>\n        </ActionList.Item>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        },
        {
          "id": "components-actionmenu-features--links-and-actions",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Button>Open menu</ActionMenu.Button>\n    <ActionMenu.Overlay width=\"auto\">\n      <ActionList>\n        <ActionList.Item onSelect={() => alert('Workflows clicked')}>\n          Workflows\n          <ActionList.LeadingVisual>\n            <WorkflowIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Archived items clicked')}>\n          Archived items\n          <ActionList.LeadingVisual>\n            <ArchiveIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.LinkItem href=\"/\">\n          Settings\n          <ActionList.LeadingVisual>\n            <GearIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.LinkItem>\n        <ActionList.Item onSelect={() => alert('Make a copy clicked')}>\n          Make a copy\n          <ActionList.LeadingVisual>\n            <CopyIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Group>\n          <ActionList.GroupHeading>GitHub projects</ActionList.GroupHeading>\n          <ActionList.LinkItem href=\"/\">\n            What&apos;s new\n            <ActionList.LeadingVisual>\n              <RocketIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            Give feedback\n            <ActionList.LeadingVisual>\n              <CommentIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            GitHub Docs\n            <ActionList.LeadingVisual>\n              <BookIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n        </ActionList.Group>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        },
        {
          "id": "components-actionmenu-features--single-select",
          "code": "() => {\n  const options = [\n    {\n      name: 'Fast forward',\n    },\n    {\n      name: 'Recursive',\n    },\n    {\n      name: 'Ours',\n    },\n    {\n      name: 'Octopus',\n    },\n    {\n      name: 'Resolve',\n    },\n    {\n      name: 'Subtree',\n    },\n  ]\n  const [selectedIndex, setSelectedIndex] = React.useState(0)\n  const selectedType = options[selectedIndex]\n  return (\n    <ActionMenu>\n      <ActionMenu.Button>\n        <span className={classes.MutedText}>Options:</span> {selectedType.name}\n      </ActionMenu.Button>\n      <ActionMenu.Overlay width=\"auto\">\n        <ActionList selectionVariant=\"single\">\n          {options.map((options, index) => (\n            <ActionList.Item\n              key={index}\n              selected={index === selectedIndex}\n              onSelect={() => setSelectedIndex(index)}\n            >\n              {options.name}\n            </ActionList.Item>\n          ))}\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n  )\n}"
        },
        {
          "id": "components-actionmenu-features--multi-select",
          "code": "() => {\n  type Option = {\n    name: string\n    selected: boolean\n  }\n  const [options, setOptions] = React.useState<Option[]>([\n    {\n      name: 'Show code folding buttons',\n      selected: true,\n    },\n    {\n      name: 'Wrap lines',\n      selected: false,\n    },\n    {\n      name: 'Center content',\n      selected: false,\n    },\n  ])\n  const toggle = (name: string) => {\n    setOptions(\n      options.map((option) => {\n        if (option.name === name) option.selected = !option.selected\n        return option\n      }),\n    )\n  }\n  return (\n    <ActionMenu>\n      <ActionMenu.Button>Display</ActionMenu.Button>\n      <ActionMenu.Overlay width=\"auto\">\n        <ActionList selectionVariant=\"multiple\">\n          {options.map((options) => (\n            <ActionList.Item\n              key={options.name}\n              selected={options.selected}\n              onSelect={() => toggle(options.name)}\n            >\n              {options.name}\n            </ActionList.Item>\n          ))}\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n  )\n}"
        },
        {
          "id": "components-actionmenu-features--inactive-items",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Button>Open menu</ActionMenu.Button>\n    <ActionMenu.Overlay width=\"auto\">\n      <ActionList>\n        <ActionList.Item\n          onSelect={() => alert('Workflows clicked')}\n          inactiveText=\"Unavailable due to an outage\"\n        >\n          Workflows\n          <ActionList.LeadingVisual>\n            <WorkflowIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Item\n          onSelect={() => alert('Archived items clicked')}\n          inactiveText=\"Unavailable due to an outage\"\n        >\n          Archived items\n          <ActionList.LeadingVisual>\n            <ArchiveIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.LinkItem\n          href=\"/\"\n          inactiveText=\"Unavailable due to an outage\"\n        >\n          Settings\n          <ActionList.LeadingVisual>\n            <GearIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.LinkItem>\n        <ActionList.Item\n          onSelect={() => alert('Make a copy clicked')}\n          inactiveText=\"Unavailable due to an outage\"\n        >\n          Make a copy\n          <ActionList.LeadingVisual>\n            <CopyIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Group>\n          <ActionList.GroupHeading>Github projects</ActionList.GroupHeading>\n          <ActionList.LinkItem href=\"/\">\n            What&apos;s new\n            <ActionList.LeadingVisual>\n              <RocketIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            Give feedback\n            <ActionList.LeadingVisual>\n              <CommentIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            GitHub Docs\n            <ActionList.LeadingVisual>\n              <BookIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n        </ActionList.Group>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        },
        {
          "id": "components-actionmenu-features--loading-items",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Button>Open menu</ActionMenu.Button>\n    <ActionMenu.Overlay width=\"auto\">\n      <ActionList>\n        <ActionList.Item onSelect={() => alert('Workflows clicked')} loading>\n          Workflows\n          <ActionList.LeadingVisual>\n            <WorkflowIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Item\n          onSelect={() => alert('Archived items clicked')}\n          loading\n        >\n          Archived items\n          <ActionList.LeadingVisual>\n            <ArchiveIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Make a copy clicked')} loading>\n          Make a copy\n          <ActionList.LeadingVisual>\n            <CopyIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Group>\n          <ActionList.GroupHeading>Github projects</ActionList.GroupHeading>\n          <ActionList.LinkItem href=\"/\">\n            What&apos;s new\n            <ActionList.LeadingVisual>\n              <RocketIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            Give feedback\n            <ActionList.LeadingVisual>\n              <CommentIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            GitHub Docs\n            <ActionList.LeadingVisual>\n              <BookIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n        </ActionList.Group>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        },
        {
          "id": "components-actionmenu-features--submenus",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Button>Edit</ActionMenu.Button>\n    <ActionMenu.Overlay>\n      <ActionList>\n        <ActionList.Item>Cut</ActionList.Item>\n        <ActionList.Item>Copy</ActionList.Item>\n        <ActionList.Item>Paste</ActionList.Item>\n        <ActionMenu>\n          <ActionMenu.Anchor>\n            <ActionList.Item>\n              <ActionList.LeadingVisual>\n                <SparkleFillIcon />\n              </ActionList.LeadingVisual>\n              Paste special\n            </ActionList.Item>\n          </ActionMenu.Anchor>\n          <ActionMenu.Overlay>\n            <ActionList>\n              <ActionList.Item>Paste plain text</ActionList.Item>\n              <ActionList.Item>Paste formulas</ActionList.Item>\n              <ActionList.Item>Paste with formatting</ActionList.Item>\n              <ActionMenu>\n                <ActionMenu.Anchor>\n                  <ActionList.Item>Paste from</ActionList.Item>\n                </ActionMenu.Anchor>\n                <ActionMenu.Overlay>\n                  <ActionList>\n                    <ActionList.Item>Current clipboard</ActionList.Item>\n                    <ActionList.Item>History</ActionList.Item>\n                    <ActionList.Item>Another device</ActionList.Item>\n                  </ActionList>\n                </ActionMenu.Overlay>\n              </ActionMenu>\n            </ActionList>\n          </ActionMenu.Overlay>\n        </ActionMenu>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "React.ReactElement[]",
          "defaultValue": "",
          "required": true,
          "description": "Recommended: `ActionMenu.Button` or `ActionMenu.Anchor` with `ActionMenu.Overlay`"
        },
        {
          "name": "open",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If defined, will control the open/closed state of the overlay. Must be used in conjuction with `onOpenChange`."
        },
        {
          "name": "onOpenChange",
          "type": "(open: boolean) => void",
          "defaultValue": "",
          "description": "If defined, will control the open/closed state of the overlay. Must be used in conjuction with `open`."
        },
        {
          "name": "anchorRef",
          "type": "React.RefObject<HTMLElement>",
          "defaultValue": "",
          "description": "Useful for defining an external anchor"
        }
      ],
      "subcomponents": [
        {
          "name": "ActionMenu.Button",
          "props": [
            {
              "name": "children",
              "type": "React.ReactElement",
              "defaultValue": "",
              "required": true,
              "description": ""
            }
          ],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        },
        {
          "name": "ActionMenu.Anchor",
          "props": [
            {
              "name": "children",
              "type": "React.ReactElement",
              "defaultValue": "",
              "required": true,
              "description": "Accepts a single child element"
            },
            {
              "name": "id",
              "type": "string",
              "description": "",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "ActionMenu.Overlay",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": ""
            },
            {
              "name": "align",
              "type": "start | center | end",
              "defaultValue": "start",
              "description": ""
            },
            {
              "name": "side",
              "type": "| 'inside-top' | 'inside-bottom' | 'inside-left' | 'inside-right' | 'inside-center' | 'outside-top' | 'outside-bottom' | 'outside-left' | 'outside-right'",
              "defaultValue": "'outside-bottom'",
              "description": "Controls which side of the anchor the menu will appear"
            },
            {
              "name": "onPositionChange",
              "type": "({ position }: { position: AnchorPosition }) => void",
              "defaultValue": "",
              "description": "Callback that is called when the position of the overlay changes"
            },
            {
              "name": "data-test-id",
              "type": "unknown",
              "required": false,
              "description": "ID to use for React testing utilities.",
              "defaultValue": ""
            }
          ],
          "passthrough": {
            "element": "Overlay",
            "url": "/react/Overlay"
          }
        }
      ]
    },
    "anchored_overlay": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/AnchoredOverlay",
      "id": "anchored_overlay",
      "name": "AnchoredOverlay",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-anchoredoverlay--default",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        style: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      {hoverCard}\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--portal-inside-scrolling-element",
          "code": "(args: Args) => {\n  const rows = 20\n  const columns = 10\n  return (\n    <HeaderAndLayout>\n      <table>\n        <tbody>\n          {Array(rows)\n            .fill(null)\n            .map((_, i) => (\n              <tr key={i}>\n                {Array(columns)\n                  .fill(null)\n                  .map((_1, j) => (\n                    <td key={`${i}${j}`}>\n                      <div className={classes.PlaygroundCell}>\n                        <Playground\n                          {...{\n                            ...args,\n                            portalContainerName: 'scrollingPortal',\n                          }}\n                        />\n                      </div>\n                    </td>\n                  ))}\n              </tr>\n            ))}\n        </tbody>\n      </table>\n    </HeaderAndLayout>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--custom-anchor-id",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      anchorId=\"my-custom-anchor-id\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--height",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      height=\"large\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--width",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      width=\"large\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--anchor-alignment",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => (\n        <Button {...props} block>\n          Button\n        </Button>\n      )}\n      align=\"center\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--anchor-side",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      side=\"outside-right\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--offset-position-from-anchor",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      anchorOffset={100}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--offset-alignment-from-anchor",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      alignmentOffset={100}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--focus-trap-overrides",
          "code": "() => {\n  const initialFocusRef = useRef<HTMLButtonElement>(null)\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      focusTrapSettings={{\n        initialFocusRef,\n      }}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'Focus Trap Demo Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Button>First button</Button>\n      <Button ref={initialFocusRef}>Initial focus</Button>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--focus-zone-overrides",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      focusZoneSettings={{\n        bindKeys: FocusKeys.JK,\n      }}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'Focus Zone Demo Overlay',\n        className: classes.Overlay,\n      }}\n      preventOverflow={false}\n    >\n      <p>\n        Use <kbd>J</kbd> and <kbd>K</kbd> keys to move focus.\n      </p>\n      <Button>First</Button>\n      <Button>Second</Button>\n      <Button>Third</Button>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--overlay-props-overrides",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      overlayProps={{\n        overflow: 'auto',\n        maxHeight: 'xsmall',\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        className: classes.Overlay,\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div>Overlay props have been overridden to set: </div>\n      <pre>\n        <li>overflow: `auto`</li>\n        <li>maxHeight: `xsmall`</li>\n      </pre>\n      <div className={classes.FlexColFill}>{hoverCard}</div>\n    </AnchoredOverlay>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "open",
          "type": "boolean",
          "required": true,
          "defaultValue": "false",
          "description": "Determines whether the overlay portion of the component should be shown or not."
        },
        {
          "name": "onOpen",
          "type": "(gesture: 'anchor-click' | 'anchor-key-press', event?: KeyboardEvent<HTMLElement> | undefined) => unknown",
          "defaultValue": "",
          "description": "A callback that is called whenever the overlay is currently closed and an \"open gesture\" is detected."
        },
        {
          "name": "onClose",
          "type": "(gesture: 'anchor-click' | 'click-outside' | 'escape') => unknown",
          "defaultValue": "",
          "description": "A callback that is called whenever the overlay is currently open and a \"close gesture\" is detected."
        },
        {
          "name": "renderAnchor",
          "type": "<T extends React.HTMLAttributes<HTMLElement>>(props: T) => JSX.Element",
          "defaultValue": "",
          "description": "A custom function component used to render the anchor element. When renderAnchor is null, an anchorRef is required."
        },
        {
          "name": "anchorRef",
          "type": "React.RefObject<HTMLElement>",
          "defaultValue": "",
          "description": "An override to the internal `renderAnchor` ref that will be used to position the overlay. When `renderAnchor` is `null`, this can be used to make an anchor that is detached from ` AnchoredOverlay `."
        },
        {
          "name": "anchorId",
          "type": "string",
          "defaultValue": "",
          "description": "An override to the internal id that will be passed to the anchor."
        },
        {
          "name": "side",
          "type": "| 'inside-top' | 'inside-bottom' | 'inside-left' | 'inside-right' | 'inside-center' | 'outside-top' | 'outside-bottom' | 'outside-left' | 'outside-right'",
          "defaultValue": "'outside-bottom'",
          "description": ""
        },
        {
          "name": "align",
          "type": "'start' | 'center' | 'end'",
          "defaultValue": "'start'",
          "description": ""
        },
        {
          "name": "alignmentOffset",
          "type": "number",
          "defaultValue": "4",
          "description": "An additional offset, in pixels, to move the floating element from the aligning edge. Positive values move the floating element in the direction of center-alignment. Negative values move the floating element away from center-alignment. When align is `'center`, positive offsets move the floating element right (top or bottom anchor side) or down (left or right anchor side). If using outside positioning, or if `align` is set to `'center'`, this defaults to `0` instead of `4`."
        },
        {
          "name": "anchorOffset",
          "type": "number",
          "defaultValue": "4",
          "description": "The number of pixels between the anchor edge and the floating element. Positive values move the floating element farther from the anchor element (for outside positioning) or further inside the anchor element (for inside positioning). Negative values have the opposite effect. If `side` is set to `'inside-center'`, this defaults to `0` instead of `4`."
        },
        {
          "name": "overlayProps",
          "type": "Partial<OverlayProps>",
          "defaultValue": "",
          "description": "Props to be spread on the internal `Overlay` component."
        },
        {
          "name": "focusTrapSettings",
          "type": "Partial<FocusTrapHookSettings>",
          "defaultValue": "",
          "description": "Settings to apply to the focus trap on the internal `Overlay` component."
        },
        {
          "name": "focusZoneSettings",
          "type": "Partial<FocusZoneHookSettings>",
          "defaultValue": "",
          "description": "Settings to apply to the focus zone on the internal `Overlay` component."
        },
        {
          "name": "className",
          "type": "string",
          "defaultValue": "",
          "description": "Class name for custom styling."
        },
        {
          "name": "preventOverflow",
          "type": "boolean",
          "defaultValue": "true",
          "description": "Determines if the Overlay width should be adjusted responsively if there is not enough space to display the Overlay. If `preventOverflow` is set to `false`, the Overlay will be displayed at the maximum width that fits within the viewport."
        },
        {
          "name": "height",
          "type": "'small' | 'initial' | 'large' | 'medium' | 'auto' | 'fit-content' | 'xsmall' | 'xlarge'",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "width",
          "type": "'small' | 'large' | 'medium' | 'auto' | 'xlarge' | 'xxlarge'",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "pinPosition",
          "type": "boolean",
          "required": false,
          "description": "If true, the overlay will attempt to prevent position shifting when sitting at the top of the anchor.",
          "defaultValue": "false"
        },
        {
          "name": "variant",
          "type": "{ regular?: 'anchored', narrow?: 'anchored' | 'fullscreen' }",
          "required": false,
          "description": "Optional prop to set variant for narrow screen sizes",
          "defaultValue": "{ regular: 'anchored', narrow: 'anchored' }"
        },
        {
          "name": "displayCloseButton",
          "type": "boolean",
          "required": false,
          "description": "If true, a close button will be displayed in the top right corner of the overlay when on fullscreen mode.",
          "defaultValue": "true"
        },
        {
          "name": "closeButtonProps",
          "type": "Partial<ButtonProps>",
          "required": false,
          "description": "Props to be spread on the close button in fullscreen mode.",
          "defaultValue": "{}"
        }
      ]
    },
    "autocomplete": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Autocomplete",
      "id": "autocomplete",
      "name": "Autocomplete",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-autocomplete--default",
          "code": "() => {\n  return (\n    <form\n      className={classes.DefaultForm}\n      onSubmit={(event) => event.preventDefault()}\n    >\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel-default\">\n          Label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              selectedItemIds={[]}\n              aria-labelledby=\"autocompleteLabel-default\"\n              items={items}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--with-token-input",
          "code": "() => {\n  const [tokens, setTokens] = useState<Datum[]>([])\n  const selectedTokenIds = tokens.map((token) => token.id)\n  const [selectedItemIds, setSelectedItemIds] =\n    useState<Array<string>>(selectedTokenIds)\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n    setSelectedItemIds(selectedItemIds.filter((id) => id !== tokenId))\n  }\n  const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n    if (!Array.isArray(newlySelectedItems)) {\n      return\n    }\n    setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n    if (newlySelectedItems.length < selectedItemIds.length) {\n      const newlySelectedItemIds = newlySelectedItems.map(({ id }) => id)\n      const removedItemIds = selectedTokenIds.filter(\n        (id) => !newlySelectedItemIds.includes(id),\n      )\n      for (const removedItemId of removedItemIds) {\n        onTokenRemove(removedItemId)\n      }\n      return\n    }\n    setTokens(\n      newlySelectedItems.map(({ id, text }) => ({\n        id,\n        text,\n      })),\n    )\n  }\n  return (\n    <form className={classes.FormPadding}>\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input\n            as={TextInputTokens}\n            tokens={tokens}\n            onTokenRemove={onTokenRemove}\n            block\n          />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={selectedItemIds}\n              onSelectedChange={onSelectedChange}\n              selectionVariant=\"multiple\"\n              aria-labelledby=\"autocompleteLabel\"\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--add-new-item",
          "code": "() => {\n  const [inputValue, setInputValue] = React.useState<string>('')\n  return (\n    <form className={classes.FormPadding}>\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel-add-new\">\n          Label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input\n            value={inputValue}\n            onChange={(e) => {\n              setInputValue(e.currentTarget.value)\n            }}\n          />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              selectedItemIds={[]}\n              aria-labelledby=\"autocompleteLabel-add-new\"\n              addNewItem={\n                inputValue &&\n                !items.map((item) => item.text).includes(inputValue)\n                  ? {\n                      text: inputValue,\n                      id: inputValue,\n                      handleAddItem: (selectedItem) => {\n                        // eslint-disable-next-line no-console\n                        console.log('added item:', selectedItem)\n                        return\n                      },\n                    }\n                  : undefined\n              }\n              items={items}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-search-filter-fn",
          "code": "() => {\n  const [filterVal, setFilterVal] = useState<string>('')\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n    setFilterVal(e.currentTarget.value)\n  }\n  const customFilterFn = (item: Datum) => item.text.includes(filterVal)\n  return (\n    <form className={classes.FormPadding}>\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input onChange={handleChange} />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={[]}\n              filterFn={customFilterFn}\n              aria-labelledby=\"autocompleteLabel\"\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n        <FormControl.Caption>\n          Items in dropdown are filtered if their text has no part that matches\n          the input value\n        </FormControl.Caption>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-sort-after-menu-close",
          "code": "() => {\n  const [selectedItemIds, setSelectedItemIds] = useState<Array<string>>([])\n  const isItemSelected = (itemId: string) => selectedItemIds.includes(itemId)\n  const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n    if (!Array.isArray(newlySelectedItems)) {\n      return\n    }\n    setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n  }\n  const customSortFn = (itemIdA: string, itemIdB: string) =>\n    isItemSelected(itemIdA) === isItemSelected(itemIdB)\n      ? 0\n      : isItemSelected(itemIdA)\n        ? 1\n        : -1\n  return (\n    <form className={classes.FormPadding}>\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={selectedItemIds}\n              onSelectedChange={onSelectedChange}\n              sortOnCloseFn={customSortFn}\n              aria-labelledby=\"autocompleteLabel\"\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n        <FormControl.Caption>\n          When the dropdown closes, selected items are sorted to the end\n        </FormControl.Caption>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--with-callback-when-overlay-open-state-changes",
          "code": "() => {\n  const [isMenuOpen, setIsMenuOpen] = useState<boolean>(false)\n  const onOpenChange = (isOpen: boolean) => {\n    setIsMenuOpen(isOpen)\n  }\n  return (\n    <Stack as=\"form\" padding=\"normal\">\n      <div className={classes.InputWithStateLabel}>\n        <div>\n          <FormControl>\n            <FormControl.Label id=\"autocompleteLabel\">\n              Default label\n            </FormControl.Label>\n            <Autocomplete>\n              <Autocomplete.Input />\n              <Autocomplete.Overlay>\n                <Autocomplete.Menu\n                  items={items}\n                  selectedItemIds={[]}\n                  onOpenChange={onOpenChange}\n                  aria-labelledby=\"autocompleteLabel\"\n                />\n              </Autocomplete.Overlay>\n            </Autocomplete>\n          </FormControl>\n        </div>\n\n        <div className={classes.StateLabelInline}>\n          The menu is <strong>{isMenuOpen ? 'open' : 'closed'}</strong>\n        </div>\n      </div>\n    </Stack>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--async-loading-of-items",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\n  const [loadedItems, setLoadedItems] = useState<Datum[]>([])\n  const onOpenChange = (isOpen: boolean) => {\n    if (isOpen) {\n      setTimeout(() => {\n        setLoadedItems(items)\n      }, 1500)\n    }\n  }\n  return (\n    <form className={classes.FormPadding}>\n      <FormControl {...parentArgs}>\n        <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n        <Autocomplete>\n          <Autocomplete.Input\n            {...textInputArgs}\n            size={textInputArgs.inputSize}\n          />\n          <Autocomplete.Overlay {...overlayArgs}>\n            <Autocomplete.Menu\n              items={loadedItems}\n              selectedItemIds={[]}\n              onOpenChange={onOpenChange}\n              aria-labelledby=\"autocompleteLabel\"\n              {...menuArgs}\n              loading={loadedItems.length === 0}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n        {captionArgs.children && <FormControl.Caption {...captionArgs} />}\n        {validationArgs.children && validationArgs.variant && (\n          <FormControl.Validation\n            {...validationArgs}\n            variant={validationArgs.variant}\n          />\n        )}\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--rendering-the-menu-outside-an-overlay",
          "code": "() => {\n  return (\n    <form className={classes.FormPadding}>\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input />\n          <Autocomplete.Menu\n            items={items}\n            selectedItemIds={[]}\n            aria-labelledby=\"autocompleteLabel\"\n          />\n        </Autocomplete>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-overlay-menu-anchor",
          "code": "() => {\n  const menuAnchorRef = useRef<HTMLElement>(null)\n  return (\n    <form className={classes.FormPadding}>\n      <FormControl>\n        <FormControl.Label htmlFor=\"autocompleteInput\" id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <div\n          ref={menuAnchorRef as React.RefObject<HTMLDivElement>}\n          className={classes.AnchorContainer}\n        >\n          <Autocomplete>\n            <Autocomplete.Input\n              id=\"autocompleteInput\"\n              aria-describedby=\"autocompleteCaption autocompleteValidation\"\n              className={classes.AnchorInput}\n            />\n            <Autocomplete.Overlay menuAnchorRef={menuAnchorRef}>\n              <Autocomplete.Menu\n                items={items}\n                selectedItemIds={[]}\n                aria-labelledby=\"autocompleteLabel\"\n              />\n            </Autocomplete.Overlay>\n          </Autocomplete>\n        </div>\n        <FormControl.Caption>\n          The overlay menu position is anchored to the div with the black border\n          instead of to the text input\n        </FormControl.Caption>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--in-overlay-with-custom-scroll-container-ref",
          "code": "() => {\n  const scrollContainerRef = useRef<HTMLElement>(null)\n  const inputRef = useRef<HTMLInputElement>(null)\n  const triggerRef = useRef<HTMLButtonElement>(null)\n  const [isOpen, setIsOpen] = useState(false)\n  const [selectedItem, setSelectedItem] = useState<Datum>()\n  const handleOpen = () => {\n    setIsOpen(true)\n    inputRef.current && inputRef.current.focus()\n  }\n  const selectChange = (item: Datum[] | Datum) => {\n    setIsOpen(false)\n    if (Array.isArray(item) && item.length) setSelectedItem(item[0])\n    triggerRef.current?.focus()\n  }\n  return (\n    <form className={classes.FormPadding}>\n      <span id=\"selected-item-status\">\n        Selected item: {selectedItem ? selectedItem.text : 'none'}\n      </span>\n\n      <AnchoredOverlay\n        open={isOpen}\n        onOpen={handleOpen}\n        onClose={() => setIsOpen(false)}\n        width=\"large\"\n        focusTrapSettings={{\n          initialFocusRef: inputRef,\n        }}\n        side=\"inside-top\"\n        anchorRef={triggerRef}\n        renderAnchor={(props) => (\n          <Button {...props} aria-describedby=\"selected-item-status\">\n            open overlay\n          </Button>\n        )}\n        preventOverflow={false}\n      >\n        <Autocomplete>\n          <div className={classes.OverlayFlexCol}>\n            <div className={classes.OverlayInputBar}>\n              <Autocomplete.Input\n                ref={inputRef}\n                className={classes.OverlayInput}\n                block\n                aria-label=\"Search\"\n              />\n            </div>\n            <div\n              ref={scrollContainerRef as RefObject<HTMLDivElement>}\n              className={classes.OverlayScroll}\n            >\n              <Autocomplete.Menu\n                items={items}\n                selectedItemIds={[]}\n                customScrollContainerRef={scrollContainerRef}\n                aria-labelledby=\"autocompleteLabel\"\n                onSelectedChange={selectChange}\n              />\n            </div>\n          </div>\n        </Autocomplete>\n      </AnchoredOverlay>\n    </form>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--in-a-dialog",
          "code": "() => {\n  const outerContainerRef = useRef<HTMLDivElement>(null)\n  const [mounted, setMounted] = useState(false)\n  const [isDialogOpen, setIsDialogOpen] = useState(false)\n  useEffect(() => {\n    if (outerContainerRef.current instanceof HTMLElement) {\n      registerPortalRoot(outerContainerRef.current, 'outerContainer')\n      setMounted(true)\n    }\n  }, [isDialogOpen])\n  return (\n    <>\n      <Button onClick={() => setIsDialogOpen(true)}>Show dialog</Button>\n      <Dialog\n        aria-label=\"Dialog with autocomplete\"\n        id=\"dialog-with-autocomplete\"\n        isOpen={isDialogOpen}\n        onDismiss={() => setIsDialogOpen(false)}\n      >\n        <div ref={outerContainerRef}>\n          <form className={classes.FormPadding}>\n            {mounted ? (\n              <FormControl>\n                <FormControl.Label id=\"autocompleteLabel\">\n                  Default label\n                </FormControl.Label>\n                <Autocomplete>\n                  <Autocomplete.Input data-testid=\"autocompleteInput\" />\n                  <Autocomplete.Overlay portalContainerName=\"outerContainer\">\n                    <Autocomplete.Menu\n                      items={items}\n                      selectedItemIds={[]}\n                      aria-labelledby=\"autocompleteLabel\"\n                    />\n                  </Autocomplete.Overlay>\n                </Autocomplete>\n              </FormControl>\n            ) : null}\n          </form>\n        </div>\n      </Dialog>\n      <p>\n        The Autocomplete.Overlay is portalled to a div inside the Dialog to\n        ensure it appears above the dialog in the stacking context.\n      </p>\n    </>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode"
        },
        {
          "name": "id",
          "type": "string",
          "description": "May be used to customize how the ID is set on the text input to be used by ARIA attributes on related elements.",
          "defaultValue": ""
        }
      ],
      "subcomponents": [
        {
          "name": "Autocomplete.Input",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "TextInput"
            },
            {
              "name": "openOnFocus",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the associated autocomplete menu should open on an input focus event",
              "deprecated": true
            }
          ],
          "passthrough": {
            "element": "TextInput",
            "url": "/react/TextInput"
          }
        },
        {
          "name": "Autocomplete.Overlay",
          "props": [
            {
              "name": "menuAnchorRef",
              "type": "React.RefObject<HTMLElement>"
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "overlayProps",
              "deprecated": true,
              "type": "Partial<OverlayProps>",
              "description": "Props to be spread on the internal `Overlay` component."
            }
          ],
          "passthrough": {
            "element": "Overlay",
            "url": "/react/Overlay"
          }
        },
        {
          "name": "Autocomplete.Menu",
          "props": [
            {
              "name": "items",
              "required": true,
              "type": "T[]",
              "description": "The options for field values that are displayed in the dropdown menu. One or more may be selected depending on the value of the `selectionVariant` prop."
            },
            {
              "name": "selectedItemIds",
              "required": true,
              "type": "string[]",
              "description": "The IDs of the selected items"
            },
            {
              "name": "aria-labelledby",
              "required": true,
              "type": "string"
            },
            {
              "name": "addNewItem",
              "type": "Omit<T, 'id' | 'leadingVisual' | 'onAction'> & { handleAddItem: (item: Omit<T, 'leadingVisual' | 'onAction'>) => void; }",
              "description": "A menu item that is used to allow users make a selection that is not available in the array passed to the `items` prop. This menu item gets appended to the end of the list of options."
            },
            {
              "name": "emptyStateText",
              "type": "React.ReactNode | false",
              "description": "The text that appears in the menu when there are no options in the array passed to the `items` prop."
            },
            {
              "name": "filterFn",
              "type": "(item: T, i: number) => boolean",
              "description": "A custom function used to filter the options in the array passed to the `items` prop. By default, we filter out items that don't match the value of the autocomplete text input. The default filter is not case-sensitive."
            },
            {
              "name": "loading",
              "type": "boolean",
              "description": "Whether the data is loading for the menu items"
            },
            {
              "name": "sortOnCloseFn",
              "type": "(itemIdA: string | number, itemIdB: string | number) => number",
              "description": "The sort function that is applied to the options in the array passed to the `items` prop after the user closes the menu. By default, selected items are sorted to the top after the user closes the menu."
            },
            {
              "name": "selectionVariant",
              "type": "'single' | 'multiple'",
              "description": "Whether there can be one item selected from the menu or multiple items selected from the menu"
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "description": "Function that gets called when the menu is opened or closed"
            },
            {
              "name": "onSelectedChange",
              "type": "(item: T | T[]) => void",
              "description": "The function that is called when an item in the list is selected or deselected"
            },
            {
              "name": "customScrollContainerRef",
              "type": "React.MutableRefObject<HTMLElement | null>",
              "description": "If the menu is rendered in a scrolling element other than the `Autocomplete.Overlay` component, pass the ref of that element to `customScrollContainerRef` to ensure the container automatically scrolls when the user highlights an item in the menu that is outside the scroll container"
            }
          ]
        }
      ]
    },
    "avatar": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Avatar",
      "id": "avatar",
      "name": "Avatar",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-avatar--default",
          "code": "() => <Avatar src=\"https://avatars.githubusercontent.com/u/7143434?v=4\" />"
        },
        {
          "id": "components-avatar-features--square",
          "code": "() => (\n  <Avatar\n    square\n    alt=\"primer\"\n    src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n  />\n)"
        },
        {
          "id": "components-avatar-features--size",
          "code": "() => (\n  <div>\n    <Avatar\n      size={4}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={8}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={12}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={16}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={20}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={24}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={28}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={32}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={40}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={48}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={56}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={64}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n  </div>\n)"
        },
        {
          "id": "components-avatar-features--size-responsive",
          "code": "() => (\n  <div>\n    <Avatar\n      size={{\n        narrow: 4,\n        regular: 8,\n        wide: 12,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 8,\n        regular: 12,\n        wide: 16,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 12,\n        regular: 16,\n        wide: 20,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 16,\n        regular: 20,\n        wide: 24,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 20,\n        regular: 24,\n        wide: 28,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 24,\n        regular: 28,\n        wide: 32,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 28,\n        regular: 32,\n        wide: 40,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 32,\n        regular: 40,\n        wide: 48,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 40,\n        regular: 48,\n        wide: 56,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 48,\n        regular: 56,\n        wide: 64,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "alt",
          "type": "string",
          "defaultValue": "''",
          "description": "Provide alt text when the avatar is used without a name next to it."
        },
        {
          "name": "size",
          "type": "number | { narrow?: number; regular?: number; wide?: number; }",
          "defaultValue": "20",
          "description": "The size of the avatar in pixels."
        },
        {
          "name": "square",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the avatar will be square instead of circular."
        },
        {
          "name": "src",
          "type": "string",
          "required": false,
          "description": "URL of the avatar image.",
          "defaultValue": ""
        }
      ],
      "subcomponents": []
    },
    "avatar_stack": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/AvatarStack",
      "id": "avatar_stack",
      "name": "AvatarStack",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-avatarstack-features--align-left",
          "code": "() => (\n  <AvatarStack>\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      alt=\"GitHub logo\"\n      src=\"https://avatars.githubusercontent.com/github\"\n    />\n    <Avatar alt=\"Atom logo\" src=\"https://avatars.githubusercontent.com/atom\" />\n    <Avatar\n      alt=\"GitHub Desktop logo\"\n      src=\"https://avatars.githubusercontent.com/u/13171334?v=4\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--align-right",
          "code": "() => (\n  <AvatarStack alignRight>\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      alt=\"GitHub logo\"\n      src=\"https://avatars.githubusercontent.com/github\"\n    />\n    <Avatar alt=\"Atom logo\" src=\"https://avatars.githubusercontent.com/atom\" />\n    <Avatar\n      alt=\"GitHub Desktop logo\"\n      src=\"https://avatars.githubusercontent.com/u/13171334?v=4\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--disable-expand-on-hover",
          "code": "() => (\n  <AvatarStack disableExpand>\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      alt=\"GitHub logo\"\n      src=\"https://avatars.githubusercontent.com/github\"\n    />\n    <Avatar alt=\"Atom logo\" src=\"https://avatars.githubusercontent.com/atom\" />\n    <Avatar\n      alt=\"GitHub Desktop logo\"\n      src=\"https://avatars.githubusercontent.com/u/13171334?v=4\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--custom-size-on-parent",
          "code": "() => (\n  <AvatarStack size={32}>\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      alt=\"GitHub logo\"\n      src=\"https://avatars.githubusercontent.com/github\"\n    />\n    <Avatar alt=\"Atom logo\" src=\"https://avatars.githubusercontent.com/atom\" />\n    <Avatar\n      alt=\"GitHub Desktop logo\"\n      src=\"https://avatars.githubusercontent.com/u/13171334?v=4\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--custom-size-on-parent-responsive",
          "code": "() => (\n  <AvatarStack\n    size={{\n      narrow: 32,\n      regular: 48,\n      wide: 64,\n    }}\n  >\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      alt=\"GitHub logo\"\n      src=\"https://avatars.githubusercontent.com/github\"\n    />\n    <Avatar alt=\"Atom logo\" src=\"https://avatars.githubusercontent.com/atom\" />\n    <Avatar\n      alt=\"GitHub Desktop logo\"\n      src=\"https://avatars.githubusercontent.com/u/13171334?v=4\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--custom-size-on-children",
          "code": "() => (\n  <AvatarStack>\n    <Avatar\n      size={20}\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={32}\n      alt=\"GitHub logo\"\n      src=\"https://avatars.githubusercontent.com/github\"\n    />\n    <Avatar\n      size={48}\n      alt=\"Atom logo\"\n      src=\"https://avatars.githubusercontent.com/atom\"\n    />\n    <Avatar\n      size={64}\n      alt=\"GitHub Desktop logo\"\n      src=\"https://avatars.githubusercontent.com/u/13171334?v=4\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--custom-size-on-children-responsive",
          "code": "() => (\n  <AvatarStack>\n    <Avatar\n      size={{\n        narrow: 16,\n        regular: 32,\n        wide: 48,\n      }}\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 32,\n        regular: 48,\n        wide: 64,\n      }}\n      alt=\"GitHub logo\"\n      src=\"https://avatars.githubusercontent.com/github\"\n    />\n    <Avatar\n      size={{\n        narrow: 48,\n        regular: 64,\n        wide: 96,\n      }}\n      alt=\"Atom logo\"\n      src=\"https://avatars.githubusercontent.com/atom\"\n    />\n    <Avatar\n      size={{\n        narrow: 64,\n        regular: 96,\n        wide: 120,\n      }}\n      alt=\"GitHub Desktop logo\"\n      src=\"https://avatars.githubusercontent.com/u/13171334?v=4\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--with-single-avatar",
          "code": "() => (\n  <AvatarStack>\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n  </AvatarStack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "ReactNode",
          "description": "A set of Avatar components to stack",
          "defaultValue": ""
        },
        {
          "name": "alignRight",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Align the avatars to the right"
        },
        {
          "name": "disableExpand",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Do not spread the avatars on hover"
        },
        {
          "name": "variant",
          "type": "'cascade' | 'stack'",
          "defaultValue": "'cascade'",
          "description": "The style of overlapping avatars. 'cascade' increases the overlap for 3rd+ avatars, while 'stack' uses a uniform overlap."
        },
        {
          "name": "shape",
          "type": "'circle' | 'square'",
          "defaultValue": "'circle'",
          "description": "The shape of the avatars."
        },
        {
          "name": "size",
          "type": "number | { narrow?: number; regular?: number; wide?: number; }",
          "defaultValue": "20",
          "description": "The size of the avatar children in pixels."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling.",
          "defaultValue": ""
        }
      ],
      "subcomponents": []
    },
    "banner": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Banner",
      "id": "banner",
      "name": "Banner",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "importPath": "@primer/react",
      "stories": [
        {
          "id": "components-banner--default",
          "code": "() => {\n  return (\n    <Banner\n      onDismiss={action('onDismiss')}\n      title=\"Info\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--critical",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Critical\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      variant=\"critical\"\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--info",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Info\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"info\"\n    ></Banner>\n  )\n}"
        },
        {
          "id": "components-banner-features--success",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Success\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"success\"\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--upsell",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Upsell\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"upsell\"\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--warning",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"warning\"\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--dismiss",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Notice\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--dismiss-with-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Notice\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--with-hidden-title",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      variant=\"warning\"\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--with-hidden-title-and-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      variant=\"warning\"\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--dismissible-with-hidden-title-and-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"warning\"\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--dismissible-with-hidden-title-and-secondary-action",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"warning\"\n      secondaryAction={\n        <Banner.SecondaryAction leadingVisual={GitPullRequestIcon}>\n          Button\n        </Banner.SecondaryAction>\n      }\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--with-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n      variant=\"warning\"\n    />\n  )\n}"
        },
        {
          "id": "components-banner-features--custom-icon",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Upsell\"\n      description=\"An example banner with a custom icon\"\n      leadingVisual={<CopilotIcon />}\n      onDismiss={action('onDismiss')}\n      variant=\"upsell\"\n    />\n  )\n}"
        },
        {
          "id": "components-banner-examples--with-announcement",
          "code": "() => {\n  type Choice = 'one' | 'two' | 'three'\n  const messages: Map<Choice, string> = new Map([\n    ['one', 'This is a message for choice one'],\n    ['two', 'This is a message for choice two'],\n    ['three', 'This is a message for choice three'],\n  ])\n  const [selected, setSelected] = React.useState<Choice>('one')\n  return (\n    <>\n      <Banner\n        title=\"Info\"\n        description={<AriaStatus>{messages.get(selected)}</AriaStatus>}\n        onDismiss={action('onDismiss')}\n        primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n        secondaryAction={\n          <Banner.SecondaryAction>Button</Banner.SecondaryAction>\n        }\n      />\n      <RadioGroup\n        name=\"options\"\n        onChange={(selected) => {\n          setSelected(selected as Choice)\n        }}\n        className={classes.RadioGroupWithTopMargin}\n      >\n        <RadioGroup.Label>Choices</RadioGroup.Label>\n        <FormControl>\n          <Radio value=\"one\" defaultChecked />\n          <FormControl.Label>Choice one</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Radio value=\"two\" />\n          <FormControl.Label>Choice two</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Radio value=\"three\" />\n          <FormControl.Label>Choice three</FormControl.Label>\n        </FormControl>\n      </RadioGroup>\n    </>\n  )\n}"
        }
      ],
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "Provide an optional label to override the default name for the Banner landmark region"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Provide an optional className to add to the outermost element rendered by the Banner"
        },
        {
          "name": "description",
          "type": "React.ReactNode",
          "description": "Provide an optional description for the Banner. This should provide supplemental information about the Banner"
        },
        {
          "name": "hideTitle",
          "type": "boolean",
          "description": "Whether to hide the title visually."
        },
        {
          "name": "icon",
          "type": "React.ReactNode",
          "description": "Provide a custom icon for the Banner. This is only available when `variant` is `info` or `upsell`",
          "deprecated": true
        },
        {
          "name": "leadingVisual",
          "type": "React.ReactNode",
          "description": "Provide a custom leading visual for the Banner. This is only available when `variant` is `info` or `upsell`"
        },
        {
          "name": "onDismiss",
          "type": "() => void",
          "description": "Optionally provide a handler to be called when the banner is dismissed. Providing this prop will show a dismiss button"
        },
        {
          "name": "primaryAction",
          "type": "React.ReactNode",
          "description": ""
        },
        {
          "name": "secondaryAction",
          "type": "React.ReactNode",
          "description": ""
        },
        {
          "name": "title",
          "type": "React.ReactNode",
          "description": "The title for the Banner. This will be used as the accessible name and is required unless `Banner.Title` is used as a child"
        },
        {
          "name": "variant",
          "type": "'critical' | 'info' | 'success' | 'upsell' | 'warning'",
          "description": "Specify the type of the Banner"
        },
        {
          "name": "layout",
          "type": "'default' | 'compact'",
          "description": "Specify the layout of the Banner. Compact layout will reduce the padding."
        },
        {
          "name": "actionsLayout",
          "type": "'default' | 'inline' | 'stacked'",
          "description": "Override the responsive layout of the action buttons. 'inline' layout will display the buttons inline with the title and description, while 'stacked' layout will always render the buttons in a new row."
        },
        {
          "name": "flush",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Full width banner specifically for use within confined spaces, such as dialogs, tables, cards, or boxes where available space is limited."
        }
      ],
      "subcomponents": [
        {
          "name": "Banner.Title",
          "props": [
            {
              "name": "as",
              "type": "'h2' | 'h3' | 'h4' | 'h5' | 'h6'"
            }
          ]
        },
        {
          "name": "Banner.Description",
          "props": [
            {
              "name": "className",
              "type": "string",
              "description": "Class name(s) for custom styling.",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "Banner.PrimaryAction",
          "props": [],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        },
        {
          "name": "Banner.SecondaryAction",
          "props": [],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        }
      ]
    },
    "blankslate": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Blankslate",
      "id": "blankslate",
      "name": "Blankslate",
      "status": "draft",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "experimental-components-blankslate--default",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Welcome to the mona wiki!</Blankslate.Heading>\n    <Blankslate.Description>\n      Wikis provide a place in your repository to lay out the roadmap of your\n      project, show the current status, and document software better, together.\n    </Blankslate.Description>\n    <Blankslate.PrimaryAction href=\"#\">\n      Create the first page\n    </Blankslate.PrimaryAction>\n    <Blankslate.SecondaryAction href=\"#\">\n      Learn more about wikis\n    </Blankslate.SecondaryAction>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-visual",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-primary-action-as-link",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n    <Blankslate.PrimaryAction href=\"#\">Primary action</Blankslate.PrimaryAction>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-primary-action-as-button",
          "code": "() => {\n  const [isOpen, setIsOpen] = React.useState(false)\n  const onDialogClose = React.useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Blankslate>\n        <Blankslate.Visual>\n          <BookIcon size=\"medium\" />\n        </Blankslate.Visual>\n        <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n        <Blankslate.Description>\n          Use it to provide information when no dynamic content exists.\n        </Blankslate.Description>\n        <Blankslate.PrimaryAction onClick={() => setIsOpen(true)}>\n          Primary action\n        </Blankslate.PrimaryAction>\n      </Blankslate>\n      {isOpen ? (\n        <ConfirmationDialog\n          title=\"Delete universe?\"\n          onClose={onDialogClose}\n          confirmButtonContent=\"Delete it!\"\n          confirmButtonType=\"danger\"\n        >\n          Deleting the universe could have disastrous effects, including but not\n          limited to destroying all life on Earth.\n        </ConfirmationDialog>\n      ) : null}\n    </>\n  )\n}"
        },
        {
          "id": "experimental-components-blankslate-features--with-secondary-action",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n    <Blankslate.SecondaryAction href=\"#\">\n      Secondary action\n    </Blankslate.SecondaryAction>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-border",
          "code": "() => (\n  <Blankslate border>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--narrow",
          "code": "() => (\n  <Blankslate border narrow>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--spacious",
          "code": "() => (\n  <Blankslate spacious>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "border",
          "type": "boolean",
          "description": "Add a border around this component"
        },
        {
          "name": "narrow",
          "type": "boolean",
          "description": ""
        },
        {
          "name": "spacious",
          "type": "boolean",
          "description": ""
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) for custom styling.",
          "defaultValue": ""
        },
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "description": "The size of the componeont",
          "defaultValue": "'medium'"
        }
      ],
      "subcomponents": [
        {
          "name": "Blankslate.Visual",
          "props": []
        },
        {
          "name": "Blankslate.Heading",
          "props": [
            {
              "name": "as",
              "type": "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'"
            }
          ]
        },
        {
          "name": "Blankslate.Description",
          "props": []
        },
        {
          "name": "Blankslate.PrimaryAction",
          "props": [
            {
              "name": "href",
              "type": "string",
              "required": false,
              "description": "Link to complete primary action. If defined, will render as an anchor instead of a button."
            }
          ]
        },
        {
          "name": "Blankslate.SecondaryAction",
          "props": [
            {
              "name": "href",
              "type": "string",
              "description": "Link to complete secondary action"
            }
          ]
        }
      ]
    },
    "branch_name": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/BranchName",
      "id": "branch_name",
      "name": "BranchName",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-branchname--default",
          "code": "() => <BranchName href=\"#\">branch_name</BranchName>"
        },
        {
          "id": "components-branchname-features--with-branch-icon",
          "code": "() => (\n  <BranchName href=\"#\">\n    <Stack direction=\"horizontal\" gap=\"condensed\" align=\"center\">\n      <Octicon icon={GitBranchIcon} />\n      branch_name\n    </Stack>\n  </BranchName>\n)"
        },
        {
          "id": "components-branchname-features--not-a-link",
          "code": "() => <BranchName as=\"span\">branch_name_as_span</BranchName>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "ref",
          "type": "React.RefObject<HTMLAnchorElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"a\""
        }
      ],
      "subcomponents": []
    },
    "breadcrumbs": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Breadcrumbs",
      "id": "breadcrumbs",
      "name": "Breadcrumbs",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-breadcrumbs--default",
          "code": "() => (\n  <Breadcrumbs>\n    <Breadcrumbs.Item href=\"#\">Home</Breadcrumbs.Item>\n    <Breadcrumbs.Item href=\"#\">About</Breadcrumbs.Item>\n    <Breadcrumbs.Item href=\"#\" selected>\n      Team\n    </Breadcrumbs.Item>\n  </Breadcrumbs>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Additional CSS class names to apply to the breadcrumbs container",
          "defaultValue": ""
        },
        {
          "name": "children",
          "type": "Breadcrumbs.Item[]",
          "defaultValue": "",
          "description": "Breadcrumb items to render. Each item should be a Breadcrumbs.Item component."
        },
        {
          "name": "overflow",
          "type": "'wrap' | 'menu' | 'menu-with-root'",
          "required": false,
          "description": "How to handle overflow when breadcrumbs don't fit in the container. 'wrap' allows items to wrap to new lines. 'menu' collapses items into an overflow menu. 'menu-with-root' also collapses items into an overflow menu but includes the root (first) breadcrumb in the menu so only the last items remain visible.",
          "defaultValue": "'wrap'"
        }
      ],
      "subcomponents": [
        {
          "name": "Breadcrumbs.Item",
          "props": [
            {
              "name": "selected",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether this item represents the current page. Sets aria-current='page' for accessibility."
            },
            {
              "name": "to",
              "type": "string | Partial<Path>",
              "required": false,
              "description": "Used when the item is rendered using a component like React Router's `Link`. The path to navigate to.",
              "defaultValue": ""
            },
            {
              "name": "href",
              "type": "string",
              "required": false,
              "description": "The URL that the breadcrumb item links to. Used with regular anchor elements."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "required": true,
              "description": "The content to display inside the breadcrumb item, typically text."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLAnchorElement>"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes"
          }
        }
      ]
    },
    "button": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Button",
      "id": "button",
      "name": "Button",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-button--default",
          "code": "() => <Button>Default</Button>"
        },
        {
          "id": "components-button-features--primary",
          "code": "() => <Button variant=\"primary\">Primary</Button>"
        },
        {
          "id": "components-button-features--danger",
          "code": "() => <Button variant=\"danger\">Danger</Button>"
        },
        {
          "id": "components-button-features--invisible",
          "code": "() => <Button variant=\"invisible\">Invisible</Button>"
        },
        {
          "id": "components-button-features--link",
          "code": "() => <Button variant=\"link\">Button that looks like a link</Button>"
        },
        {
          "id": "components-button-features--leading-visual",
          "code": "() => <Button leadingVisual={HeartIcon}>Leading visual</Button>"
        },
        {
          "id": "components-button-features--trailing-visual",
          "code": "() => <Button trailingVisual={EyeIcon}>Trailing visual</Button>"
        },
        {
          "id": "components-button-features--trailing-counter",
          "code": "() => {\n  const [count, setCount] = useState(0)\n  const onClick = () => {\n    setCount(count + 1)\n    announce(`Watch ${count + 1}`)\n  }\n  return (\n    <>\n      <Button onClick={onClick} count={count}>\n        Watch\n      </Button>\n      <AccessibilityNote />\n      <p>\n        In this example, a live region has been implemented to communicate the\n        change.\n      </p>\n    </>\n  )\n}"
        },
        {
          "id": "components-button-features--trailing-counter-with-no-text",
          "code": "() => <Button aria-label=\"Comments\" leadingVisual={CommentIcon} count={3} />"
        },
        {
          "id": "components-button-features--trailing-counter-all-variants",
          "code": "() => {\n  const [count, setCount] = useState(0)\n  const onClick = () => {\n    setCount(count + 1)\n    announce(`Watch ${count + 1}`)\n  }\n  return (\n    <>\n      <Stack gap=\"normal\" wrap=\"wrap\" direction=\"horizontal\">\n        <Button onClick={onClick} count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"primary\" disabled count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"danger\" count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"danger\" disabled count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"invisible\" count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"invisible\" disabled count={count}>\n          Watch\n        </Button>\n      </Stack>\n      <AccessibilityNote />\n      <p>\n        In these examples, a live region has been implemented to communicate the\n        change.\n      </p>\n    </>\n  )\n}"
        },
        {
          "id": "components-button-features--trailing-action",
          "code": "() => <Button trailingAction={TriangleDownIcon}>Trailing action</Button>"
        },
        {
          "id": "components-button-features--block",
          "code": "() => <Button block>Default</Button>"
        },
        {
          "id": "components-button-features--disabled",
          "code": "() => (\n  <div\n    style={{\n      display: 'flex',\n      flexDirection: 'row',\n      gap: '1rem',\n    }}\n  >\n    <Button disabled>Default</Button>\n    <Button variant=\"primary\" disabled>\n      Primary\n    </Button>\n    <Button variant=\"danger\" disabled>\n      Danger\n    </Button>\n    <Button variant=\"invisible\" disabled>\n      Invisible\n    </Button>\n  </div>\n)"
        },
        {
          "id": "components-button-features--inactive",
          "code": "() => (\n  <div\n    style={{\n      display: 'flex',\n      flexWrap: 'wrap',\n      flexDirection: 'row',\n      gap: '1rem',\n    }}\n  >\n    <VisuallyHidden id=\"inactive-state\">Inactive</VisuallyHidden>\n    <Button inactive aria-describedby=\"inactive-state\">\n      Default\n    </Button>\n    <Button variant=\"primary\" inactive aria-describedby=\"inactive-state\">\n      Primary\n    </Button>\n    <Button variant=\"danger\" inactive aria-describedby=\"inactive-state\">\n      Danger\n    </Button>\n    <Button variant=\"invisible\" inactive aria-describedby=\"inactive-state\">\n      Invisible\n    </Button>\n  </div>\n)"
        },
        {
          "id": "components-button-features--small",
          "code": "() => <Button size=\"small\">Default</Button>"
        },
        {
          "id": "components-button-features--medium",
          "code": "() => <Button size=\"medium\">Default</Button>"
        },
        {
          "id": "components-button-features--large",
          "code": "() => <Button size=\"large\">Default</Button>"
        },
        {
          "id": "components-button-features--loading",
          "code": "() => <Button loading>Default</Button>"
        },
        {
          "id": "components-button-features--loading-custom-announcement",
          "code": "() => (\n  <Button loading loadingAnnouncement=\"This is a custom loading announcement\">\n    Default\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-with-leading-visual",
          "code": "() => (\n  <Button loading leadingVisual={DownloadIcon}>\n    Export\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-with-trailing-visual",
          "code": "() => (\n  <Button loading trailingVisual={DownloadIcon}>\n    Export\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-with-trailing-action",
          "code": "() => (\n  <Button loading trailingAction={TriangleDownIcon}>\n    Export dropdown\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-trigger",
          "code": "() => {\n  const [isLoading, setIsLoading] = useState(false)\n  const handleClick = () => {\n    setIsLoading(true)\n  }\n  return (\n    <Button\n      loading={isLoading}\n      onClick={handleClick}\n      leadingVisual={DownloadIcon}\n    >\n      Export\n    </Button>\n  )\n}"
        },
        {
          "id": "components-button-features--label-wrap",
          "code": "() => {\n  return (\n    <Stack\n      style={{\n        width: '200px',\n      }}\n    >\n      <Button labelWrap>\n        This button label will wrap if the label is too long\n      </Button>\n      <Button size=\"small\" labelWrap>\n        This small button label will wrap if the label is too long\n      </Button>\n      <Button size=\"large\" labelWrap>\n        This large button label will wrap if the label is too long\n      </Button>\n      <Button labelWrap leadingVisual={HeartIcon} trailingVisual={EyeIcon}>\n        This button label will wrap if the label is too long\n      </Button>\n    </Stack>\n  )\n}"
        },
        {
          "id": "components-button-features--inactive-button-with-tooltip",
          "code": "() => (\n  <Tooltip\n    text=\"Action unavailable: an error occurred while loading repository permissions\"\n    direction=\"n\"\n  >\n    <Button inactive>Review changes</Button>\n  </Tooltip>\n)"
        },
        {
          "id": "components-button-features--expanded-button",
          "code": "() => (\n  <Stack align=\"start\">\n    <Button aria-expanded trailingAction={TriangleDownIcon}>\n      Review changes\n    </Button>\n    <Button aria-expanded trailingAction={TriangleDownIcon} variant=\"primary\">\n      Review changes\n    </Button>\n    <Button aria-expanded trailingAction={TriangleDownIcon} variant=\"invisible\">\n      Review changes\n    </Button>\n    <Button aria-expanded trailingAction={TriangleDownIcon} variant=\"danger\">\n      Review changes\n    </Button>\n  </Stack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "alignContent",
          "type": "'start' | 'center'",
          "description": "Content alignment for when visuals are present."
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "'button'"
        },
        {
          "name": "href",
          "type": "string",
          "description": "**May only be used when `as` is set to 'a'**.\n The URL the button links to. If `as` is set to 'a', this prop is required."
        },
        {
          "name": "block",
          "type": "boolean",
          "description": "Allow button width to fill its container."
        },
        {
          "name": "children",
          "required": true,
          "type": "React.ReactNode",
          "description": "The content of the button."
        },
        {
          "name": "count",
          "type": "number",
          "description": "For counter buttons, the number to display."
        },
        {
          "name": "inactive",
          "type": "boolean",
          "description": "Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button.\nThis is intended to be used when a system error such as an outage prevents the button from performing its usual action.\nInactive styles are slightly different from disabled styles because inactive buttons need to have an accessible color contrast ratio. This is because inactive buttons can have tooltips or perform an action such as opening a dialog explaining why it's inactive.\nIf both `disabled` and `inactive` are true, `disabled` takes precedence."
        },
        {
          "name": "leadingIcon",
          "type": "React.ComponentType<OcticonProps>",
          "description": "An icon to display before the button text.",
          "deprecated": true
        },
        {
          "name": "leadingVisual",
          "type": "React.ElementType",
          "description": "A visual to display before the button text."
        },
        {
          "name": "loading",
          "type": "boolean",
          "description": "When true, the button is in a loading state."
        },
        {
          "name": "loadingAnnouncement",
          "type": "string",
          "description": "The content to announce to screen readers when loading. This requires `loading` prop to be true"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLButtonElement>"
        },
        {
          "name": "size",
          "type": "'small'\n| 'medium'\n| 'large'",
          "defaultValue": "'medium'"
        },
        {
          "name": "trailingIcon",
          "type": "React.ComponentType<OcticonProps>",
          "description": "An icon to display after the button text.",
          "deprecated": true
        },
        {
          "name": "trailingVisual",
          "type": "React.ElementType",
          "description": "A visual to display after the button text."
        },
        {
          "name": "trailingAction",
          "type": "React.ElementType",
          "description": "Trailing action appears to the right of the trailing visual and is always locked to the end"
        },
        {
          "name": "variant",
          "type": "'default'\n| 'primary'\n| 'danger'\n| 'invisible'\n| 'link'",
          "defaultValue": "'default'",
          "description": "Change the visual style of the button."
        },
        {
          "name": "labelWrap",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the button label should wrap to multiple lines of it is longer than the button width."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "description": "Avoid disabling buttons because it will make them inaccessible to users who rely on keyboard navigation. Buttons that are disabled can not be clicked, selected, or navigated through.",
          "defaultValue": ""
        }
      ],
      "passthrough": {
        "element": "button",
        "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attributes"
      }
    },
    "icon_button": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Button",
      "id": "icon_button",
      "name": "IconButton",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-iconbutton--default",
          "code": "() => <IconButton icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--primary",
          "code": "() => <IconButton icon={HeartIcon} variant=\"primary\" aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--danger",
          "code": "() => <IconButton icon={HeartIcon} variant=\"danger\" aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--invisible",
          "code": "() => <IconButton icon={HeartIcon} variant=\"invisible\" aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--disabled",
          "code": "() => <IconButton disabled icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--small",
          "code": "() => <IconButton size=\"small\" icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--medium",
          "code": "() => <IconButton size=\"medium\" icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--large",
          "code": "() => <IconButton size=\"large\" icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--with-description",
          "code": "() => (\n  <IconButton\n    icon={InboxIcon}\n    aria-label=\"Notifications\"\n    description=\"You have no unread notifications.\"\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--external-tooltip",
          "code": "() => (\n  <Tooltip\n    text=\"this is a supportive description for icon button\"\n    direction=\"se\"\n  >\n    <IconButton icon={HeartIcon} aria-label=\"HeartIcon\" />\n  </Tooltip>\n)"
        },
        {
          "id": "components-iconbutton-features--as-a-menu-anchor",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Anchor>\n      <IconButton icon={ChevronDownIcon} aria-label=\"Something\" />\n    </ActionMenu.Anchor>\n\n    <ActionMenu.Overlay width=\"medium\">\n      <ActionList>\n        <ActionList.Item onSelect={() => alert('Copy link clicked')}>\n          Copy link\n          <ActionList.TrailingVisual>⌘C</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Quote reply clicked')}>\n          Quote reply\n          <ActionList.TrailingVisual>⌘Q</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Edit comment clicked')}>\n          Edit comment\n          <ActionList.TrailingVisual>⌘E</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Item\n          variant=\"danger\"\n          onSelect={() => alert('Delete file clicked')}\n        >\n          Delete file\n          <ActionList.TrailingVisual>⌘D</ActionList.TrailingVisual>\n        </ActionList.Item>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        },
        {
          "id": "components-iconbutton-features--loading",
          "code": "() => (\n  <IconButton loading icon={HeartIcon} variant=\"primary\" aria-label=\"Primary\" />\n)"
        },
        {
          "id": "components-iconbutton-features--loading-trigger",
          "code": "() => {\n  const [isLoading, setIsLoading] = useState(false)\n  const handleClick = () => {\n    setIsLoading(true)\n    setTimeout(() => {\n      setIsLoading(false)\n    }, 3000)\n  }\n  return (\n    <IconButton\n      loading={isLoading}\n      onClick={handleClick}\n      icon={DownloadIcon}\n      aria-label=\"Download\"\n    />\n  )\n}"
        },
        {
          "id": "components-iconbutton-features--keybinding-hint-on-description",
          "code": "() => (\n  <IconButton\n    icon={InboxIcon}\n    aria-label=\"Notifications\"\n    description=\"You have unread notifications\"\n    keybindingHint=\"G+N\"\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--keybinding-hint",
          "code": "() => <IconButton icon={BoldIcon} aria-label=\"Bold\" keybindingHint=\"Mod+B\" />"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "defaultValue": "",
          "required": true,
          "description": "This will be the Button description."
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "'button'"
        },
        {
          "name": "href",
          "type": "string",
          "description": "**May only be used when `as` is set to 'a'**.\n The URL the button links to. If `as` is set to 'a', this prop is required."
        },
        {
          "name": "variant",
          "type": "'default' | 'primary' | 'danger' | 'invisible' | 'link'",
          "defaultValue": "",
          "description": "Changes the look and feel of the button which is different for each variant"
        },
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "",
          "description": "Changes the size of the icon button component"
        },
        {
          "name": "inactive",
          "type": "boolean",
          "description": "Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button."
        },
        {
          "name": "icon",
          "type": "Component",
          "defaultValue": "",
          "description": "provide an octicon. It will be placed in the center of the button"
        },
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Use an aria label to describe the functionality of the button. Please refer to [our guidance on alt text](https://primer.style/guides/accessibility/alternative-text-for-images) for tips on writing good alternative text."
        },
        {
          "name": "keyshortcuts",
          "type": "string",
          "defaultValue": "",
          "deprecated": true,
          "description": "Use `keybindingHint` instead."
        },
        {
          "name": "keybindingHint",
          "type": "string | string[]",
          "description": "Optional keybinding hint to show in the tooltip for this button. Pass a string for a single shortcut or an array of strings to show multiple shortcuts joined with \"or\". See the `KeybindingHint` component documentation for the correct format. Has no effect if tooltip is overridden or disabled. Does **not** bind any keybindings for this button - this is only for visual hints."
        },
        {
          "name": "tooltipDirection",
          "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
          "defaultValue": "'s'",
          "description": "The direction of the tooltip.",
          "required": false
        },
        {
          "name": "description",
          "type": "string",
          "required": false,
          "description": "If `description` is provided, we will use a Tooltip to describe the button. Then `aria-label` is used to label the button.",
          "defaultValue": ""
        }
      ],
      "subcomponents": []
    },
    "button_group": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ButtonGroup",
      "id": "button_group",
      "name": "ButtonGroup",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-buttongroup--default",
          "code": "() => (\n  <ButtonGroup>\n    <Button>Button 1</Button>\n    <Button>Button 2</Button>\n    <Button>Button 3</Button>\n  </ButtonGroup>\n)"
        },
        {
          "id": "components-buttongroup-features--icon-buttons",
          "code": "() => (\n  <ButtonGroup>\n    {/* We can remove these unsafe props after we resolve https://github.com/primer/react/issues/4129 */}\n    <IconButton icon={PlusIcon} aria-label=\"Add\" />\n    <IconButton icon={DashIcon} aria-label=\"Subtract\" />\n  </ButtonGroup>\n)"
        },
        {
          "id": "components-buttongroup-features--loading-buttons",
          "code": "() => {\n  const handleClick = () => {}\n  return (\n    <ButtonGroup>\n      <Button loading={true} onClick={handleClick}>\n        Button 1\n      </Button>\n      <Button onClick={handleClick}>Button 2</Button>\n      <Tooltip text=\"Additional info about the button\">\n        <Button onClick={handleClick}>Button 3</Button>\n      </Tooltip>\n    </ButtonGroup>\n  )\n}"
        },
        {
          "id": "components-buttongroup-features--dropdown-split",
          "code": "() => {\n  const actions = ['Action one', 'Action two', 'Action three']\n  const [selectedActionIndex, setSelectedActionIndex] =\n    React.useState<number>(0)\n  const selectedAction = actions[selectedActionIndex]\n  return (\n    <ButtonGroup>\n      <Button\n        onClick={() => {\n          alert(`Activated ${selectedAction}`)\n        }}\n      >\n        {selectedAction}\n      </Button>\n      <ActionMenu>\n        <ActionMenu.Button aria-label=\"More options\" icon={TriangleDownIcon} />\n        <ActionMenu.Overlay>\n          <ActionList>\n            {actions.map((action, index) => {\n              return (\n                <ActionList.Item\n                  key={action}\n                  onSelect={() => {\n                    setSelectedActionIndex(index)\n                  }}\n                >\n                  {action}\n                </ActionList.Item>\n              )\n            })}\n          </ActionList>\n        </ActionMenu.Overlay>\n      </ActionMenu>\n    </ButtonGroup>\n  )\n}"
        },
        {
          "id": "components-buttongroup-features--as-toolbar",
          "code": "() => (\n  <ButtonGroup role=\"toolbar\">\n    <Button>Button 1</Button>\n    <Button>Button 2</Button>\n    <Button>Button 3</Button>\n  </ButtonGroup>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        }
      ],
      "subcomponents": []
    },
    "card": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Card",
      "id": "card",
      "name": "Card",
      "status": "draft",
      "a11yReviewed": false,
      "importPath": "@primer/react/experimental",
      "stories": [
        {
          "id": "experimental-components-card--default",
          "code": "() => {\n  return (\n    <Card>\n      <Card.Icon icon={RocketIcon} />\n      <Card.Heading>Card Heading</Card.Heading>\n      <Card.Description>\n        This is a description of the card providing supplemental information.\n      </Card.Description>\n      <Card.Metadata>\n        <PeopleIcon size={16} />3 contributors\n      </Card.Metadata>\n    </Card>\n  )\n}"
        },
        {
          "id": "experimental-components-card-features--with-image",
          "code": "() => {\n  return (\n    <Card>\n      <Card.Image src=\"https://github.com/octocat.png\" alt=\"Octocat\" />\n      <Card.Heading>Card with Image</Card.Heading>\n      <Card.Description>\n        This card uses an edge-to-edge image instead of an icon.\n      </Card.Description>\n    </Card>\n  )\n}"
        },
        {
          "id": "experimental-components-card-features--with-metadata",
          "code": "() => {\n  return (\n    <Card>\n      <Card.Icon icon={RepoIcon} />\n      <Card.Heading>primer/react</Card.Heading>\n      <Card.Description>\n        {\n          \"GitHub's design system implemented as React components for building consistent user interfaces.\"\n        }\n      </Card.Description>\n      <Card.Metadata>\n        <StarIcon size={16} />\n        1.2k stars\n      </Card.Metadata>\n    </Card>\n  )\n}"
        },
        {
          "id": "experimental-components-card-features--with-menu",
          "code": "() => {\n  return (\n    <Card>\n      <Card.Icon icon={RepoIcon} />\n      <Card.Heading>primer/react</Card.Heading>\n      <Card.Description>\n        {\n          \"GitHub's design system implemented as React components for building consistent user interfaces.\"\n        }\n      </Card.Description>\n      <Card.Action>\n        <ActionMenu>\n          <ActionMenu.Anchor>\n            <IconButton\n              icon={KebabHorizontalIcon}\n              aria-label=\"More options for primer/react\"\n              variant=\"invisible\"\n            />\n          </ActionMenu.Anchor>\n          <ActionMenu.Overlay>\n            <ActionList>\n              <ActionList.Item>Star</ActionList.Item>\n              <ActionList.Item>Watch</ActionList.Item>\n              <ActionList.Item>Fork</ActionList.Item>\n            </ActionList>\n          </ActionMenu.Overlay>\n        </ActionMenu>\n      </Card.Action>\n    </Card>\n  )\n}"
        },
        {
          "id": "experimental-components-card-features--standalone-section",
          "code": "() => (\n  <Card as=\"section\">\n    <Card.Icon icon={RepoIcon} />\n    <Card.Heading>primer/react</Card.Heading>\n    <Card.Description>\n      {\n        'Standalone cards render as a labelled <section> landmark. aria-labelledby is automatically wired to Card.Heading.'\n      }\n    </Card.Description>\n  </Card>\n)"
        },
        {
          "id": "experimental-components-card-features--in-list",
          "code": "() => (\n  <ul className={classes.CardList} aria-label=\"Repositories\">\n    <li>\n      <Card>\n        <Card.Icon icon={RepoIcon} />\n        <Card.Description>primer/react</Card.Description>\n        <Card.Metadata>\n          <StarIcon size={16} />\n          1.2k stars\n        </Card.Metadata>\n      </Card>\n    </li>\n    <li>\n      <Card>\n        <Card.Icon icon={RepoIcon} />\n        <Card.Description>primer/css</Card.Description>\n        <Card.Metadata>\n          <StarIcon size={16} />\n          850 stars\n        </Card.Metadata>\n      </Card>\n    </li>\n    <li>\n      <Card>\n        <Card.Icon icon={RepoIcon} />\n        <Card.Description>primer/octicons</Card.Description>\n        <Card.Metadata>\n          <StarIcon size={16} />\n          2.1k stars\n        </Card.Metadata>\n      </Card>\n    </li>\n  </ul>\n)"
        },
        {
          "id": "experimental-components-card-features--interactive-content",
          "code": "() => {\n  const repos = [\n    {\n      name: 'primer/react',\n    },\n    {\n      name: 'primer/css',\n    },\n    {\n      name: 'primer/octicons',\n    },\n  ]\n  return (\n    <ul className={classes.CardList} aria-label=\"Repositories\">\n      {repos.map((repo) => (\n        <li key={repo.name}>\n          <Card>\n            <Card.Icon icon={RepoIcon} />\n            <Card.Description>{repo.name}</Card.Description>\n            <Card.Metadata>\n              <Button leadingVisual={StarIcon} size=\"small\">\n                Star <VisuallyHidden>{repo.name}</VisuallyHidden>\n              </Button>\n              <Button leadingVisual={RepoForkedIcon} size=\"small\">\n                Fork <VisuallyHidden>{repo.name}</VisuallyHidden>\n              </Button>\n            </Card.Metadata>\n          </Card>\n        </li>\n      ))}\n    </ul>\n  )\n}"
        }
      ],
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "required": true,
          "description": "The contents of the card. Provide either `Card.*` subcomponents (for example `Card.Heading`, `Card.Description`, `Card.Metadata`) or any custom content. A card with no children will not render."
        },
        {
          "name": "className",
          "type": "string",
          "description": "CSS class name(s) for custom styling."
        },
        {
          "name": "padding",
          "type": "'none' | 'condensed' | 'normal'",
          "defaultValue": "'normal'",
          "description": "Controls the internal padding of the Card."
        },
        {
          "name": "borderRadius",
          "type": "'medium' | 'large'",
          "defaultValue": "'large'",
          "description": "Controls the border radius of the Card."
        },
        {
          "name": "as",
          "type": "'div' | 'section'",
          "defaultValue": "'div'",
          "description": "The HTML element to render. Use `'section'` for **standalone** Cards (not inside a list of cards) so screen readers announce the Card as a labelled region. When `Card.Heading` is present, `aria-labelledby` is automatically wired. Use the default `'div'` when the Card is inside an `<li>` of a list of cards."
        }
      ],
      "subcomponents": [
        {
          "name": "Card.Icon",
          "props": [
            {
              "name": "icon",
              "type": "React.ElementType",
              "description": "An Octicon or custom SVG icon to render."
            },
            {
              "name": "aria-label",
              "type": "string",
              "description": "Accessible label for the icon. When omitted, the icon is treated as decorative."
            }
          ]
        },
        {
          "name": "Card.Image",
          "props": [
            {
              "name": "src",
              "type": "string",
              "description": "The image source URL."
            },
            {
              "name": "alt",
              "type": "string",
              "defaultValue": "\"\"",
              "description": "Alt text for accessibility. Defaults to empty string (decorative)."
            }
          ]
        },
        {
          "name": "Card.Heading",
          "props": [
            {
              "name": "as",
              "type": "'h2' | 'h3' | 'h4' | 'h5' | 'h6'",
              "defaultValue": "'h3'",
              "description": "The heading level to render. When the parent Card uses `as=\"section\"`, the heading's `id` is automatically wired to the section's `aria-labelledby`."
            }
          ]
        },
        {
          "name": "Card.Description",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "required": true,
              "description": "The descriptive text for the card. Rendered inside a `<p>` element so should be flowing text content."
            }
          ]
        },
        {
          "name": "Card.Action",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "required": true,
              "description": "Interactive control for the top-right corner of the card."
            }
          ]
        },
        {
          "name": "Card.Metadata",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "required": true,
              "description": "Metadata content for the bottom of the card. Accepts any content: plain text, icons, or other Primer components."
            }
          ]
        }
      ]
    },
    "checkbox": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Checkbox",
      "id": "checkbox",
      "name": "Checkbox",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-checkbox--default",
          "code": "() => (\n  <form>\n    <FormControl>\n      <Checkbox value=\"default\" />\n      <FormControl.Label>Default label</FormControl.Label>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-checkbox-features--with-leading-visual",
          "code": "() => {\n  return (\n    <form>\n      <FormControl>\n        <FormControl.LeadingVisual>\n          <MarkGithubIcon />\n        </FormControl.LeadingVisual>\n        <Checkbox value=\"default\" />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-checkbox-features--disabled",
          "code": "() => {\n  return (\n    <form>\n      <FormControl disabled>\n        <Checkbox value=\"default\" />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-checkbox-features--with-caption",
          "code": "() => {\n  return (\n    <form>\n      <FormControl>\n        <Checkbox value=\"default\" />\n        <FormControl.Label>Default label</FormControl.Label>\n        <FormControl.Caption>This is a caption</FormControl.Caption>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-checkbox-features--indeterminate",
          "code": "() => {\n  const [isIndeterminate, setIsIndeterminate] = useState(true)\n  return (\n    <form>\n      <FormControl>\n        <Checkbox\n          value=\"default\"\n          indeterminate={isIndeterminate}\n          onChange={() => {\n            setIsIndeterminate(!isIndeterminate)\n          }}\n          checked={false}\n        />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n    </form>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "checked",
          "type": "boolean",
          "defaultValue": "",
          "description": "Modifies true/false value of the native checkbox"
        },
        {
          "name": "defaultChecked",
          "type": "boolean",
          "defaultValue": "",
          "description": "Checks the input by default in uncontrolled mode"
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "",
          "description": "Modifies the native disabled state of the native checkbox"
        },
        {
          "name": "indeterminate",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Applies an [indeterminate state](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#attr-indeterminate) to the checkbox"
        },
        {
          "name": "onChange",
          "type": "(event: React.ChangeEvent) => void",
          "defaultValue": "",
          "description": "A callback function that is triggered when the checked state has been changed"
        },
        {
          "name": "validationStatus",
          "type": "'error' | 'success'",
          "defaultValue": "",
          "description": "Only used to inform ARIA attributes.\nIndividual checkboxes do not have validation styles."
        },
        {
          "name": "value",
          "type": "string",
          "defaultValue": "",
          "description": "A unique value that is never shown to the user.\nUsed during form submission and to identify which checkbox inputs are selected."
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLInputElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"input\""
        }
      ],
      "subcomponents": []
    },
    "checkbox_group": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/CheckboxGroup",
      "id": "checkbox_group",
      "name": "CheckboxGroup",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-checkboxgroup--default",
          "code": "() => (\n  <CheckboxGroup>\n    <CheckboxGroup.Label>Choices</CheckboxGroup.Label>\n    <FormControl required>\n      <Checkbox value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </CheckboxGroup>\n)"
        },
        {
          "id": "components-checkboxgroup-features--visually-hidden-label",
          "code": "() => (\n  <CheckboxGroup>\n    <CheckboxGroup.Label visuallyHidden>Choices</CheckboxGroup.Label>\n    <FormControl>\n      <Checkbox value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </CheckboxGroup>\n)"
        },
        {
          "id": "components-checkboxgroup-features--with-external-label",
          "code": "() => (\n  <>\n    <div id=\"choiceHeading\" className={classes.ExternalLabel}>\n      External label\n    </div>\n    <CheckboxGroup aria-labelledby=\"choiceHeading\">\n      <FormControl>\n        <Checkbox />\n        <FormControl.Label>Choice one</FormControl.Label>\n      </FormControl>\n      <FormControl>\n        <Checkbox />\n        <FormControl.Label>Choice two</FormControl.Label>\n      </FormControl>\n      <FormControl>\n        <Checkbox />\n        <FormControl.Label>Choice three</FormControl.Label>\n      </FormControl>\n    </CheckboxGroup>\n  </>\n)"
        },
        {
          "id": "components-checkboxgroup-features--error",
          "code": "() => (\n  <CheckboxGroup>\n    <CheckboxGroup.Label>Choices</CheckboxGroup.Label>\n    <FormControl>\n      <Checkbox value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n    <CheckboxGroup.Validation variant=\"error\">\n      Something went wrong\n    </CheckboxGroup.Validation>\n  </CheckboxGroup>\n)"
        },
        {
          "id": "components-checkboxgroup-features--success",
          "code": "() => (\n  <CheckboxGroup>\n    <CheckboxGroup.Label>Choices</CheckboxGroup.Label>\n    <FormControl>\n      <Checkbox value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n    <CheckboxGroup.Validation variant=\"success\">\n      Great job!\n    </CheckboxGroup.Validation>\n  </CheckboxGroup>\n)"
        },
        {
          "id": "components-checkboxgroup-features--caption",
          "code": "() => (\n  <CheckboxGroup>\n    <CheckboxGroup.Label>Choices</CheckboxGroup.Label>\n    <CheckboxGroup.Caption>Caption</CheckboxGroup.Caption>\n    <FormControl>\n      <Checkbox value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </CheckboxGroup>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-labelledby",
          "type": "string",
          "defaultValue": "",
          "description": "Used when associating the input group with a label other than CheckboxGroup.Label"
        },
        {
          "name": "children",
          "type": "CheckboxGroup.Label | CheckboxGroup.Caption | CheckboxGroup.Validation | FormControl",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the input group allows user input"
        },
        {
          "name": "id",
          "type": "string",
          "defaultValue": "a generated string",
          "description": "The unique identifier for this input group. Used to associate the label, validation text, and caption text.\nYou may want a custom ID to make it easier to select elements in integration tests."
        },
        {
          "name": "onChange",
          "type": "(selected: string[], e?: ChangeEvent<HTMLInputElement>) => void",
          "defaultValue": "",
          "description": "An onChange handler that gets called when the selection changes"
        },
        {
          "name": "required",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the user must make a selection before the owning form can be submitted"
        }
      ],
      "subcomponents": [
        {
          "name": "CheckboxGroup.Label",
          "props": [
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "defaultValue": "false",
              "description": "If true, the fieldset legend will be visually hidden"
            }
          ]
        },
        {
          "name": "CheckboxGroup.Caption",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The caption content"
            }
          ]
        },
        {
          "name": "CheckboxGroup.Validation",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The validation message"
            },
            {
              "name": "variant",
              "type": "'error' | 'success'",
              "defaultValue": "",
              "required": true,
              "description": "Changes the visual style to match the validation status"
            }
          ]
        }
      ]
    },
    "circle_badge": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/CircleBadge",
      "id": "circle_badge",
      "name": "CircleBadge",
      "status": "deprecated",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "deprecated-components-circlebadge--default",
          "code": "() => (\n  <CircleBadge>\n    <CircleBadge.Icon icon={ZapIcon} aria-label=\"User badge\" />\n  </CircleBadge>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "variant",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "'medium'",
          "description": "Creates a smaller or larger badge. Has no effect if the `size` prop is set"
        },
        {
          "name": "size",
          "type": "number",
          "defaultValue": "",
          "description": "Sets the size of the badge in pixels. Overrides the `variant` prop when set"
        },
        {
          "name": "inline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Styles the badge to `display: inline`"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"div\""
        }
      ],
      "subcomponents": [
        {
          "name": "CircleBadge.Icon",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "Octicon"
            }
          ],
          "passthrough": {
            "element": "Octicon",
            "url": "/Octicon"
          }
        }
      ]
    },
    "confirmationdialog": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ConfirmationDialog",
      "id": "confirmationdialog",
      "docsId": "confirmationdialog",
      "name": "ConfirmationDialog",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "importPath": "@primer/react",
      "stories": [
        {
          "id": "components-confirmationdialog--default",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <ConfirmationDialog\n          title=\"Delete universe?\"\n          onClose={onDialogClose}\n          confirmButtonContent=\"Delete it!\"\n          confirmButtonType=\"danger\"\n        >\n          Deleting the universe could have disastrous effects, including but not\n          limited to destroying all life on Earth.\n        </ConfirmationDialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-confirmationdialog-features--shorthand-hook",
          "code": "() => {\n  const confirm = useConfirm()\n  const onButtonClick = useCallback(\n    async (event: React.MouseEvent) => {\n      if (\n        (await confirm({\n          title: 'Are you sure?',\n          content: 'Do you really want to turn this button green?',\n        })) &&\n        event.target instanceof HTMLElement\n      ) {\n        event.target.style.color = 'var(--fgColor-success)'\n        event.target.textContent = \"I'm green!\"\n      }\n    },\n    [confirm],\n  )\n  return (\n    <div className={classes.ButtonContainer}>\n      <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n        Turn me green!\n      </Button>\n      <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n        Turn me green!\n      </Button>\n      <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n        Turn me green!\n      </Button>\n      <Button onClick={onButtonClick} className={classes.TurnGreenButton}>\n        Turn me green!\n      </Button>\n    </div>\n  )\n}"
        },
        {
          "id": "components-confirmationdialog-features--shorthand-hook-from-action-menu",
          "code": "() => {\n  const confirm = useConfirm()\n  const [text, setText] = useState('open me')\n  const onButtonClick = useCallback(async () => {\n    if (\n      await confirm({\n        title: 'Are you sure?',\n        content: 'Do you really want to do a trick?',\n      })\n    ) {\n      setText('tada!')\n    }\n  }, [confirm])\n  return (\n    <div className={classes.ButtonContainer}>\n      <ActionMenu>\n        <ActionMenu.Button>{text}</ActionMenu.Button>\n        <ActionMenu.Overlay>\n          <ActionList>\n            <ActionList.Item onSelect={onButtonClick}>\n              Do a trick!\n            </ActionList.Item>\n          </ActionList>\n        </ActionMenu.Overlay>\n      </ActionMenu>\n    </div>\n  )\n}"
        },
        {
          "id": "components-confirmationdialog-features--loading-states",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [isConfirmLoading, setIsConfirmLoading] = useState(false)\n  const [isCancelLoading, setIsCancelLoading] = useState(false)\n  const handleConfirm = useCallback(() => {\n    setIsConfirmLoading(true)\n    // Simulate async operation\n    setTimeout(() => {\n      setIsConfirmLoading(false)\n      setIsOpen(false)\n    }, 2000)\n  }, [])\n  const handleCancel = useCallback(() => {\n    setIsCancelLoading(true)\n    // Simulate async operation\n    setTimeout(() => {\n      setIsCancelLoading(false)\n      setIsOpen(false)\n    }, 1500)\n  }, [])\n  const handleClose = useCallback(\n    (gesture: 'confirm' | 'close-button' | 'cancel' | 'escape') => {\n      if (gesture === 'confirm') {\n        handleConfirm()\n      } else if (gesture === 'cancel') {\n        handleCancel()\n      } else {\n        setIsOpen(false)\n      }\n    },\n    [handleConfirm, handleCancel],\n  )\n  return (\n    <div className={classes.ButtonContainer}>\n      <Button onClick={() => setIsOpen(true)}>Show Loading Dialog</Button>\n      {isOpen && (\n        <ConfirmationDialog\n          title=\"Delete this file?\"\n          confirmButtonType=\"danger\"\n          confirmButtonContent=\"Delete\"\n          confirmButtonLoading={isConfirmLoading}\n          cancelButtonLoading={isCancelLoading}\n          onClose={handleClose}\n        >\n          This action cannot be undone. The file will be permanently deleted\n          from your repository.\n        </ConfirmationDialog>\n      )}\n    </div>\n  )\n}"
        }
      ],
      "props": [
        {
          "name": "onClose",
          "type": "(gesture: 'confirm' | 'close-button' | 'cancel' | 'escape') => void",
          "required": true,
          "description": "This callback is invoked when a gesture to close the dialog is performed. The first argument indicates the gesture."
        },
        {
          "name": "title",
          "type": "React.ReactNode",
          "required": true,
          "description": "The title of the ConfirmationDialog. This is usually a brief question."
        },
        {
          "name": "cancelButtonContent",
          "type": "React.ReactNode",
          "defaultValue": "Cancel",
          "description": "The text to use for the cancel button."
        },
        {
          "name": "confirmButtonContent",
          "type": "React.ReactNode",
          "defaultValue": "OK",
          "description": "The text to use for the confirm button."
        },
        {
          "name": "confirmButtonType",
          "type": "'normal' | 'primary' | 'danger'",
          "defaultValue": "normal",
          "description": "The type of button to use for the confirm button."
        },
        {
          "name": "overrideButtonFocus",
          "type": "'confirm' | 'cancel'",
          "description": "The button that should be initially focused when the dialog is opened. By default, the initial button focus is the confirm button, unless the confirm button is dangerous, in which case the cancel button is focused. This prop should be used rarely, as it can allow dangerous actions to be taken accidentally."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Additional class names to apply to the dialog."
        },
        {
          "name": "width",
          "type": "'small' | 'medium' | 'large' | 'xlarge'",
          "defaultValue": "medium",
          "description": "The width of the dialog.\nsmall: 296px\nmedium: 320px\nlarge: 480px\nxlarge: 640px"
        },
        {
          "name": "height",
          "type": "'small' | 'large' | 'auto'",
          "description": "The height of the dialog.\nsmall: 480px\nlarge: 640px\nauto: variable based on contents"
        }
      ]
    },
    "counter_label": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/CounterLabel",
      "id": "counter_label",
      "name": "CounterLabel",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-counterlabel--default",
          "code": "() => <CounterLabel>12</CounterLabel>"
        },
        {
          "id": "components-counterlabel-features--primary-theme",
          "code": "() => <CounterLabel variant=\"primary\">12</CounterLabel>"
        },
        {
          "id": "components-counterlabel-features--secondary-theme",
          "code": "() => <CounterLabel variant=\"secondary\">12</CounterLabel>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "scheme",
          "type": "'primary' | 'secondary'",
          "defaultValue": "",
          "description": "Pass in 'primary' for a darker background and inverse text, or 'secondary' for a lighter background and primary text. Omitting the scheme prop renders the default counter scheme"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) for custom styling.",
          "defaultValue": ""
        }
      ],
      "subcomponents": []
    },
    "data_table": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/DataTable",
      "id": "data_table",
      "name": "DataTable",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "experimental-components-datatable--default",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-title",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-title-and-subtitle",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-sorting",
          "code": "() => {\n  const rows = Array.from(data).sort((a, b) => {\n    return b.updatedAt - a.updatedAt\n  })\n  return (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={rows}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n            sortBy: 'alphanumeric',\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            sortBy: 'datetime',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n        initialSortColumn=\"updatedAt\"\n        initialSortDirection=\"DESC\"\n      />\n    </Table.Container>\n  )\n}"
        },
        {
          "id": "experimental-components-datatable-features--with-actions",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Actions>\n      <IconButton\n        aria-label=\"Download\"\n        icon={DownloadIcon}\n        variant=\"invisible\"\n      />\n      <IconButton aria-label=\"Add row\" icon={PlusIcon} variant=\"invisible\" />\n    </Table.Actions>\n    <Table.Divider />\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-action",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Actions>\n      <Button>Action</Button>\n    </Table.Actions>\n    <Table.Divider />\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-row-action",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          id: 'actions',\n          header: () => <VisuallyHidden>Actions</VisuallyHidden>,\n          renderCell: (row) => {\n            return (\n              <IconButton\n                aria-label={`Download: ${row.name}`}\n                title={`Download: ${row.name}`}\n                icon={DownloadIcon}\n                variant=\"invisible\"\n                onClick={() => {\n                  action('Download')(row)\n                }}\n              />\n            )\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-row-actions",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          id: 'actions',\n          header: () => <VisuallyHidden>Actions</VisuallyHidden>,\n          renderCell: (row) => {\n            return (\n              <>\n                <IconButton\n                  aria-label={`Edit: ${row.name}`}\n                  title={`Edit: ${row.name}`}\n                  icon={PencilIcon}\n                  variant=\"invisible\"\n                  onClick={() => {\n                    action('Edit')(row)\n                  }}\n                />\n                <IconButton\n                  aria-label={`Delete: ${row.name}`}\n                  title={`Delete: ${row.name}`}\n                  icon={TrashIcon}\n                  variant=\"invisible\"\n                  onClick={() => {\n                    action('Delete')(row)\n                  }}\n                />\n              </>\n            )\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-row-action-menu",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          id: 'actions',\n          header: () => <VisuallyHidden>Actions</VisuallyHidden>,\n          renderCell: (row) => {\n            return (\n              <ActionMenu>\n                <ActionMenu.Anchor>\n                  <IconButton\n                    aria-label={`Actions: ${row.name}`}\n                    title={`Actions: ${row.name}`}\n                    icon={KebabHorizontalIcon}\n                    variant=\"invisible\"\n                  />\n                </ActionMenu.Anchor>\n                <ActionMenu.Overlay>\n                  <ActionList>\n                    <ActionList.Item\n                      onSelect={() => {\n                        action('Copy')(row)\n                      }}\n                    >\n                      Copy row\n                    </ActionList.Item>\n                    <ActionList.Item>Edit row</ActionList.Item>\n                    <ActionList.Item>Export row as CSV</ActionList.Item>\n                    <ActionList.Divider />\n                    <ActionList.Item variant=\"danger\">\n                      Delete row\n                    </ActionList.Item>\n                  </ActionList>\n                </ActionMenu.Overlay>\n              </ActionMenu>\n            )\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-custom-heading",
          "code": "() => (\n  <>\n    <Heading as=\"h2\" id=\"repositories\">\n      Security coverage\n    </Heading>\n    <p id=\"repositories-subtitle\">\n      Organization members can only see data for the most recently-updated\n      repositories. To see all repositories, talk to your organization\n      administrator about becoming a security manager.\n    </p>\n    <Table.Container>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={data}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n      />\n    </Table.Container>\n  </>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-no-content",
          "code": "() => {\n  const exampleEmptyData: Array<Repo> = []\n  return exampleEmptyData.length === 0 ? (\n    <Blankslate border>\n      <Blankslate.Visual>\n        <BookIcon size=\"medium\" />\n      </Blankslate.Visual>\n      <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n      <Blankslate.Description>\n        Use it to provide information when no dynamic content exists.\n      </Blankslate.Description>\n      <Blankslate.PrimaryAction href=\"#\">\n        Primary action\n      </Blankslate.PrimaryAction>\n      <Blankslate.SecondaryAction href=\"#\">\n        Secondary action link\n      </Blankslate.SecondaryAction>\n    </Blankslate>\n  ) : (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={exampleEmptyData}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n      />\n    </Table.Container>\n  )\n}"
        },
        {
          "id": "experimental-components-datatable-features--with-loading",
          "code": "() => {\n  const [loading] = React.useState(true)\n  return (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      {loading ? (\n        <Table.Skeleton\n          aria-labelledby=\"repositories\"\n          aria-describedby=\"repositories-subtitle\"\n          columns={columns}\n          rows={10}\n        />\n      ) : (\n        <DataTable\n          aria-labelledby=\"repositories\"\n          aria-describedby=\"repositories-subtitle\"\n          data={data}\n          columns={columns}\n        />\n      )}\n    </Table.Container>\n  )\n}"
        },
        {
          "id": "experimental-components-datatable-features--with-pagination",
          "code": "() => {\n  const pageSize = 10\n  const [pageIndex, setPageIndex] = React.useState(0)\n  const start = pageIndex * pageSize\n  const end = start + pageSize\n  const rows = repos.slice(start, end)\n  return (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={rows}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n      />\n      <Table.Pagination\n        aria-label=\"Pagination for Repositories\"\n        pageSize={pageSize}\n        totalCount={repos.length}\n        onChange={({ pageIndex }) => {\n          setPageIndex(pageIndex)\n        }}\n      />\n    </Table.Container>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "aria-describedby",
          "type": "string",
          "description": "Provide an id to an element which uniquely describes this table"
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "description": "Provide an id to an element which uniquely labels this table"
        },
        {
          "name": "data",
          "type": "Array<Data>",
          "description": "Provide a collection of the rows which will be rendered inside of the table"
        },
        {
          "name": "columns",
          "type": "Array<Column<Data>>",
          "description": "Provide the columns for the table and the fields in `data` to which they correspond"
        },
        {
          "name": "cellPadding",
          "type": "'condensed' | 'normal' | 'spacious'",
          "description": "Specify the amount of space that should be available around the contents of a cell"
        },
        {
          "name": "aria-describedby",
          "type": "string",
          "required": false,
          "description": "Provide an id to an element which uniquely describes this table",
          "defaultValue": ""
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "required": false,
          "description": "Provide an id to an element which uniquely labels this table",
          "defaultValue": ""
        },
        {
          "name": "initialSortColumn",
          "type": "string | number",
          "required": false,
          "description": "Provide the id or field of the column by which the table is sorted. When\nusing this `prop`, the input data must be sorted by this column in\nascending order",
          "defaultValue": ""
        },
        {
          "name": "initialSortDirection",
          "type": "'ASC' | 'DESC'",
          "required": false,
          "description": "Provide the sort direction that the table should be sorted by on the\ncurrently sorted column",
          "defaultValue": ""
        },
        {
          "name": "externalSorting",
          "type": "boolean",
          "required": false,
          "description": "Indicate whether the sorting of the table is managed externally. When `true`, the table will not sort the data internally when a column header is clicked. The `onToggleSort` callback will still be invoked when a column header is clicked.",
          "defaultValue": "false"
        },
        {
          "name": "onToggleSort",
          "type": "(columnId: ObjectPaths<Data> | string | number, direction: 'ASC' | 'DESC') => void",
          "required": false,
          "description": "Fires every time the user clicks a sortable column header. It reports the column id that is now sorted and the direction after the toggle (never 'NONE').",
          "defaultValue": ""
        }
      ],
      "subcomponents": [
        {
          "name": "Table",
          "props": [
            {
              "name": "aria-describedby",
              "type": "string",
              "description": "Provide an id to an element which uniquely describes this table"
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "Provide an id to an element which uniquely labels this table"
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "cellPadding",
              "type": "'condensed' | 'normal' | 'spacious'",
              "description": "Specify the amount of space that should be available around the contents of a cell"
            }
          ]
        },
        {
          "name": "Table.Head",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Actions",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Body",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Row",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Header",
          "props": [
            {
              "name": "align",
              "type": "'end' | 'start'",
              "required": false,
              "description": "The horizontal alignment of the cell's content",
              "defaultValue": ""
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Cell",
          "props": [
            {
              "name": "align",
              "type": "'end' | 'start'",
              "required": false,
              "description": "The horizontal alignment of the cell's content",
              "defaultValue": ""
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "scope",
              "type": "'row'",
              "description": "Provide the scope for a table cell, useful for defining a row header using `scope=\"row\"`"
            }
          ]
        },
        {
          "name": "Table.CellPlaceholder",
          "props": []
        },
        {
          "name": "Table.Container",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Divider",
          "props": []
        },
        {
          "name": "Table.Title",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "id",
              "type": "string",
              "required": true,
              "description": "Provide a unique id for the table subtitle. This should be used along with\n`aria-labelledby` on `DataTable`"
            }
          ]
        },
        {
          "name": "Table.Subtitle",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "id",
              "type": "string",
              "required": true,
              "description": "Provide a unique id for the table subtitle. This should be used along with\n`aria-describedby` on `DataTable`"
            }
          ]
        },
        {
          "name": "Table.Skeleton",
          "props": [
            {
              "name": "cellPadding",
              "type": "'condensed' | 'normal' | 'spacious'",
              "description": "Specify the amount of space that should be available around the contents of a cell",
              "defaultValue": "normal"
            },
            {
              "name": "columns",
              "required": true,
              "type": "Array<Column<Data>>"
            },
            {
              "name": "rows",
              "type": "number",
              "description": "Optionally specify the number of rows which should be included in the skeleton state of the component",
              "defaultValue": "10"
            }
          ]
        },
        {
          "name": "Table.Pagination",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "required": true,
              "description": "Defines a string value that labels the current element.\nProvide a label for the navigation landmark rendered by this component\n@see aria-labelledby."
            },
            {
              "name": "defaultPageIndex",
              "type": "string",
              "description": "Provide an optional index to specify the default selected page"
            },
            {
              "name": "id",
              "type": "string",
              "description": "Optionally provide an `id` that is placed on the navigation landmark\nrendered by this component"
            },
            {
              "name": "onChange",
              "type": "({ pageIndex }: { pageIndex: number }) => void",
              "description": "Optionally provide a handler that is called whenever the pagination state\nis updated"
            },
            {
              "name": "pageSize",
              "type": "number",
              "description": "Optionally specify the number of items within a page",
              "defaultValue": "25"
            },
            {
              "name": "totalCount",
              "type": "number",
              "required": true,
              "description": "Specify the total number of items within the collection"
            },
            {
              "name": "showPages",
              "type": "boolean | { narrow?: boolean; regular?: boolean; wide?: boolean; }",
              "required": false,
              "description": "Whether to show the page numbers",
              "defaultValue": "{narrow: false}"
            }
          ]
        },
        {
          "name": "Table.ErrorDialog",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "React.ReactNode",
              "description": "The content of the dialog. This is usually a message explaining the error."
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "'Error'",
              "description": "The title of the dialog. This is usually a short description of the error."
            },
            {
              "name": "onRetry",
              "type": "() => void",
              "description": "Event handler called when the user clicks the retry button."
            },
            {
              "name": "onDismiss",
              "type": "() => void",
              "description": "Event handler called when the dialog is dismissed."
            }
          ]
        },
        {
          "name": "Table.SortHeader",
          "props": [
            {
              "name": "direction",
              "type": "'ASC' | 'DESC' | 'NONE'",
              "required": true,
              "description": "Specify the sort direction for the TableHeader",
              "defaultValue": ""
            },
            {
              "name": "onToggleSort",
              "type": "() => void",
              "required": true,
              "description": "Provide a handler that is called when the sortable TableHeader is\ninteracted with via a click or keyboard interaction",
              "defaultValue": ""
            },
            {
              "name": "align",
              "type": "'end' | 'start'",
              "description": "The horizontal alignment of the cell's content",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "Column options",
          "props": [
            {
              "name": "align",
              "type": "'start' | 'end'",
              "description": "The horizontal alignment of the column's content"
            },
            {
              "name": "field",
              "type": "ObjectPaths<Data>",
              "description": "Optionally provide a field to render for this column. This may be the key of the object or a string that accesses nested objects through `.`. For example: `field: a.b.c`\nAlternatively, you may provide a `renderCell` for this column to render the field in a row"
            },
            {
              "name": "header",
              "type": "string | (() => React.ReactNode)",
              "required": true,
              "description": "Provide the name of the column. This will be rendered as a table header within the table itself"
            },
            {
              "name": "maxWidth",
              "type": "React.CSSProperties['maxWidth']",
              "description": "The maximum width the column can grow to"
            },
            {
              "name": "minWidth",
              "type": "React.CSSProperties['minWidth']",
              "description": "The minimum width the column can grow to"
            },
            {
              "name": "renderCell",
              "type": "(data: Data) => React.ReactNode",
              "description": "Provide a custom component or render prop to render the data for this column in a row"
            },
            {
              "name": "rowHeader",
              "type": "boolean",
              "description": "Specify if the value of this column for a row should be treated as a row header"
            },
            {
              "name": "sortBy",
              "type": "boolean | 'alphanumeric' | 'basic' | 'datetime' | (a: Data, b: Data) => number",
              "description": "Specify if the table should sort by this column and, if applicable, a specific sort strategy or custom sort strategy"
            },
            {
              "name": "width",
              "defaultValue": "'grow'",
              "type": "'grow' | 'growCollapse' | 'auto' | React.CSSProperties['width']",
              "description": "Controls the width of the column.\n\n- 'grow': Stretch to fill available space, and min width is the width of the widest cell in the column\n- 'growCollapse': Stretch to fill available space or shrink to fit in the available space. Allows the column to shrink smaller than the cell content's width.\n- 'auto': The column is the width of it’s widest cell. Not intended for use with columns who’s content length varies a lot because a layout shift will occur when the content changes\n- explicit width: Will be exactly that width and will not grow or shrink to fill the parent"
            }
          ]
        }
      ]
    },
    "details": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Details",
      "id": "details",
      "name": "Details",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-details--default",
          "code": "() => {\n  const { getDetailsProps } = useDetails({\n    closeOnOutsideClick: true,\n  })\n  return (\n    <Details {...getDetailsProps()}>\n      <Details.Summary as={Button}>See Details</Details.Summary>\n      This is some content\n    </Details>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [],
      "subcomponents": [
        {
          "name": "Details.Summary",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType<React.PropsWithChildren<any>>",
              "defaultValue": "summary",
              "required": false,
              "description": "HTML element to render summary as."
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        }
      ]
    },
    "dialog_v2": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Dialog",
      "id": "dialog_v2",
      "docsId": "dialog",
      "name": "Dialog",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-dialog--default",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [secondOpen, setSecondOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n  const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          footerButtons={[\n            {\n              buttonType: 'default',\n              content: 'Open Second Dialog',\n              onClick: openSecondDialog,\n            },\n            {\n              buttonType: 'danger',\n              content: 'Delete the universe',\n              onClick: onDialogClose,\n            },\n            {\n              buttonType: 'primary',\n              content: 'Proceed',\n              onClick: openSecondDialog,\n            },\n          ]}\n        >\n          {lipsum}\n          {secondOpen && (\n            <Dialog\n              title=\"Inner dialog!\"\n              onClose={onSecondDialogClose}\n              width=\"small\"\n            >\n              Hello world\n            </Dialog>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--with-custom-renderers",
          "code": "({ width, height, subtitle }: DialogStoryProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button onClick={() => setIsOpen(!isOpen)}>Show dialog</Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          subtitle={subtitle ? 'This is a subtitle!' : undefined}\n          width={width}\n          height={height}\n          renderHeader={CustomHeader}\n          renderBody={CustomBody}\n          renderFooter={CustomFooter}\n          onClose={onDialogClose}\n          footerButtons={[\n            {\n              buttonType: 'danger',\n              content: 'Delete the universe',\n              onClick: onDialogClose,\n            },\n            {\n              buttonType: 'primary',\n              content: 'Proceed',\n            },\n          ]}\n        >\n          {lipsum}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--stress-test",
          "code": "({ width, height, subtitle }: DialogStoryProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [secondOpen, setSecondOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n  const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n  const manyButtons = new Array(7).fill(undefined).map((_, i) => ({\n    content: `Button ${i}`,\n  }))\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"This dialog has a really long title. So long, in fact, that it should cause wrapping, going to multiple lines!.\"\n          subtitle={\n            subtitle\n              ? \"It's not a common scenario, sure, but what if the subtitle is generated from a really long value? Do we just break the dialog? Or do we handle it because we are pros?\"\n              : undefined\n          }\n          onClose={onDialogClose}\n          width={width}\n          height={height}\n          footerButtons={[\n            ...manyButtons,\n            {\n              buttonType: 'danger',\n              content: 'Delete the universe',\n              onClick: onDialogClose,\n            },\n            {\n              buttonType: 'primary',\n              content: 'Proceed',\n              onClick: openSecondDialog,\n            },\n          ]}\n          position={{\n            narrow: 'fullscreen',\n            regular: 'center',\n          }}\n        >\n          {lipsum}\n          {secondOpen && (\n            <Dialog\n              title=\"Inner dialog!\"\n              onClose={onSecondDialogClose}\n              width=\"small\"\n            >\n              Hello world\n            </Dialog>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--repro-multistep-dialog-with-conditional-footer",
          "code": "({ width, height }: DialogStoryProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const [step, setStep] = React.useState(1)\n  const [inputText, setInputText] = React.useState('')\n  const dialogRef = useRef<HTMLDivElement>(null)\n  const renderFooterConditionally = () => {\n    if (step === 1) return null\n    return (\n      <Dialog.Footer>\n        <Button variant=\"primary\">Submit</Button>\n      </Dialog.Footer>\n    )\n  }\n  React.useEffect(() => {\n    // focus the close button when the step changes\n    const focusTarget = dialogRef.current?.querySelector(\n      'button[aria-label=\"Close\"]',\n    ) as HTMLButtonElement\n    if (step === 2) {\n      focusTarget.focus()\n    }\n  }, [step])\n  return (\n    <>\n      <Button onClick={() => setIsOpen(!isOpen)}>Show dialog</Button>\n      {isOpen && (\n        <Dialog\n          title={`Step ${step}`}\n          width={width}\n          height={height}\n          renderFooter={renderFooterConditionally}\n          onClose={onDialogClose}\n          footerButtons={[\n            {\n              buttonType: 'primary',\n              content: 'Proceed',\n            },\n          ]}\n          ref={dialogRef}\n        >\n          {step === 1 ? (\n            <Stack gap=\"spacious\" direction=\"vertical\">\n              <Stack direction=\"horizontal\" justify=\"space-between\">\n                Bug Report <Button onClick={() => setStep(2)}>Choose</Button>\n              </Stack>\n              <Stack direction=\"horizontal\" justify=\"space-between\">\n                Feature request{' '}\n                <Button onClick={() => setStep(2)}>Choose</Button>\n              </Stack>\n            </Stack>\n          ) : (\n            <div>\n              <Stack gap=\"condensed\" direction=\"vertical\">\n                <label htmlFor=\"description\">Description</label>\n                <TextInput\n                  id=\"description\"\n                  placeholder=\"Write the description here\"\n                  value={inputText}\n                  onChange={(event) => setInputText(event.target.value)}\n                />\n              </Stack>\n            </div>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--bottom-sheet-narrow",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          position={{\n            narrow: 'bottom',\n            regular: 'center',\n          }}\n        >\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--full-screen-narrow",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          position={{\n            narrow: 'fullscreen',\n            regular: 'center',\n          }}\n        >\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--side-sheet",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog title=\"My Dialog\" onClose={onDialogClose} position=\"right\">\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--return-focus-ref",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const triggerRef = React.useRef<HTMLButtonElement>(null)\n  const triggerButton = (\n    <Button ref={triggerRef} variant=\"primary\" onClick={() => setIsOpen(true)}>\n      Show dialog\n    </Button>\n  )\n  if (!isOpen) return triggerButton\n  return (\n    <React.Suspense fallback={<Button>Show Dialog</Button>}>\n      {triggerButton}\n      <Dialog title=\"title\" onClose={onDialogClose} returnFocusRef={triggerRef}>\n        body\n      </Dialog>\n    </React.Suspense>\n  )\n}"
        },
        {
          "id": "components-dialog-features--new-issues",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const initialFocusRef = useRef(null)\n  return (\n    <>\n      <Button onClick={() => setIsOpen(true)}>Show dialog</Button>\n      {isOpen ? (\n        <Dialog\n          initialFocusRef={initialFocusRef}\n          onClose={onDialogClose}\n          title=\"New issue\"\n          renderBody={() => (\n            <ActionList>\n              <ActionList.LinkItem\n                ref={initialFocusRef}\n                href=\"https://github.com\"\n              >\n                Item 1\n              </ActionList.LinkItem>\n              <ActionList.LinkItem href=\"https://github.com\">\n                Link\n              </ActionList.LinkItem>\n            </ActionList>\n          )}\n        ></Dialog>\n      ) : null}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--retains-focus-trap-with-dynamic-content",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [secondOpen, setSecondOpen] = useState(false)\n  const [expandContent, setExpandContent] = useState(false)\n  const [changeBodyContent, setChangeBodyContent] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n  const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n  const renderFooterConditionally = () => {\n    if (!changeBodyContent) return null\n    return (\n      <Dialog.Footer>\n        <Button variant=\"primary\">Submit</Button>\n      </Dialog.Footer>\n    )\n  }\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          renderFooter={renderFooterConditionally}\n        >\n          <Button onClick={() => setExpandContent(!expandContent)}>\n            Click me to dynamically {expandContent ? 'remove' : 'render'}{' '}\n            content\n          </Button>\n          <Button onClick={() => setChangeBodyContent(!changeBodyContent)}>\n            Click me to {changeBodyContent ? 'remove' : 'add'} a footer\n          </Button>\n          <Button onClick={openSecondDialog}>\n            Click me to open a new dialog\n          </Button>\n          {expandContent && (\n            <Stack gap=\"normal\" direction=\"vertical\">\n              {lipsum}\n              <Button>Dialog Button Example 1</Button>\n              <Button>Dialog Button Example 2</Button>\n            </Stack>\n          )}\n          {secondOpen && (\n            <Dialog\n              title=\"Inner dialog!\"\n              onClose={onSecondDialogClose}\n              width=\"small\"\n            >\n              Hello world\n            </Dialog>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--align-top",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog title=\"My Dialog\" onClose={onDialogClose} align=\"top\">\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--align-bottom",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog title=\"My Dialog\" onClose={onDialogClose} align=\"bottom\">\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "title",
          "type": "React.ReactNode",
          "description": "Title of the Dialog. Also serves as the aria-label for this Dialog."
        },
        {
          "name": "subtitle",
          "type": "React.ReactNode",
          "description": "The Dialog's subtitle. Optional. Rendered below the title in smaller type with less contrast. Also serves as the aria-describedby for this Dialog."
        },
        {
          "name": "renderHeader",
          "type": "React.FunctionComponent<React.PropsWithChildren<DialogHeaderProps>>",
          "description": "Provide a custom renderer for the dialog header. This content is rendered directly into the dialog body area, full bleed from edge to edge, top to the start of the body element. Warning: using a custom renderer may violate Primer UX principles."
        },
        {
          "name": "renderBody",
          "type": "React.FunctionComponent<React.PropsWithChildren<DialogProps>>",
          "description": "Provide a custom render function for the dialog body. This content is rendered directly into the dialog body area, full bleed from edge to edge, header to footer. Warning: using a custom renderer may violate Primer UX principles."
        },
        {
          "name": "renderFooter",
          "type": "React.FunctionComponent<React.PropsWithChildren<DialogProps>>",
          "description": "Provide a custom render function for the dialog footer. This content is rendered directly into the dialog footer area, full bleed from edge to edge, end of the body element to bottom. Warning: using a custom renderer may violate Primer UX principles."
        },
        {
          "name": "footerButtons",
          "type": "DialogButtonProps[]",
          "description": "Specifies the buttons to be rendered in the Dialog footer."
        },
        {
          "name": "onClose",
          "type": "(gesture: 'close-button' | 'escape') => void",
          "description": "This method is invoked when a gesture to close the dialog is used (either an Escape key press or clicking the 'X' in the top-right corner). The gesture argument indicates the gesture that was used to close the dialog (either 'close-button' or 'escape')."
        },
        {
          "name": "role",
          "type": "'dialog' | 'alertdialog'",
          "description": "The ARIA role to assign to this dialog. See [dialog modal](https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal) and [alert dialog](https://www.w3.org/TR/wai-aria-practices-1.1/#alertdialog)"
        },
        {
          "name": "width",
          "type": "'small' | 'medium' | 'large' | 'xlarge' | string | number",
          "description": "The width of the dialog.\nsmall: 296px\nmedium: 320px\nlarge: 480px\nxlarge: 640px\n\nAlso accepts any valid CSS width value (e.g. '400px', '80rem') or a number, which is interpreted as a pixel width."
        },
        {
          "name": "height",
          "type": "'small' | 'large' | 'auto'",
          "description": "The height of the dialog.\nsmall: 296x480\nlarge: 480x640\nauto: variable based on contents"
        },
        {
          "name": "returnFocusRef",
          "type": "React.RefObject<HTMLElement>",
          "describedby": "Return focus to this element when the Dialog closes, instead of the element that had focus immediately before the Dialog opened"
        },
        {
          "name": "initialFocusRef",
          "type": "React.RefObject<HTMLElement>",
          "description": "Focus this element when the Dialog opens"
        },
        {
          "name": "position",
          "type": "'center' | 'left' | 'right' | { narrow: 'center' | 'left' | 'right' | 'bottom' | 'fullscreen', regular: 'center' | 'left' | 'right' | 'bottom' | 'fullscreen', wide: 'center' | 'left' | 'right' | 'bottom' | 'fullscreen' }",
          "required": false,
          "description": "The position of the dialog",
          "defaultValue": ""
        },
        {
          "name": "align",
          "type": "'top' | 'center' | 'bottom'",
          "required": false,
          "description": "The vertical alignment of the dialog. Only applies when position is 'center' (the default). 'top' positions the Dialog ~4rem from the top of the screen, 'center' (default) vertically centers the Dialog, 'bottom' positions the Dialog near the bottom of the screen.",
          "defaultValue": ""
        },
        {
          "name": "className",
          "type": "string | undefined",
          "defaultValue": "",
          "description": "CSS string"
        },
        {
          "name": "style",
          "type": "React.CSSProperties | undefined",
          "defaultValue": "",
          "description": "React CSS properties"
        }
      ],
      "subcomponents": [
        {
          "name": "Dialog.Body",
          "props": []
        },
        {
          "name": "Dialog.Buttons",
          "props": [
            {
              "name": "buttons",
              "type": "DialogButtonProps[] (see table below)",
              "required": true
            }
          ]
        },
        {
          "name": "Dialog.CloseButton",
          "props": [
            {
              "name": "onClose",
              "type": "() => void",
              "required": true,
              "description": "Callback for closing the Dialog",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "Dialog.Footer",
          "props": []
        },
        {
          "name": "Dialog.Header",
          "props": []
        },
        {
          "name": "Dialog.Title",
          "props": []
        },
        {
          "name": "DialogButtonProps",
          "props": [
            {
              "name": "buttonType",
              "type": "'default' | 'danger' | 'primary' | 'normal'",
              "description": "The variant of Button to use"
            },
            {
              "name": "content",
              "type": "React.ReactNode",
              "required": true,
              "description": "The Button's inner text"
            },
            {
              "name": "autoFocus",
              "type": "boolean",
              "description": "If true, and if this is the only button with autoFocus set to true, focus this button automatically when the dialog appears."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>",
              "description": " A reference to the rendered Button’s DOM node, used together with `autoFocus` for `focusTrap`’s `initialFocus`."
            }
          ]
        }
      ]
    },
    "feature_flags": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/FeatureFlags",
      "id": "feature_flags",
      "name": "FeatureFlags",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "flags",
          "type": "FeatureFlags",
          "required": true,
          "description": "Object where keys are feature flag names and values are boolean"
        }
      ],
      "subcomponents": []
    },
    "flash": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Flash",
      "id": "flash",
      "name": "Flash",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-flash--default",
          "code": "() => <Flash>Default</Flash>"
        },
        {
          "id": "components-flash-features--success",
          "code": "() => (\n  <Flash\n    variant=\"success\"\n    style={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\n    }}\n  >\n    <div className={classes.Visual}>\n      <CheckCircleIcon aria-label=\"Success\" />\n    </div>\n    <div className={classes.Message}>Success</div>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--danger",
          "code": "() => (\n  <Flash\n    variant=\"danger\"\n    style={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\n    }}\n  >\n    <div className={classes.Visual}>\n      <InfoIcon aria-label=\"Danger\" />\n    </div>\n    <div className={classes.Message}>Danger</div>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--warning",
          "code": "() => (\n  <Flash\n    variant=\"warning\"\n    style={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\n    }}\n  >\n    <div className={classes.Visual}>\n      <AlertIcon aria-label=\"Warning\" />\n    </div>\n    <div className={classes.Message}>Warning</div>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--full",
          "code": "() => (\n  <Flash\n    full\n    style={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\n    }}\n  >\n    <div className={classes.Visual}>\n      <InfoIcon aria-label=\"Info\" />\n    </div>\n    <div className={classes.Message}>Full</div>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--with-icon-and-action",
          "code": "() => (\n  <Flash className={classes.WithIconAndAction}>\n    <div className={classes.Visual}>\n      <InfoIcon aria-label=\"Info\" />\n    </div>\n    <div className={classes.Message}>\n      This is a flash message with an icon and an action.\n      <Link href=\"/\"> Learn more.</Link>\n    </div>\n    <div className={classes.ActionsResponsive}>\n      <Button>Join waitlist</Button>\n    </div>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--with-icon-action-dismiss",
          "code": "() => (\n  <Flash className={classes.WithIconActionDismiss}>\n    <div className={classes.Visual}>\n      <InfoIcon aria-label=\"Info\" />\n    </div>\n    <div className={classes.Message}>\n      This is a flash message with an icon and an action.\n      <Link href=\"/\"> Learn more.</Link>\n    </div>\n    <div className={classes.ActionsResponsive}>\n      <Button>Join waitlist</Button>\n    </div>\n    <div className={classes.Close}>\n      <IconButton variant=\"invisible\" icon={XIcon} aria-label=\"Dismiss\" />\n    </div>\n  </Flash>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "full",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Creates a full width Flash component"
        },
        {
          "name": "variant",
          "type": "'default' | 'success' | 'warning' | 'danger'",
          "defaultValue": "'default'",
          "description": "Sets the background color and border"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"div\""
        }
      ],
      "subcomponents": []
    },
    "form_control": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/FormControl",
      "id": "form_control",
      "name": "FormControl",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-formcontrol--default",
          "code": "() => (\n  <FormControl required={true}>\n    <FormControl.Label>Form Input Label</FormControl.Label>\n    <FormControl.Caption>This is a caption</FormControl.Caption>\n    <Checkbox />\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-complex-inputs",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens])\n  const onTokenRemove = (tokenId: string | number) => {\n    setTokens(\n      tokens.filter((token: { id: string | number }) => token.id !== tokenId),\n    )\n  }\n  return (\n    <div className={classes.GridContainer}>\n      <FormControl>\n        <FormControl.Label id=\"form-label\">\n          TextInputWithTokens\n        </FormControl.Label>\n        <TextInputWithTokens onTokenRemove={onTokenRemove} tokens={tokens} />\n      </FormControl>\n      <FormControl>\n        <FormControl.Label id=\"autocomplete-label\">\n          Autocomplete\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input block />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              aria-labelledby=\"autocomplete-label\"\n              items={[\n                {\n                  text: 'css',\n                  id: '0',\n                },\n                {\n                  text: 'css-in-js',\n                  id: '1',\n                },\n                {\n                  text: 'styled-system',\n                  id: '2',\n                },\n                {\n                  text: 'javascript',\n                  id: '3',\n                },\n                {\n                  text: 'typescript',\n                  id: '4',\n                },\n                {\n                  text: 'react',\n                  id: '5',\n                },\n                {\n                  text: 'design-systems',\n                  id: '6',\n                },\n              ]}\n              selectedItemIds={[]}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Select</FormControl.Label>\n        <Select>\n          <Select.Option value=\"figma\">Figma</Select.Option>\n          <Select.Option value=\"css\">Primer CSS</Select.Option>\n          <Select.Option value=\"prc\">Primer React components</Select.Option>\n          <Select.Option value=\"pvc\">Primer ViewComponents</Select.Option>\n        </Select>\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Textarea</FormControl.Label>\n        <Textarea />\n      </FormControl>\n    </div>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--with-custom-input",
          "code": "() => {\n  const [value, setValue] = React.useState('mona lisa')\n  const [validationResult, setValidationResult] = React.useState('')\n  const doesValueContainSpaces = (inputValue: string) => /\\s/g.test(inputValue)\n  const handleInputChange = (e: {\n    currentTarget: {\n      value: React.SetStateAction<string>\n    }\n  }) => {\n    setValue(e.currentTarget.value)\n  }\n  React.useEffect(() => {\n    if (doesValueContainSpaces(value)) {\n      // eslint-disable-next-line react-hooks/set-state-in-effect\n      setValidationResult('noSpaces')\n    } else if (value) {\n      setValidationResult('validName')\n    }\n  }, [value])\n  return (\n    <div className={classes.GridContainer}>\n      <FormControl>\n        <FormControl.Label htmlFor=\"custom-input\">\n          GitHub handle\n        </FormControl.Label>\n        <CustomTextInput\n          id=\"custom-input\"\n          aria-describedby=\"custom-input-validation custom-input-caption\"\n          aria-invalid={validationResult === 'noSpaces'}\n          onChange={handleInputChange}\n        />\n        {validationResult === 'noSpaces' && (\n          <FormControl.Validation id=\"custom-input-validation\" variant=\"error\">\n            GitHub handles cannot contain spaces\n          </FormControl.Validation>\n        )}\n        {validationResult === 'validName' && (\n          <FormControl.Validation\n            id=\"custom-input-validation\"\n            variant=\"success\"\n          >\n            Valid name\n          </FormControl.Validation>\n        )}\n        <FormControl.Caption id=\"custom-input-caption\">\n          With or without &quot;@&quot;. For example &quot;monalisa&quot; or\n          &quot;@monalisa&quot;\n        </FormControl.Caption>\n      </FormControl>\n\n      <CheckboxGroup>\n        <CheckboxGroup.Label>Checkboxes</CheckboxGroup.Label>\n        <FormControl layout=\"horizontal\">\n          <CustomCheckboxInput\n            id=\"custom-checkbox-one\"\n            aria-describedby=\"custom-checkbox-one-caption\"\n            value=\"checkOne\"\n          />\n          <FormControl.Label htmlFor=\"custom-checkbox-one\">\n            Checkbox one\n          </FormControl.Label>\n          <FormControl.Caption id=\"custom-checkbox-one-caption\">\n            Hint text for checkbox one\n          </FormControl.Caption>\n        </FormControl>\n        <FormControl layout=\"horizontal\">\n          <CustomCheckboxInput\n            id=\"custom-checkbox-two\"\n            aria-describedby=\"custom-checkbox-two-caption\"\n            value=\"checkTwo\"\n          />\n          <FormControl.Label htmlFor=\"custom-checkbox-two\">\n            Checkbox two\n          </FormControl.Label>\n          <FormControl.Caption id=\"custom-checkbox-two-caption\">\n            Hint text for checkbox two\n          </FormControl.Caption>\n        </FormControl>\n      </CheckboxGroup>\n    </div>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--with-checkbox-and-radio-inputs",
          "code": "() => {\n  return (\n    <div className={classes.GapContainer}>\n      <CheckboxGroup>\n        <CheckboxGroup.Label>Checkboxes</CheckboxGroup.Label>\n        <FormControl>\n          <Checkbox value=\"checkOne\" />\n          <FormControl.Label>Checkbox one</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Checkbox value=\"checkTwo\" />\n          <FormControl.Label>Checkbox two</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Checkbox value=\"checkThree\" />\n          <FormControl.Label>Checkbox three</FormControl.Label>\n        </FormControl>\n      </CheckboxGroup>\n\n      <RadioGroup name={''}>\n        <RadioGroup.Label>Radios</RadioGroup.Label>\n        <FormControl>\n          <Radio name=\"radioChoices\" value=\"radioOne\" />\n          <FormControl.Label>Radio one</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Radio name=\"radioChoices\" value=\"radioTwo\" />\n          <FormControl.Label>Radio two</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Radio name=\"radioChoices\" value=\"radioThree\" />\n          <FormControl.Label>Radio three</FormControl.Label>\n        </FormControl>\n      </RadioGroup>\n    </div>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--single-input",
          "code": "({\n  label = 'Input',\n  caption = '',\n  required = false,\n  disabled = false,\n}: ArgTypes) => (\n  <FormControl required={required} disabled={disabled}>\n    <FormControl.Label>{label}</FormControl.Label>\n    <TextInput />\n    {caption && <FormControl.Caption>{caption}</FormControl.Caption>}\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--validation-example",
          "code": "() => {\n  const [value, setValue] = React.useState('mona lisa')\n  const [validationResult, setValidationResult] = React.useState('')\n  const doesValueContainSpaces = (inputValue: string) => /\\s/g.test(inputValue)\n  const handleInputChange = (e: {\n    currentTarget: {\n      value: React.SetStateAction<string>\n    }\n  }) => {\n    setValue(e.currentTarget.value)\n  }\n  React.useEffect(() => {\n    if (doesValueContainSpaces(value)) {\n      // eslint-disable-next-line react-hooks/set-state-in-effect\n      setValidationResult('noSpaces')\n    } else if (value) {\n      setValidationResult('validName')\n    }\n  }, [value])\n  return (\n    <FormControl>\n      <FormControl.Label>GitHub handle</FormControl.Label>\n      <TextInput block value={value} onChange={handleInputChange} />\n      {validationResult === 'noSpaces' && (\n        <FormControl.Validation variant=\"error\">\n          GitHub handles cannot contain spaces\n        </FormControl.Validation>\n      )}\n      {validationResult === 'validName' && (\n        <FormControl.Validation variant=\"success\">\n          Valid name\n        </FormControl.Validation>\n      )}\n      <FormControl.Caption>\n        With or without &quot;@&quot;. For example &quot;monalisa&quot; or\n        &quot;@monalisa&quot;\n      </FormControl.Caption>\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--with-select-panel",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput[]>([\n    items[0],\n    items[1],\n  ])\n  const [filter, setFilter] = React.useState('')\n  const filteredItems = items.filter((item) =>\n    item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl required>\n      <FormControl.Label id=\"select_panel_label\">\n        Select Labels\n      </FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, id, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={`select_panel_label selectpanel_wrapper`}\n            id={id}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            <span id=\"selectpanel_wrapper\">{children ?? 'Select Labels'}</span>\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--with-leading-visual",
          "code": "() => (\n  <Stack gap=\"none\">\n    <FormControl>\n      <FormControl.Label>Option one</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n    </FormControl>\n\n    <FormControl>\n      <FormControl.Label>Option two</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n      <FormControl.Caption>This one has a caption</FormControl.Caption>\n    </FormControl>\n\n    <FormControl disabled>\n      <FormControl.Label>Option three</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n    </FormControl>\n\n    <FormControl disabled>\n      <FormControl.Label>Option four</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n      <FormControl.Caption>This one has a caption</FormControl.Caption>\n    </FormControl>\n  </Stack>\n)"
        },
        {
          "id": "components-formcontrol-features--disabled-inputs",
          "code": "() => (\n  <div className={classes.FlexColumnGapContainer}>\n    <FormControl disabled>\n      <FormControl.Label>Disabled checkbox</FormControl.Label>\n      <Checkbox />\n    </FormControl>\n    <FormControl disabled>\n      <FormControl.Label>Disabled input</FormControl.Label>\n      <TextInput />\n    </FormControl>\n    <FormControl disabled>\n      <FormControl.Label>Disabled select</FormControl.Label>\n      <Select>\n        <Select.Option value=\"figma\">Figma</Select.Option>\n        <Select.Option value=\"css\">Primer CSS</Select.Option>\n        <Select.Option value=\"prc\">Primer React components</Select.Option>\n        <Select.Option value=\"pvc\">Primer ViewComponents</Select.Option>\n      </Select>\n    </FormControl>\n  </div>\n)"
        },
        {
          "id": "components-formcontrol-features--custom-required",
          "code": "() => (\n  <div className={classes.FlexColumnGapContainer}>\n    <FormControl required={true}>\n      <FormControl.Label requiredText=\"(required)\">\n        Form Input Label\n      </FormControl.Label>\n      <FormControl.Caption>\n        This is a form field with a custom required indicator\n      </FormControl.Caption>\n      <TextInput />\n    </FormControl>\n\n    <Text className={classes.RequiredFieldsNote}>\n      Required fields are marked with an asterisk (*)\n    </Text>\n    <FormControl required={true}>\n      <FormControl.Label requiredIndicator={false}>\n        Form Input Label\n      </FormControl.Label>\n      <FormControl.Caption>\n        This is a form field with a required indicator that is hidden in the\n        accessibility tree\n      </FormControl.Caption>\n      <TextInput />\n    </FormControl>\n\n    <FormControl required={false}>\n      <FormControl.Label requiredText=\"(optional)\" requiredIndicator={false}>\n        Form Input Label\n      </FormControl.Label>\n      <FormControl.Caption>\n        This is a form field that is marked as optional, it is not required\n      </FormControl.Caption>\n      <TextInput />\n    </FormControl>\n  </div>\n)"
        },
        {
          "id": "components-formcontrol-features--with-caption",
          "code": "() => (\n  <FormControl>\n    <FormControl.Label>Example label</FormControl.Label>\n    <TextInput />\n    <FormControl.Caption>Example caption</FormControl.Caption>\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-caption-and-disabled",
          "code": "() => (\n  <FormControl disabled>\n    <FormControl.Label>Example label</FormControl.Label>\n    <TextInput />\n    <FormControl.Caption>Example caption</FormControl.Caption>\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-hidden-label",
          "code": "() => (\n  <FormControl>\n    <FormControl.Label visuallyHidden>Example label</FormControl.Label>\n    <TextInput />\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-required-indicator",
          "code": "() => (\n  <FormControl required>\n    <FormControl.Label requiredIndicator>Example label</FormControl.Label>\n    <TextInput />\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-success-validation",
          "code": "() => (\n  <FormControl required>\n    <FormControl.Label requiredIndicator>Example label</FormControl.Label>\n    <TextInput defaultValue=\"Input value\" />\n    <FormControl.Validation variant=\"success\">\n      Example success validation message\n    </FormControl.Validation>\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-error-validation",
          "code": "() => (\n  <FormControl required>\n    <FormControl.Label requiredIndicator>Example label</FormControl.Label>\n    <TextInput defaultValue=\"Input value\" />\n    <FormControl.Validation variant=\"error\">\n      Example error validation message\n    </FormControl.Validation>\n  </FormControl>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "FormControl.Label | FormControl.Caption | FormControl.Validation | Autocomplete | TextInput | TextInputWithTokens | Select",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the control allows user input"
        },
        {
          "name": "id",
          "type": "string",
          "defaultValue": "a generated string",
          "description": "The unique identifier for this control. Used to associate the label, validation text, and caption text"
        },
        {
          "name": "required",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the user must specify a value for the input before the owning form can be submitted"
        },
        {
          "name": "id",
          "type": "string",
          "description": "The unique identifier for this control. Used to associate the label, validation text, and caption text",
          "defaultValue": ""
        },
        {
          "name": "layout",
          "type": "'vertical' | 'horizontal'",
          "description": "The direction the content flows.\nVertical layout is used by default, and horizontal layout is used for checkbox and radio inputs.",
          "defaultValue": "vertical"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) for custom styling.",
          "defaultValue": ""
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        }
      ],
      "subcomponents": [
        {
          "name": "FormControl.Label",
          "props": [
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the label should be visually hidden"
            },
            {
              "name": "as",
              "type": "'label' | 'legend' | 'span'",
              "defaultValue": "'label'",
              "description": "The label element can be changed to a 'legend' when it's being used to label a fieldset, or a 'span' when it's being used to label an element that is not a form input. For example: when using a FormControl to render a labeled SegementedControl, the label should be a 'span'"
            },
            {
              "name": "requiredText",
              "type": "string",
              "defaultValue": "'*'",
              "description": "The text to display when the field is required"
            },
            {
              "name": "requiredIndicator",
              "type": "boolean",
              "defaultValue": "true",
              "description": "Whether to show or hide the required text in the accessibility tree, the required text is still shown visually."
            },
            {
              "name": "htmlFor",
              "type": "string",
              "description": "This prop may be used to override the `htmlFor` set from FormControl's React Context.\nThe unique identifier for the associated input",
              "defaultValue": ""
            },
            {
              "name": "id",
              "type": "string",
              "description": "When `as` prop is 'label', it may be used to override the `htmlFor` given to the `<label>` element by FormControl's React Context.\nWhen 'as' prop is 'legend' or 'span', it is used as the `id` for the element."
            },
            {
              "name": "className",
              "type": "string",
              "description": "Class name(s) for custom styling.",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "FormControl.Caption",
          "props": [
            {
              "name": "id",
              "type": "string",
              "description": "Custom ID to override the ID set by FormControl's React Context",
              "defaultValue": ""
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The content (usually just text) that is rendered to give contextual info about the field"
            }
          ]
        },
        {
          "name": "FormControl.Validation",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The content (usually just text) that is rendered to give contextual info about the validation result for the field"
            },
            {
              "name": "variant",
              "type": "'error' | 'success'",
              "defaultValue": "",
              "required": true,
              "description": "Changes the visual style to match the validation status"
            },
            {
              "name": "id",
              "type": "string",
              "description": "May be used to override the ID assigned by FormControl's React Context",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "FormControl.LeadingVisual",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The visual to render before the choice input's label"
            }
          ]
        }
      ]
    },
    "header": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Header",
      "id": "header",
      "name": "Header",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-header--default",
          "code": "() => (\n  <Header>\n    <Header.Item>\n      <Header.Link href=\"#\" className={classes.HeaderLink}>\n        <MarkGithubIcon className={classes.Icon} size={32} />\n        <span>GitHub</span>\n      </Header.Link>\n    </Header.Item>\n    <Header.Item full>Menu</Header.Item>\n    <Header.Item className={classes.AvatarContainer}>\n      <Avatar\n        src=\"https://github.com/octocat.png\"\n        size={20}\n        square\n        alt=\"@octocat\"\n      />\n    </Header.Item>\n  </Header>\n)"
        },
        {
          "id": "components-header-features--with-full-size-item",
          "code": "() => (\n  <Header>\n    <Header.Item>Item 1</Header.Item>\n    <Header.Item full>Item 2</Header.Item>\n    <Header.Item className={classes.LastItem}>Item 3</Header.Item>\n  </Header>\n)"
        },
        {
          "id": "components-header-features--with-links",
          "code": "() => (\n  <Header>\n    <Header.Item>\n      <Header.Link href=\"#\">About</Header.Link>\n    </Header.Item>\n    <Header.Item>\n      <Header.Link href=\"#\">Releases</Header.Link>\n    </Header.Item>\n    <Header.Item>\n      <Header.Link href=\"#\">Team</Header.Link>\n    </Header.Item>\n  </Header>\n)"
        },
        {
          "id": "components-header-features--with-many-items",
          "code": "() => (\n  <Header>\n    <Header.Item>\n      <Header.Link className={classes.Logo} href=\"#\">\n        <MarkGithubIcon className={classes.Icon} size={32} />\n        <span>GitHub</span>\n      </Header.Link>\n    </Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item className={classes.LastItem}>\n      <Avatar\n        src=\"https://github.com/octocat.png\"\n        size={20}\n        square\n        alt=\"@octocat\"\n      />\n    </Header.Item>\n  </Header>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [],
      "subcomponents": [
        {
          "name": "Header.Item",
          "props": [
            {
              "name": "full",
              "type": "string",
              "defaultValue": "",
              "description": "Stretches item to fill the available space"
            }
          ]
        },
        {
          "name": "Header.Link",
          "props": [
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "description": "URL to be used for the Link"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attributes"
          }
        }
      ]
    },
    "heading": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Heading",
      "id": "heading",
      "name": "Heading",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-heading--default",
          "code": "() => <Heading>Default H2 Heading</Heading>"
        },
        {
          "id": "components-heading-features--small",
          "code": "() => <Heading variant=\"small\">Small heading</Heading>"
        },
        {
          "id": "components-heading-features--medium",
          "code": "() => <Heading variant=\"medium\">Medium heading</Heading>"
        },
        {
          "id": "components-heading-features--large",
          "code": "() => <Heading variant=\"large\">Large heading</Heading>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"h2\""
        },
        {
          "name": "variant",
          "type": "'large' | 'medium' | 'small'"
        }
      ]
    },
    "hidden": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Hidden",
      "id": "hidden",
      "name": "Hidden",
      "status": "draft",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "experimental-components-hidden--default",
          "code": "() => (\n  <>\n    <Text>\n      The below content is visible when the viewport is regular or wide but\n      hidden when narrow:\n    </Text>\n    <Hidden when=\"narrow\">\n      This is the said content and it is visible when the viewport is regular or\n      wide but hidden when narrow\n    </Hidden>\n  </>\n)"
        },
        {
          "id": "experimental-components-hidden-features--hide-content",
          "code": "() => (\n  <div>\n    <Hidden when=\"narrow\">\n      {' '}\n      This value is shown in regular and wide viewports\n    </Hidden>\n    <Hidden when=\"regular\">\n      {' '}\n      This value is shown in narrow and wide viewports\n    </Hidden>\n    <Hidden when=\"wide\">\n      {' '}\n      This value is shown in narrow and regular viewports\n    </Hidden>\n  </div>\n)"
        },
        {
          "id": "experimental-components-hidden-features--render-content-responsively",
          "code": "() => (\n  <div>\n    <Hidden when=\"narrow\">\n      <Button variant=\"primary\">\n        I am visible when the viewport is regular or wide viewport\n      </Button>\n    </Hidden>\n\n    <Hidden when={['regular', 'wide']}>\n      <Button variant=\"primary\">\n        I am visible when the viewport is narrow\n      </Button>\n    </Hidden>\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "when",
          "type": "'narrow' | 'wide' | 'regular' | Array<'narrow' | 'regular' | 'wide'>",
          "defaultValue": "",
          "description": "In which viewport(s) the children are going to be hidden"
        }
      ],
      "subcomponents": []
    },
    "inline_message": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/InlineMessage",
      "id": "inline_message",
      "name": "InlineMessage",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "importPath": "@primer/react/experimental",
      "stories": [
        {
          "id": "experimental-components-inlinemessage--default",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"unavailable\">\n      An example inline message\n    </InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--critical",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"critical\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--success",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"success\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--unavailable",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"unavailable\">\n      An example inline message\n    </InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--warning",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"warning\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--multiline",
          "code": "() => {\n  return (\n    <div\n      style={{\n        maxWidth: '30ch',\n      }}\n    >\n      <InlineMessage variant=\"success\">\n        An example inline message that spans multiple lines\n      </InlineMessage>\n    </div>\n  )\n}"
        }
      ],
      "props": [
        {
          "name": "size",
          "description": "Specify the size of the inline message",
          "type": "'small' | 'medium'",
          "defaultValue": "'medium'",
          "required": false
        },
        {
          "name": "variant",
          "description": "Specify the type of the inline message",
          "type": "'critical' | 'success' | 'unvailable' | 'warning'",
          "required": true
        },
        {
          "name": "leadingVisual",
          "description": "A custom leading visual to display instead of the default variant icon.",
          "type": "React.ElementType | React.ReactNode",
          "required": false
        }
      ]
    },
    "KeybindingHint": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/KeybindingHint",
      "id": "KeybindingHint",
      "name": "KeybindingHint",
      "status": "draft",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "experimental-components-keybindinghint-features--on-emphasis",
          "code": "(args) => (\n  <div className={classes.EmphasisBackground}>\n    <KeybindingHint {...args} />\n  </div>\n)"
        },
        {
          "id": "experimental-components-keybindinghint-features--on-primary",
          "code": "(args) => (\n  <div className={classes.PrimaryBackground}>\n    <KeybindingHint {...args} />\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "keys",
          "type": "string",
          "description": "The keys involved in this keybinding."
        },
        {
          "name": "format",
          "type": "'condensed' | 'full'",
          "defaultValue": "'condensed'",
          "description": "Control the display format."
        },
        {
          "name": "variant",
          "type": "'normal' | 'onEmphasis'",
          "defaultValue": "'normal'",
          "description": "Set to `onEmphasis` for display on 'emphasis' colors."
        },
        {
          "name": "size",
          "type": "'small' | 'normal'",
          "defaultValue": "'normal'",
          "description": "Control the size of the hint."
        }
      ],
      "subcomponents": []
    },
    "label": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Label",
      "id": "label",
      "name": "Label",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-label--default",
          "code": "() => <Label>Default</Label>"
        },
        {
          "id": "components-label-features--primary",
          "code": "() => <Label variant=\"primary\">Primary</Label>"
        },
        {
          "id": "components-label-features--secondary",
          "code": "() => <Label variant=\"secondary\">Secondary</Label>"
        },
        {
          "id": "components-label-features--accent",
          "code": "() => <Label variant=\"accent\">Accent</Label>"
        },
        {
          "id": "components-label-features--success",
          "code": "() => <Label variant=\"success\">Success</Label>"
        },
        {
          "id": "components-label-features--attention",
          "code": "() => <Label variant=\"attention\">Attention</Label>"
        },
        {
          "id": "components-label-features--severe",
          "code": "() => <Label variant=\"severe\">Primary</Label>"
        },
        {
          "id": "components-label-features--danger",
          "code": "() => <Label variant=\"danger\">Danger</Label>"
        },
        {
          "id": "components-label-features--done",
          "code": "() => <Label variant=\"done\">Done</Label>"
        },
        {
          "id": "components-label-features--sponsors",
          "code": "() => <Label variant=\"sponsors\">Sponsors</Label>"
        },
        {
          "id": "components-label-features--size-large",
          "code": "() => <Label size=\"large\">Default</Label>"
        },
        {
          "id": "components-label-features--size-small",
          "code": "() => <Label size=\"small\">Default</Label>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "variant",
          "type": "| 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'attention' | 'severe' | 'danger' | 'done' | 'sponsors'",
          "defaultValue": "'default'",
          "description": "The color of the label"
        },
        {
          "name": "size",
          "type": "'small' | 'large'",
          "defaultValue": "'small'",
          "description": "How large the label is rendered"
        }
      ],
      "subcomponents": []
    },
    "label_group": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/LabelGroup",
      "id": "label_group",
      "name": "LabelGroup",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-labelgroup--default",
          "code": "() => (\n  <LabelGroup>\n    <Label>One</Label>\n    <Label>Two</Label>\n    <Label>Three</Label>\n    <Label>Four</Label>\n    <Label>Five</Label>\n    <Label>Six</Label>\n    <Label>Seven</Label>\n    <Label>Eight</Label>\n    <Label>Nine</Label>\n    <Label>Ten</Label>\n    <Label>Eleven</Label>\n    <Label>Twelve</Label>\n    <Label>Thirteen</Label>\n    <Label>Fourteen</Label>\n    <Label>Fifteen</Label>\n    <Label>Sixteen</Label>\n  </LabelGroup>\n)"
        },
        {
          "id": "components-labelgroup-features--truncate-auto",
          "code": "() => (\n  <ResizableContainer>\n    <LabelGroup visibleChildCount=\"auto\">\n      <Label>One</Label>\n      <Label>Two</Label>\n      <Label>Three</Label>\n      <Label>Four</Label>\n      <Label>Five</Label>\n      <Label>Six</Label>\n      <Label>Seven</Label>\n      <Label>Eight</Label>\n      <Label>Nine</Label>\n      <Label>Ten</Label>\n      <Label>Eleven</Label>\n      <Label>Twelve</Label>\n      <Label>Thirteen</Label>\n      <Label>Fourteen</Label>\n      <Label>Fifteen</Label>\n      <Label>Sixteen</Label>\n    </LabelGroup>\n  </ResizableContainer>\n)"
        },
        {
          "id": "components-labelgroup-features--truncate-auto-with-interactive-tokens",
          "code": "() => (\n  <ResizableContainer>\n    <LabelGroup visibleChildCount=\"auto\">\n      <Token as=\"button\" text=\"One\" />\n      <Token as=\"button\" text=\"Two\" />\n      <Token as=\"button\" text=\"Three\" />\n      <Token as=\"button\" text=\"Four\" />\n      <Token as=\"button\" text=\"Five\" />\n      <Token as=\"button\" text=\"Six\" />\n      <Token as=\"button\" text=\"Seven\" />\n      <Token as=\"button\" text=\"Eight\" />\n      <Token as=\"button\" text=\"Nine\" />\n      <Token as=\"button\" text=\"Ten\" />\n      <Token as=\"button\" text=\"Eleven\" />\n      <Token as=\"button\" text=\"Twelve\" />\n      <Token as=\"button\" text=\"Thirteen\" />\n      <Token as=\"button\" text=\"Fourteen\" />\n      <Token as=\"button\" text=\"Fifteen\" />\n      <Token as=\"button\" text=\"Sixteen\" />\n    </LabelGroup>\n  </ResizableContainer>\n)"
        },
        {
          "id": "components-labelgroup-features--truncate-after-five",
          "code": "() => (\n  <LabelGroup visibleChildCount={5}>\n    <Label>One</Label>\n    <Label>Two</Label>\n    <Label>Three</Label>\n    <Label>Four</Label>\n    <Label>Five</Label>\n    <Label>Six</Label>\n    <Label>Seven</Label>\n    <Label>Eight</Label>\n    <Label>Nine</Label>\n    <Label>Ten</Label>\n    <Label>Eleven</Label>\n    <Label>Twelve</Label>\n    <Label>Thirteen</Label>\n    <Label>Fourteen</Label>\n    <Label>Fifteen</Label>\n    <Label>Sixteen</Label>\n  </LabelGroup>\n)"
        },
        {
          "id": "components-labelgroup-features--truncate-auto-expand-inline",
          "code": "() => (\n  <ResizableContainer>\n    <LabelGroup visibleChildCount=\"auto\" overflowStyle=\"inline\">\n      <Label>One</Label>\n      <Label>Two</Label>\n      <Label>Three</Label>\n      <Label>Four</Label>\n      <Label>Five</Label>\n      <Label>Six</Label>\n      <Label>Seven</Label>\n      <Label>Eight</Label>\n      <Label>Nine</Label>\n      <Label>Ten</Label>\n      <Label>Eleven</Label>\n      <Label>Twelve</Label>\n      <Label>Thirteen</Label>\n      <Label>Fourteen</Label>\n      <Label>Fifteen</Label>\n      <Label>Sixteen</Label>\n    </LabelGroup>\n  </ResizableContainer>\n)"
        },
        {
          "id": "components-labelgroup-features--truncate-auto-expand-inline-with-interactive-tokens",
          "code": "() => (\n  <ResizableContainer>\n    <LabelGroup visibleChildCount=\"auto\" overflowStyle=\"inline\">\n      <Token as=\"button\" text=\"One\" />\n      <Token as=\"button\" text=\"Two\" />\n      <Token as=\"button\" text=\"Three\" />\n      <Token as=\"button\" text=\"Four\" />\n      <Token as=\"button\" text=\"Five\" />\n      <Token as=\"button\" text=\"Six\" />\n      <Token as=\"button\" text=\"Seven\" />\n      <Token as=\"button\" text=\"Eight\" />\n      <Token as=\"button\" text=\"Nine\" />\n      <Token as=\"button\" text=\"Ten\" />\n      <Token as=\"button\" text=\"Eleven\" />\n      <Token as=\"button\" text=\"Twelve\" />\n      <Token as=\"button\" text=\"Thirteen\" />\n      <Token as=\"button\" text=\"Fourteen\" />\n      <Token as=\"button\" text=\"Fifteen\" />\n      <Token as=\"button\" text=\"Sixteen\" />\n    </LabelGroup>\n  </ResizableContainer>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "overflowStyle",
          "description": "How hidden tokens should be shown. `'inline'` shows the hidden tokens after the visible tokens. `'overlay'` shows all tokens in an overlay that appears on top of the visible tokens.",
          "defaultValue": "",
          "type": "'inline' | 'overlay'"
        },
        {
          "name": "visibleChildCount",
          "description": "How many tokens to show. `'auto'` truncates the tokens to fit in the parent container. Passing a number will truncate after that number tokens. If this is undefined, tokens will never be truncated.",
          "defaultValue": "",
          "type": "'auto' | number"
        },
        {
          "name": "as",
          "description": "Customize the element type of the rendered container.",
          "defaultValue": "ul",
          "type": "React.ElementType"
        }
      ],
      "subcomponents": []
    },
    "link": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Link",
      "id": "link",
      "name": "Link",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-link--default",
          "code": "() => <Link href=\"#\">Links are great</Link>"
        },
        {
          "id": "components-link-features--muted",
          "code": "() => (\n  <Link href=\"#\" muted>\n    Link\n  </Link>\n)"
        },
        {
          "id": "components-link-features--inline",
          "code": "() => (\n  <div data-a11y-link-underlines=\"true\">\n    <Link inline={true} href=\"#\">\n      Link\n    </Link>\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "href",
          "type": "string",
          "defaultValue": "",
          "description": "URL to be used for the Link. (The `href` is passed to the underlying `<a>` element. If `as` is specified, the link behavior may need different props)."
        },
        {
          "name": "muted",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Uses a less prominent shade for Link color, and the default link shade on hover."
        },
        {
          "name": "inline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Set to true for links adjacent to text, underlining them for clear visibility and improved accessibility."
        },
        {
          "name": "underline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Use `inline` instead.",
          "deprecated": true
        },
        {
          "name": "hoverColor",
          "type": "string",
          "defaultValue": "",
          "description": "Color used when hovering over the link."
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLAnchorElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"a\""
        }
      ],
      "subcomponents": []
    },
    "nav_list": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/NavList",
      "id": "nav_list",
      "name": "NavList",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-navlist--default",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NavList.Item href=\"#\" aria-current=\"page\">\n          Item 1\n        </NavList.Item>\n        <NavList.Item href=\"#\">Item 2</NavList.Item>\n        <NavList.Item href=\"#\">Item 3</NavList.Item>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--expand-with-custom-items",
          "code": "() => {\n  const items: {\n    href: string\n    text: string\n    'aria-current'?: 'page'\n  }[] = [\n    {\n      href: '#',\n      text: 'Item 4',\n      'aria-current': 'page',\n    },\n    {\n      href: '#',\n      text: 'Item 5',\n    },\n    {\n      href: '#',\n      text: 'Item 6',\n    },\n    {\n      href: '#',\n      text: 'Item 7',\n    },\n    {\n      href: '#',\n      text: 'Item 8',\n    },\n    {\n      href: '#',\n      text: 'Item 9',\n    },\n  ]\n  const Item = ({\n    leadingVisual,\n    text,\n    trailingVisual,\n    ...rest\n  }: CustomItemProps) => {\n    return (\n      <NavList.Item key={text} onClick={() => {}} href=\"#\" {...rest}>\n        {leadingVisual ? (\n          <NavList.LeadingVisual>\n            <Octicon icon={leadingVisual} />\n          </NavList.LeadingVisual>\n        ) : null}\n        {text}\n\n        {trailingVisual ? (\n          <NavList.TrailingVisual>\n            {typeof trailingVisual === 'string' ? (\n              trailingVisual\n            ) : (\n              <Octicon icon={trailingVisual as React.ElementType} />\n            )}\n            <VisuallyHidden>results</VisuallyHidden>\n          </NavList.TrailingVisual>\n        ) : null}\n      </NavList.Item>\n    )\n  }\n  return (\n    <PageLayout>\n      <PageLayout.Pane position=\"start\">\n        <NavList>\n          <NavList.Item href=\"#\">Item 1</NavList.Item>\n          <NavList.Item href=\"#\">Item 2</NavList.Item>\n          <NavList.Item href=\"#\">Item 3</NavList.Item>\n          <NavList.GroupExpand\n            label=\"Show more\"\n            items={items}\n            renderItem={Item}\n          />\n        </NavList>\n      </PageLayout.Pane>\n      <PageLayout.Content></PageLayout.Content>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-navlist-features--expand-with-pages",
          "code": "() => {\n  const items = [\n    {\n      href: '#',\n      text: 'Item 4',\n    },\n    {\n      href: '#',\n      text: 'Item 5',\n    },\n    {\n      href: '#',\n      text: 'Item 6',\n    },\n    {\n      href: '#',\n      text: 'Item 7',\n    },\n    {\n      href: '#',\n      text: 'Item 8',\n    },\n    {\n      href: '#',\n      text: 'Item 9',\n    },\n  ]\n  return (\n    <PageLayout>\n      <PageLayout.Pane position=\"start\">\n        <NavList>\n          <NavList.Item href=\"#\" aria-current=\"page\">\n            Item 1\n          </NavList.Item>\n          <NavList.Item href=\"#\">Item 2</NavList.Item>\n          <NavList.Item href=\"#\">Item 3</NavList.Item>\n          <NavList.GroupExpand pages={2} label=\"Show more\" items={items} />\n        </NavList>\n      </PageLayout.Pane>\n      <PageLayout.Content></PageLayout.Content>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-navlist-features--group-with-expand-and-custom-items",
          "code": "() => {\n  const Item = ({\n    leadingVisual: LeadingVisual,\n    text,\n    trailingVisual: TrailingVisual,\n    ...rest\n  }: CustomItemProps) => {\n    return (\n      <NavList.Item onClick={() => {}} href=\"#\" {...rest} key={text}>\n        {LeadingVisual ? (\n          <NavList.LeadingVisual>\n            <LeadingVisual />\n          </NavList.LeadingVisual>\n        ) : null}\n        {text}\n\n        {TrailingVisual ? (\n          <NavList.TrailingVisual>\n            {typeof TrailingVisual === 'string' ? (\n              TrailingVisual\n            ) : (\n              <TrailingVisual />\n            )}\n            <VisuallyHidden>results</VisuallyHidden>\n          </NavList.TrailingVisual>\n        ) : null}\n      </NavList.Item>\n    )\n  }\n  const items = [\n    {\n      href: '#',\n      text: 'Commits',\n      leadingVisual: GitCommitIcon,\n      trailingVisual: '32k',\n    },\n    {\n      href: '#',\n      text: 'Packages',\n      leadingVisual: PackageIcon,\n      trailingVisual: '1k',\n    },\n    {\n      href: '#',\n      text: 'Wikis',\n      leadingVisual: BookIcon,\n      trailingVisual: '121',\n    },\n    {\n      href: '#',\n      text: 'Topics',\n      leadingVisual: MilestoneIcon,\n      trailingVisual: '12k',\n    },\n    {\n      href: '#',\n      text: 'Marketplace',\n      leadingVisual: TelescopeIcon,\n      trailingVisual: ArrowRightIcon,\n    },\n  ]\n  return (\n    <NavList>\n      <NavList.Group>\n        <NavList.Item aria-current=\"page\">\n          <NavList.LeadingVisual>\n            <CodeIcon />\n          </NavList.LeadingVisual>\n          Code\n          <NavList.TrailingVisual>3k</NavList.TrailingVisual>\n        </NavList.Item>\n        <NavList.Item>\n          <NavList.LeadingVisual>\n            <RepoIcon />\n          </NavList.LeadingVisual>\n          Repositories\n          <NavList.TrailingVisual>713</NavList.TrailingVisual>\n        </NavList.Item>\n        <NavList.Item>\n          <NavList.LeadingVisual>\n            <IssueOpenedIcon />\n          </NavList.LeadingVisual>\n          Issues\n          <NavList.TrailingVisual>6k</NavList.TrailingVisual>\n        </NavList.Item>\n        <NavList.Item>\n          <NavList.LeadingVisual>\n            <GitPullRequestIcon />\n          </NavList.LeadingVisual>\n          Pull requests\n          <NavList.TrailingVisual>4k</NavList.TrailingVisual>\n        </NavList.Item>\n        <NavList.Item>\n          <NavList.LeadingVisual>\n            <CommentDiscussionIcon />\n          </NavList.LeadingVisual>\n          Discussions\n          <NavList.TrailingVisual>236</NavList.TrailingVisual>\n        </NavList.Item>\n        <NavList.Item>\n          <NavList.LeadingVisual>\n            <PeopleIcon />\n          </NavList.LeadingVisual>\n          Users\n          <NavList.TrailingVisual>10k</NavList.TrailingVisual>\n        </NavList.Item>\n        <NavList.GroupExpand items={items} renderItem={Item} />\n      </NavList.Group>\n    </NavList>\n  )\n}"
        },
        {
          "id": "components-navlist-features--with-description",
          "code": "() => (\n  <NavList>\n    <NavList.Item href=\"#\" aria-current=\"page\">\n      <NavList.LeadingVisual>\n        <RepoIcon />\n      </NavList.LeadingVisual>\n      Main Repository\n      <NavList.Description>Primary project repository</NavList.Description>\n    </NavList.Item>\n    <NavList.Item href=\"#\">\n      <NavList.LeadingVisual>\n        <BookIcon />\n      </NavList.LeadingVisual>\n      Documentation\n      <NavList.Description>\n        User guides and API documentation\n      </NavList.Description>\n    </NavList.Item>\n    <NavList.Item href=\"#\">\n      <NavList.LeadingVisual>\n        <IssueOpenedIcon />\n      </NavList.LeadingVisual>\n      Bug Reports\n      <NavList.Description variant=\"block\">\n        Submit and track bug reports for the project. Include detailed steps to\n        reproduce, expected behavior, and system information.\n      </NavList.Description>\n    </NavList.Item>\n    <NavList.Item href=\"#\">\n      <NavList.LeadingVisual>\n        <PeopleIcon />\n      </NavList.LeadingVisual>\n      Community\n      <NavList.Description variant=\"block\">\n        Connect with other developers, share ideas, and collaborate on features\n        and improvements.\n      </NavList.Description>\n    </NavList.Item>\n    <NavList.Item href=\"#\">\n      <NavList.LeadingVisual>\n        <GitCommitIcon />\n      </NavList.LeadingVisual>\n      Recent Changes\n      <NavList.Description>Latest commits and releases</NavList.Description>\n    </NavList.Item>\n  </NavList>\n)"
        },
        {
          "id": "components-navlist-features--with-expand",
          "code": "() => {\n  const items = [\n    {\n      href: '#',\n      text: 'Item 4',\n    },\n    {\n      href: '#',\n      text: 'Item 5',\n    },\n    {\n      href: '#',\n      text: 'Item 6',\n    },\n    {\n      href: '#',\n      text: 'Item 7',\n    },\n    {\n      href: '#',\n      text: 'Item 8',\n    },\n    {\n      href: '#',\n      text: 'Item 9',\n    },\n  ]\n  return (\n    <PageLayout>\n      <PageLayout.Pane position=\"start\">\n        <NavList>\n          <NavList.Item href=\"#\" aria-current=\"page\">\n            Item 1\n          </NavList.Item>\n          <NavList.Item href=\"#\">Item 2</NavList.Item>\n          <NavList.Item href=\"#\">Item 3</NavList.Item>\n          <NavList.GroupExpand label=\"Show more\" items={items} />\n        </NavList>\n      </PageLayout.Pane>\n      <PageLayout.Content></PageLayout.Content>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-navlist-features--with-expand-and-icons",
          "code": "() => {\n  const items = [\n    {\n      href: '#',\n      text: 'Item 4',\n    },\n    {\n      href: '#',\n      text: 'Item 5',\n    },\n    {\n      href: '#',\n      text: 'Item 6',\n    },\n    {\n      href: '#',\n      text: 'Item 7',\n    },\n    {\n      href: '#',\n      text: 'Item 8',\n    },\n    {\n      href: '#',\n      text: 'Item 9',\n    },\n  ]\n  return (\n    <PageLayout>\n      <PageLayout.Pane position=\"start\">\n        <NavList>\n          <NavList.Item href=\"#\" aria-current=\"page\">\n            Item 1\n          </NavList.Item>\n          <NavList.Item href=\"#\">Item 2</NavList.Item>\n          <NavList.Item href=\"#\">Item 3</NavList.Item>\n          <NavList.GroupExpand label=\"Show more\" items={items} />\n        </NavList>\n      </PageLayout.Pane>\n      <PageLayout.Content></PageLayout.Content>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-navlist-features--with-group",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NavList.Group title=\"Group 1\">\n          <NavList.Item aria-current=\"true\" href=\"#\">\n            Item 1A\n          </NavList.Item>\n          <NavList.Item href=\"#\">Item 1B</NavList.Item>\n          <NavList.Item href=\"#\">Item 1C</NavList.Item>\n        </NavList.Group>\n        <NavList.Group title=\"Group 2\">\n          <NavList.Item href=\"#\">Item 2A</NavList.Item>\n          <NavList.Item href=\"#\">Item 2B</NavList.Item>\n          <NavList.Item href=\"#\">Item 2C</NavList.Item>\n        </NavList.Group>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--with-group-expand",
          "code": "() => {\n  const items1 = [\n    {\n      href: '#',\n      text: 'Item 1D',\n    },\n    {\n      href: '#',\n      text: 'Item 1E',\n      trailingAction: {\n        label: 'Some action',\n        icon: ArrowRightIcon,\n      },\n    },\n  ]\n  const items2 = [\n    {\n      href: '#',\n      text: 'Item 2D',\n      trailingVisual: BookIcon,\n    },\n    {\n      href: '#',\n      text: 'Item 2E',\n      trailingVisual: FileDirectoryIcon,\n    },\n  ]\n  return (\n    <PageLayout>\n      <PageLayout.Pane position=\"start\">\n        <NavList>\n          <NavList.Group title=\"Group 1\">\n            <NavList.Item aria-current=\"true\" href=\"#\">\n              Item 1A\n            </NavList.Item>\n            <NavList.Item href=\"#\">Item 1B</NavList.Item>\n            <NavList.Item href=\"#\">Item 1C</NavList.Item>\n            <NavList.GroupExpand label=\"More\" items={items1} />\n          </NavList.Group>\n          <NavList.Group title=\"Group 2\">\n            <NavList.Item href=\"#\">Item 2A</NavList.Item>\n            <NavList.Item href=\"#\">Item 2B</NavList.Item>\n            <NavList.Item href=\"#\">Item 2C</NavList.Item>\n            <NavList.GroupExpand label=\"Show\" items={items2} />\n          </NavList.Group>\n        </NavList>\n      </PageLayout.Pane>\n      <PageLayout.Content></PageLayout.Content>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-navlist-features--with-group-heading-links",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NavList.Group>\n          <NavList.GroupHeading>\n            <a href=\"#group-1\">Group 1</a>\n          </NavList.GroupHeading>\n          <NavList.Item aria-current=\"true\" href=\"#\">\n            Item 1A\n          </NavList.Item>\n          <NavList.Item href=\"#\">Item 1B</NavList.Item>\n          <NavList.Item href=\"#\">Item 1C</NavList.Item>\n        </NavList.Group>\n        <NavList.Group>\n          <NavList.GroupHeading>\n            <a href=\"#group-2\">Group 2</a>\n          </NavList.GroupHeading>\n          <NavList.Item href=\"#\">Item 2A</NavList.Item>\n          <NavList.Item href=\"#\">Item 2B</NavList.Item>\n          <NavList.Item href=\"#\">Item 2C</NavList.Item>\n        </NavList.Group>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--with-inactive-items",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NavList.Item href=\"#\" inactiveText=\"Unavailable due to an outage\">\n          Item 1\n        </NavList.Item>\n        <NavList.Item>\n          Item 2\n          <NavList.SubNav>\n            <NavList.Item href=\"#\" aria-current=\"page\">\n              Sub item 1\n            </NavList.Item>\n            <NavList.Item href=\"#\" inactiveText=\"Unavailable due to an outage\">\n              Sub item 2\n            </NavList.Item>\n          </NavList.SubNav>\n        </NavList.Item>\n        <NavList.Item href=\"#\">Item 3</NavList.Item>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--with-nested-sub-items",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NavList.Item defaultOpen={true} href=\"#\">\n          Item 1\n          <NavList.SubNav>\n            <NavList.Item href=\"#\">Sub item 1</NavList.Item>\n          </NavList.SubNav>\n        </NavList.Item>\n        <NavList.Item href=\"#\">\n          Item 2{/* NOTE: Don't nest SubNavs. For testing purposes only */}\n          <NavList.SubNav>\n            <NavList.Item href=\"#\">\n              Sub item 1\n              <NavList.SubNav>\n                <NavList.Item href=\"#\">\n                  Sub item 1.1\n                  <NavList.SubNav>\n                    <NavList.Item href=\"#\">Sub item 1.1.1</NavList.Item>\n                    <NavList.Item href=\"#\">\n                      Sub item 1.1.2\n                      <NavList.SubNav>\n                        <NavList.Item href=\"#\">Sub item 1.1.2.1</NavList.Item>\n                        <NavList.Item href=\"#\" aria-current=\"page\">\n                          Sub item 1.1.2.2\n                        </NavList.Item>\n                      </NavList.SubNav>\n                    </NavList.Item>\n                  </NavList.SubNav>\n                </NavList.Item>\n                <NavList.Item href=\"#\">Sub item 1.2</NavList.Item>\n              </NavList.SubNav>\n            </NavList.Item>\n            <NavList.Item href=\"#\">Sub item 2</NavList.Item>\n          </NavList.SubNav>\n        </NavList.Item>\n        <NavList.Item href=\"#\">Item 3</NavList.Item>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--with-next-js-link",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NextJSLikeLink href=\"#\">\n          <NavList.Item aria-current=\"page\">Item 1</NavList.Item>\n        </NextJSLikeLink>\n        <NextJSLikeLink href=\"#\">\n          <NavList.Item>Item 2</NavList.Item>\n        </NextJSLikeLink>\n        <NextJSLikeLink href=\"#\">\n          <NavList.Item>Item 3</NavList.Item>\n        </NextJSLikeLink>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--with-react-router-link",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NavList.Item as={ReactRouterLikeLink} to=\"#\" aria-current=\"page\">\n          Item 1\n        </NavList.Item>\n        <NavList.Item as={ReactRouterLikeLink} to=\"#\">\n          Item 2\n        </NavList.Item>\n        <NavList.Item as={ReactRouterLikeLink} to=\"#\">\n          Item 3\n        </NavList.Item>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--with-reloads",
          "code": "() => {\n  // eslint-disable-next-line ssr-friendly/no-dom-globals-in-react-fc\n  const location = window.location\n  const storyId = new URLSearchParams(location.search).get('id')\n  const urlBase = `${location.origin + location.pathname}?id=${storyId}`\n  const itemId = new URLSearchParams(location.search).get('itemId')\n  return (\n    <>\n      <PageLayout>\n        <PageLayout.Pane position=\"start\">\n          <NavList>\n            <NavList.Item\n              href={`${urlBase}&itemId=1`}\n              aria-current={itemId === '1' ? 'page' : 'false'}\n            >\n              Item 1\n            </NavList.Item>\n            <NavList.Item>\n              Item 2\n              <NavList.SubNav>\n                <NavList.Item\n                  href={`${urlBase}&itemId=2.1`}\n                  aria-current={itemId === '2.1' ? 'page' : 'false'}\n                >\n                  Sub item 2.1\n                </NavList.Item>\n                <NavList.Item\n                  href={`${urlBase}&itemId=2.2`}\n                  aria-current={itemId === '2.2' ? 'page' : 'false'}\n                >\n                  Sub item 2.2\n                </NavList.Item>\n              </NavList.SubNav>\n            </NavList.Item>\n            <NavList.Item>\n              Item 3\n              <NavList.SubNav>\n                <NavList.Item\n                  href={`${urlBase}&itemId=3.1`}\n                  aria-current={itemId === '3.1' ? 'page' : 'false'}\n                >\n                  Sub item 3.1\n                </NavList.Item>\n                <NavList.Item\n                  href={`${urlBase}&itemId=3.2`}\n                  aria-current={itemId === '3.2' ? 'page' : 'false'}\n                >\n                  Sub item 3.2\n                </NavList.Item>\n              </NavList.SubNav>\n            </NavList.Item>\n          </NavList>\n        </PageLayout.Pane>\n        <PageLayout.Content></PageLayout.Content>\n      </PageLayout>\n    </>\n  )\n}"
        },
        {
          "id": "components-navlist-features--with-sub-items",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Pane position=\"start\">\n      <NavList>\n        <NavList.Item href=\"#\">Item 1</NavList.Item>\n        <NavList.Item>\n          Item 2\n          <NavList.SubNav>\n            <NavList.Item href=\"#\" aria-current=\"page\">\n              Sub item 1\n            </NavList.Item>\n            <NavList.Item href=\"#\">Sub item 2</NavList.Item>\n          </NavList.SubNav>\n        </NavList.Item>\n        <NavList.Item href=\"#\">Item 3</NavList.Item>\n      </NavList>\n    </PageLayout.Pane>\n    <PageLayout.Content></PageLayout.Content>\n  </PageLayout>\n)"
        },
        {
          "id": "components-navlist-features--with-trailing-action",
          "code": "() => {\n  return (\n    <PageLayout>\n      <PageLayout.Pane position=\"start\">\n        <NavList>\n          <NavList.Item>\n            <NavList.LeadingVisual>\n              <FileDirectoryIcon />\n            </NavList.LeadingVisual>\n            Item 1\n            <NavList.TrailingAction\n              label=\"Expand sidebar\"\n              icon={ArrowLeftIcon}\n            />\n          </NavList.Item>\n          <NavList.Item>\n            Item 2\n            <NavList.TrailingAction\n              as=\"a\"\n              href=\"#\"\n              label=\"Some action\"\n              icon={ArrowRightIcon}\n            />\n          </NavList.Item>\n        </NavList>\n      </PageLayout.Pane>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-navlist-features--with-trailing-action-in-sub-item",
          "code": "() => {\n  return (\n    <PageLayout>\n      <PageLayout.Pane position=\"start\">\n        <NavList>\n          <NavList.Item>\n            <NavList.LeadingVisual>\n              <FileDirectoryIcon />\n            </NavList.LeadingVisual>\n            Item 1\n            <NavList.TrailingAction\n              label=\"Expand sidebar\"\n              icon={ArrowLeftIcon}\n            />\n          </NavList.Item>\n          <NavList.Item>\n            Item 2\n            <NavList.TrailingAction\n              as=\"a\"\n              href=\"#\"\n              label=\"Some action\"\n              icon={ArrowRightIcon}\n            />\n          </NavList.Item>\n          <NavList.Item>\n            Item 3\n            <NavList.SubNav>\n              <NavList.Item href=\"#\">\n                Sub item 1\n                <NavList.TrailingAction\n                  label=\"Another action\"\n                  icon={BookIcon}\n                />\n              </NavList.Item>\n            </NavList.SubNav>\n          </NavList.Item>\n        </NavList>\n      </PageLayout.Pane>\n    </PageLayout>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"nav\""
        }
      ],
      "subcomponents": [
        {
          "name": "NavList.Item",
          "props": [
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "description": "The URL that the item navigates to. `href` is passed to the underlying `<a>` element. If `as` is specified, the component may need different props. If the item contains a sub-nav, the item is rendered as a `<button>` and `href` is ignored."
            },
            {
              "name": "aria-current",
              "type": "| 'page' | 'step' | 'location' | 'date' | 'time' | true | false",
              "defaultValue": "false",
              "description": "Set `aria-current` to `\"page\"` to indicate that the item represents the current page. Set `aria-current` to `\"location\"` to indicate that the item represents the current location on a page. For more information about `aria-current`, see [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "description": "The open state of the item when it is initially rendered if the item has a SubNav."
            },
            {
              "name": "inactiveText",
              "type": "string",
              "description": "Text to explain why this item is currently inactive and cannot be activated.",
              "defaultValue": ""
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLAnchorElement>"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes"
          }
        },
        {
          "name": "NavList.Description",
          "props": [
            {
              "name": "variant",
              "type": "'inline' | 'block'",
              "defaultValue": "'inline'",
              "description": "`inline` descriptions are positioned beside primary text. `block` descriptions are positioned below primary text."
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the inline description should truncate the text on overflow."
            },
            {
              "name": "className",
              "type": "string",
              "description": "Custom CSS class name."
            },
            {
              "name": "style",
              "type": "React.CSSProperties",
              "description": "Custom CSS styles."
            }
          ]
        },
        {
          "name": "NavList.LeadingVisual",
          "props": [
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.TrailingVisual",
          "props": [
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.SubNav",
          "props": [
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.Group",
          "props": [
            {
              "name": "children",
              "type": "ReactNode",
              "required": true,
              "description": "A related set of NavList.Items",
              "defaultValue": ""
            },
            {
              "name": "title",
              "type": "string",
              "description": "The text that gets rendered as the group's heading. Alternatively, you can pass the `NavList.GroupHeading` component as a child of `NavList.Group`.\nIf both `title` and `NavList.GroupHeading` are passed, `NavList.GroupHeading` will be rendered as the heading."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.GroupHeading",
          "props": [
            {
              "name": "auxiliaryText",
              "type": "string",
              "required": false,
              "description": "Secondary text which provides additional information about a `Group`.",
              "defaultValue": ""
            },
            {
              "name": "variant",
              "type": "'subtle' | 'filled'",
              "required": false,
              "description": "Style variations. Usage is discretionary.\n\n- `\"filled\"` - Superimposed on a background, offset from nearby content\n- `\"subtle\"` - Relatively less offset from nearby content",
              "defaultValue": ""
            },
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "required": false,
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            },
            {
              "name": "as",
              "description": "Heading level for the group heading. Sets the semantic heading tag.",
              "required": false,
              "type": "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'",
              "defaultValue": "\"h3\""
            }
          ]
        },
        {
          "name": "NavList.Divider",
          "props": [
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.TrailingAction",
          "props": [
            {
              "name": "as",
              "type": "a | button",
              "defaultValue": "button",
              "required": false,
              "description": "HTML element to render as."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Accessible name for the control."
            },
            {
              "name": "icon",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Octicon to pass into IconButton. When this is not set, TrailingAction renders as a `Button` instead of an `IconButton`."
            },
            {
              "name": "href",
              "type": "string",
              "description": "href when the TrailingAction is rendered as a link."
            }
          ]
        },
        {
          "name": "NavList.GroupExpand",
          "props": [
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Accessible name for the control."
            },
            {
              "name": "pages",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "The total number of pages, used to calculate the number of items to show at a given time."
            },
            {
              "name": "items",
              "type": "Array<GroupItems>",
              "required": true,
              "description": "The NavList.Items to render in the group."
            },
            {
              "name": "renderItem",
              "type": "(item: {text: string}) => React.ReactNode",
              "required": false,
              "description": "A function that returns a ReactNode to render in the group. If this is not provided, the group will only render the items in the array."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>"
            }
          ]
        }
      ]
    },
    "octicon": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Octicon",
      "id": "octicon",
      "name": "Octicon",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-octicon--default",
          "code": "() => <Octicon icon={HeartFillIcon} aria-label=\"Like\" size={32} />"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Specifies the aria-label attribute, which is read verbatim by screen readers"
        },
        {
          "name": "icon",
          "type": "Component",
          "defaultValue": "",
          "description": "Checks the input by default in uncontrolled modeName of the [Octicon component](https://primer.style/octicons/) used in the"
        },
        {
          "name": "color",
          "type": "string",
          "defaultValue": "",
          "description": "Sets an override color for the Octicon. Compatible with colors from the [Primer color system](https://primer.style/primitives/colors).\""
        },
        {
          "name": "size",
          "type": "number",
          "defaultValue": "16",
          "description": "Sets the uniform `width` and `height` of the SVG element"
        },
        {
          "name": "verticalAlign",
          "type": "string",
          "defaultValue": "text-bottom",
          "description": "Sets the `vertical-align` CSS property"
        }
      ],
      "subcomponents": []
    },
    "overlay": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Overlay",
      "id": "overlay",
      "name": "Overlay",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "private-components-overlay--default",
          "code": "(args: Args) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const confirmButtonRef = useRef<HTMLButtonElement>(null)\n  const anchorRef = useRef<HTMLDivElement>(null)\n  const closeOverlay = () => setIsOpen(false)\n  const containerRef = useRef<HTMLDivElement>(null)\n  useFocusTrap({\n    containerRef,\n    disabled: !isOpen,\n  })\n  return (\n    <div ref={anchorRef}>\n      <Button\n        ref={buttonRef}\n        onClick={() => {\n          setIsOpen(!isOpen)\n        }}\n      >\n        Open overlay\n      </Button>\n      {isOpen || args.open ? (\n        <Overlay\n          initialFocusRef={confirmButtonRef}\n          returnFocusRef={buttonRef}\n          ignoreClickRefs={[buttonRef]}\n          onEscape={closeOverlay}\n          onClickOutside={closeOverlay}\n          width=\"large\"\n          anchorSide=\"inside-right\"\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-label=\"Sample overlay\"\n          ref={containerRef}\n        >\n          <div className={classes.FullHeightContent}>\n            <IconButton\n              aria-label=\"Close\"\n              onClick={closeOverlay}\n              icon={XIcon}\n              variant=\"invisible\"\n              className={classes.CloseButtonOverlay}\n            />\n            <Text>Look! an overlay</Text>\n          </div>\n        </Overlay>\n      ) : null}\n    </div>\n  )\n}"
        },
        {
          "id": "private-components-overlay-features--dialog-overlay",
          "code": "({ anchorSide, role, open }: Args) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const confirmButtonRef = useRef<HTMLButtonElement>(null)\n  const anchorRef = useRef<HTMLDivElement>(null)\n  const closeOverlay = () => setIsOpen(false)\n  useFocusTrap({\n    containerRef,\n    disabled: !isOpen,\n    initialFocusRef: confirmButtonRef,\n    returnFocusRef: buttonRef,\n  })\n  return (\n    <div ref={anchorRef}>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        open overlay\n      </Button>\n      {isOpen || open ? (\n        <Overlay\n          initialFocusRef={confirmButtonRef}\n          returnFocusRef={buttonRef}\n          ignoreClickRefs={[buttonRef]}\n          onEscape={closeOverlay}\n          onClickOutside={closeOverlay}\n          width=\"small\"\n          anchorSide={anchorSide}\n          role={role}\n          aria-modal={role === 'dialog' ? 'true' : undefined}\n          aria-label={role === 'dialog' ? 'Confirmation screen' : undefined}\n          ref={containerRef}\n        >\n          <div className={classes.DialogContent}>\n            <Text>Are you sure?</Text>\n            <Button variant=\"danger\" onClick={closeOverlay}>\n              Cancel\n            </Button>\n            <Button onClick={closeOverlay} ref={confirmButtonRef}>\n              Confirm\n            </Button>\n          </div>\n        </Overlay>\n      ) : null}\n    </div>\n  )\n}"
        },
        {
          "id": "private-components-overlay-features--positioned-overlays",
          "code": "({ right, role, open }: Args) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [direction, setDirection] = useState<'left' | 'right'>(\n    right ? 'right' : 'left',\n  )\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const confirmButtonRef = useRef<HTMLButtonElement>(null)\n  const anchorRef = useRef<HTMLDivElement>(null)\n  const closeOverlay = () => setIsOpen(false)\n  const containerRef = useRef<HTMLDivElement>(null)\n  useFocusTrap({\n    containerRef,\n    disabled: !isOpen,\n  })\n  return (\n    <div ref={anchorRef}>\n      <Button\n        ref={buttonRef}\n        onClick={() => {\n          setIsOpen(!isOpen)\n          setDirection('left')\n        }}\n      >\n        Open left overlay\n      </Button>\n      <Button\n        ref={buttonRef}\n        onClick={() => {\n          setIsOpen(!isOpen)\n          setDirection('right')\n        }}\n        style={{\n          marginTop: '8px',\n        }}\n      >\n        Open right overlay\n      </Button>\n      {isOpen || open ? (\n        direction === 'left' ? (\n          <Overlay\n            initialFocusRef={confirmButtonRef}\n            returnFocusRef={buttonRef}\n            ignoreClickRefs={[buttonRef]}\n            onEscape={closeOverlay}\n            onClickOutside={closeOverlay}\n            width=\"auto\"\n            anchorSide=\"inside-right\"\n            role={role}\n            aria-modal={role === 'dialog' ? 'true' : undefined}\n            aria-label={role === 'dialog' ? 'Left aligned overlay' : undefined}\n            ref={containerRef}\n          >\n            <div className={classes.ResponsiveWidthContainer}>\n              <div className={classes.OverlayFullHeight}>\n                <IconButton\n                  aria-label=\"Close\"\n                  onClick={closeOverlay}\n                  icon={XIcon}\n                  variant=\"invisible\"\n                  className={classes.CloseButtonLeft}\n                />\n                <Text>Look! left aligned</Text>\n              </div>\n            </div>\n          </Overlay>\n        ) : (\n          <Overlay\n            initialFocusRef={confirmButtonRef}\n            returnFocusRef={buttonRef}\n            ignoreClickRefs={[buttonRef]}\n            onEscape={closeOverlay}\n            onClickOutside={closeOverlay}\n            width=\"auto\"\n            anchorSide={'inside-left'}\n            right={0}\n            position=\"fixed\"\n            role={role}\n            aria-modal={role === 'dialog' ? 'true' : undefined}\n            aria-label={role === 'dialog' ? 'Right aligned overlay' : undefined}\n            ref={containerRef}\n          >\n            <div className={classes.ResponsiveWidthContainer}>\n              <div className={classes.OverlayFullHeight}>\n                <IconButton\n                  aria-label=\"Close\"\n                  onClick={closeOverlay}\n                  icon={XIcon}\n                  variant=\"invisible\"\n                  className={classes.CloseButtonRight}\n                />\n                <Text>Look! right aligned</Text>\n              </div>\n            </div>\n          </Overlay>\n        )\n      ) : null}\n    </div>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "returnFocusRef",
          "type": "React.RefObject<HTMLElement>",
          "defaultValue": "",
          "required": true,
          "description": "Ref for the element to focus when the `Overlay` is closed."
        },
        {
          "name": "onClickOutside",
          "type": "function",
          "defaultValue": "",
          "required": true,
          "description": "Function to call when clicking outside of the `Overlay`. Typically this function sets the `Overlay` visibility state to `false`."
        },
        {
          "name": "onEscape",
          "type": "function",
          "defaultValue": "",
          "required": true,
          "description": "Function to call when user presses `Escape`. Typically this function sets the `Overlay` visibility state to `false`."
        },
        {
          "name": "ignoreClickRefs",
          "type": "React.RefObject<HTMLElement> []",
          "defaultValue": "",
          "description": "An array of ref objects to ignore clicks on in the onOutsideClick behavior. This is often used to ignore clicking on the element that toggles the open/closed state for the Overlay to prevent the Overlay from being toggled twice."
        },
        {
          "name": "initialFocusRef",
          "type": "React.RefObject<HTMLElement>",
          "defaultValue": "",
          "description": "Ref for the element to focus when the `Overlay` is opened. If nothing is provided, the first focusable element in the `Overlay` body is focused."
        },
        {
          "name": "width",
          "type": "| 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | 'auto'",
          "defaultValue": "'auto'",
          "description": "Sets the width of the `Overlay`, pick from our set list of widths, or pass `auto` to automatically set the width based on the content of the `Overlay`. `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `480px`, `xlarge` corresponds to `640px`, `xxlarge` corresponds to `960px`."
        },
        {
          "name": "height",
          "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'auto'",
          "defaultValue": "'auto'",
          "description": "Sets the height of the `Overlay`, pick from our set list of heights, or pass `auto` to automatically set the height based on the content of the `Overlay`. `xsmall` corresponds to `192px`, `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `432px`, `xlarge` corresponds to `600px`."
        },
        {
          "name": "maxHeight",
          "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge'",
          "defaultValue": "100vh",
          "description": "Sets the maximum height of the `Overlay`, pick from our set list of heights. `xsmall` corresponds to `192px`, `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `432px`, `xlarge` corresponds to `600px`."
        },
        {
          "name": "maxWidth",
          "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge'",
          "defaultValue": "",
          "description": "Sets the maximum width of the `Overlay`, pick from our set list of widths. `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `480px`, `xlarge` corresponds to `640px`, `xxlarge` corresponds to `960px`."
        },
        {
          "name": "visibility",
          "type": "| 'visible' | 'hidden'",
          "defaultValue": "'visible'",
          "description": "Sets the visibility of the `Overlay`."
        },
        {
          "name": "anchorSide",
          "type": "| 'inside-top' | 'inside-bottom' | 'inside-left' | 'inside-right' | 'inside-center' | 'outside-top' | 'outside-bottom' | 'outside-left' | 'outside-right'",
          "defaultValue": "",
          "description": "If provided, the Overlay will slide into position from the side of the anchor with a brief animation"
        },
        {
          "name": "top",
          "type": "number",
          "defaultValue": "0",
          "description": "The top CSS property of the Overlay — affects the vertical position."
        },
        {
          "name": "left",
          "type": "number",
          "defaultValue": "0",
          "description": "The left CSS property of the Overlay — affects the horizontal position."
        },
        {
          "name": "right",
          "type": "number",
          "description": "The right CSS property of the Overlay — affects the horizontal position."
        },
        {
          "name": "bottom",
          "type": "number",
          "description": "The bottom CSS property of the Overlay — affects the vertical position."
        },
        {
          "name": "position",
          "type": "| 'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'",
          "defaultValue": "absolute",
          "description": "The position CSS property of the Overlay — sets how the Overlay is positioned relative to its Portal"
        },
        {
          "name": "portalContainerName",
          "type": "string",
          "defaultValue": "",
          "description": "If defined, Overlays will be rendered in the named portal. See also `Portal`."
        },
        {
          "name": "overflow",
          "type": "'hidden' | 'scroll' | 'auto' | 'visible'",
          "required": false,
          "description": "",
          "defaultValue": "hidden"
        },
        {
          "name": "preventOverflow",
          "type": "boolean",
          "defaultValue": "true",
          "description": "Determines if the Overlay width should be adjusted responsively if `width` is set to either `auto`, `medium` or lower and there is not enough space to display the Overlay.\nIf `preventOverflow` is set to `false`, the Overlay will be displayed at the maximum width that fits within the viewport."
        },
        {
          "name": "role",
          "type": "ARIA role - will most often be 'dialog' or 'menu'",
          "required": false,
          "description": "ARIA role to use for the overlay",
          "defaultValue": ""
        },
        {
          "name": "data-test-id",
          "type": "unknown",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "responsiveVariant",
          "type": "'fullscreen'",
          "required": false,
          "description": "Optional prop to set responsive variant for narrow screen sizes",
          "defaultValue": ""
        }
      ],
      "subcomponents": []
    },
    "page_header": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/PageHeader",
      "id": "page_header",
      "name": "PageHeader",
      "status": "beta",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-pageheader-features--has-title-only",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--has-large-title",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea variant=\"large\">\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-leading-and-trailing-visuals",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.LeadingVisual>\n          <GitPullRequestIcon />\n        </PageHeader.LeadingVisual>\n        <PageHeader.Title>Title</PageHeader.Title>\n        <PageHeader.TrailingVisual>\n          <Label>Beta</Label>\n        </PageHeader.TrailingVisual>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-leading-visual-hidden-on-regular-viewport",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.LeadingVisual\n          hidden={{\n            regular: true,\n          }}\n        >\n          <GitPullRequestIcon />\n        </PageHeader.LeadingVisual>\n        <PageHeader.Title>Title</PageHeader.Title>\n        <PageHeader.TrailingVisual>\n          <Label>Beta</Label>\n        </PageHeader.TrailingVisual>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-actions",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Actions>\n        <IconButton aria-label=\"Workflows\" icon={WorkflowIcon} />\n        <IconButton aria-label=\"Insights\" icon={GraphIcon} />\n        <Button variant=\"primary\" trailingVisual={TriangleDownIcon}>\n          Add Item\n        </Button>\n        <IconButton aria-label=\"Settings\" icon={GearIcon} />\n      </PageHeader.Actions>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-description-slot",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Add-pageheader-docs\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>add-pageheader-docs</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Description>\n        <Text className={classes.DescriptionText}>\n          <Link\n            href=\"https://github.com/broccolinisoup\"\n            className={classes.BoldLink}\n          >\n            broccolinisoup\n          </Link>{' '}\n          created this branch 5 days ago · 14 commits · updated today\n        </Text>\n      </PageHeader.Description>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-navigation-slot",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Pull request title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Navigation>\n        <UnderlineNav aria-label=\"Pull Request\">\n          <UnderlineNav.Item\n            icon={CommentDiscussionIcon}\n            counter=\"12\"\n            aria-current=\"page\"\n          >\n            Conversation\n          </UnderlineNav.Item>\n          <UnderlineNav.Item counter={3} icon={GitCommitIcon}>\n            Commits\n          </UnderlineNav.Item>\n          <UnderlineNav.Item counter={7} icon={ChecklistIcon}>\n            Checks\n          </UnderlineNav.Item>\n          <UnderlineNav.Item counter={4} icon={FileDiffIcon}>\n            Files Changes\n          </UnderlineNav.Item>\n        </UnderlineNav>\n      </PageHeader.Navigation>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-custom-navigation",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Pull request title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Navigation as=\"nav\" aria-label=\"Item list\">\n        <ul className={classes.CustomNavigationList}>\n          <li>\n            <Link href=\"https://github.com/primer/react\" aria-current=\"page\">\n              Item 1\n            </Link>\n          </li>\n          <li>\n            <Link href=\"https://github.com/primer/react/pulls\">Item 2</Link>\n          </li>\n        </ul>\n      </PageHeader.Navigation>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-leading-and-trailing-actions",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.LeadingAction>\n        <IconButton\n          aria-label=\"Expand\"\n          icon={SidebarExpandIcon}\n          variant=\"invisible\"\n        />\n      </PageHeader.LeadingAction>\n      <PageHeader.TrailingAction>\n        <IconButton aria-label=\"Edit\" icon={PencilIcon} variant=\"invisible\" />\n      </PageHeader.TrailingAction>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-parent-link-and-actions-of-context-area",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.ContextArea>\n        <PageHeader.ParentLink href=\"http://github.com\">\n          Parent Link\n        </PageHeader.ParentLink>\n\n        <PageHeader.ContextAreaActions>\n          <Button size=\"small\" trailingAction={TriangleDownIcon}>\n            Add File\n          </Button>\n          <IconButton\n            size=\"small\"\n            aria-label=\"More Options\"\n            icon={KebabHorizontalIcon}\n          />\n        </PageHeader.ContextAreaActions>\n      </PageHeader.ContextArea>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-context-bar-and-actions-of-context-area",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.ContextArea>\n        <PageHeader.ContextBar>\n          <Breadcrumbs>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main\">\n              react\n            </Breadcrumbs.Item>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src\">\n              src\n            </Breadcrumbs.Item>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src/PageHeader\">\n              PageHeader\n            </Breadcrumbs.Item>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/blob/main/src/PageHeader/PageHeader.tsx\">\n              PageHeader.tsx\n            </Breadcrumbs.Item>\n          </Breadcrumbs>\n        </PageHeader.ContextBar>\n        <PageHeader.ContextAreaActions>\n          <Button size=\"small\" leadingVisual={GitBranchIcon}>\n            Main\n          </Button>\n          <IconButton\n            size=\"small\"\n            aria-label=\"More Options\"\n            icon={KebabHorizontalIcon}\n          />\n        </PageHeader.ContextAreaActions>\n      </PageHeader.ContextArea>\n    </PageHeader>\n  </div>\n)"
        },
        {
          "id": "components-pageheader-features--with-actions-that-have-responsive-content",
          "code": "() => (\n  <div className={classes.PaddingContainer}>\n    <PageHeader role=\"banner\" aria-label=\"Webhooks\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title as=\"h2\">Webhooks</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Actions>\n        <Hidden when={['narrow']}>\n          <Button variant=\"primary\">New webhook</Button>\n        </Hidden>\n        <Hidden when={['regular', 'wide']}>\n          <Button variant=\"primary\">New</Button>\n        </Hidden>\n      </PageHeader.Actions>\n    </PageHeader>\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string | undefined",
          "defaultValue": "",
          "description": "A unique label for the rendered landmark"
        },
        {
          "name": "className",
          "type": "string | undefined",
          "defaultValue": "",
          "description": "CSS string"
        },
        {
          "name": "hidden",
          "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
          "defaultValue": "false",
          "description": "Whether the content is hidden.\nThe component can be hidden for all viewport widths, or specified viewport widths.\nSome children have a default value for this prop:\n\n- `PageHeader.ContextArea`, `PageHeader.ContextAreaActions`, `PageHeader.ContextBar`, and `PageHeader.ParentLink` are hidden on regular and wide viewports by default.\n- - `PageHeader.LeadingAction`, and `PageHeader.TrailingAction` are hidden on narrow viewports by default."
        },
        {
          "name": "role",
          "type": "AriaRole",
          "description": "The ARIA role to assign to the top-level node of this component."
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"div\""
        },
        {
          "name": "hasBorder",
          "type": "boolean",
          "description": "Whether to render a border below the PageHeader. This border will NOT be rendered if the PageHeader has a `PageHeader.Navigation` child that is not hidden at the current breakpoint."
        }
      ],
      "subcomponents": [
        {
          "name": "PageHeader.ContextArea",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.ParentLink",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "A unique label for the rendered landmark"
            },
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "description": "The URL to link to."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "`{ narrow: false regular: true wide: true }`",
              "description": "Whether the parent link is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.ContextBar",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.ContextAreaActions",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.TitleArea",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            },
            {
              "name": "variant",
              "type": "| 'subtitle' | 'medium' | 'large' | { narrow?: | 'subtitle' | 'medium' | 'large' regular?: | 'subtitle' | 'medium' | 'large' wide?: | 'subtitle' | 'medium' | 'large' }",
              "defaultValue": "medium",
              "description": "Default title (medium) is the most common page title size. Use for static titles in most situations.\nLarge variant should be used for user-generated content such as issues, pull requests, or discussions.\nSubtitle variant can be used when a PageHeader.Title is already present in the page, such as in a SplitPageLayout."
            }
          ]
        },
        {
          "name": "PageHeader.LeadingAction",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.LeadingVisual",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.Title",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"h2\""
            }
          ]
        },
        {
          "name": "PageHeader.TrailingVisual",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.TrailingAction",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.Actions",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.Breadcrumbs",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.Description",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageHeader.Navigation",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "The aria-label attribute for the navigaton component when it is rendered as a \"nav\" element."
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "The aria-labelledby attribute for the navigaton component when it is rendered as a \"nav\" element."
            },
            {
              "name": "as",
              "type": "div | nav",
              "defaultValue": "\"div\"",
              "description": "The HTML element used to render the navigation."
            },
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        }
      ]
    },
    "page_layout": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/PageLayout",
      "id": "page_layout",
      "name": "PageLayout",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-pagelayout--default",
          "code": "(args) => (\n  <PageLayout\n    containerWidth={args.containerWidth}\n    padding={args.padding}\n    rowGap={args.rowGap}\n    columnGap={args.columnGap}\n  >\n    {args['Render header?'] ? (\n      <PageLayout.Header\n        padding={args['Header.padding']}\n        divider={{\n          narrow: args['Header.divider.narrow'],\n          regular: args['Header.divider.regular'],\n          wide: args['Header.divider.wide'],\n        }}\n        hidden={{\n          narrow: args['Header.hidden.narrow'],\n          regular: args['Header.hidden.regular'],\n          wide: args['Header.hidden.wide'],\n        }}\n      >\n        <Placeholder\n          height={args['Header placeholder height']}\n          label=\"Header\"\n        />\n      </PageLayout.Header>\n    ) : null}\n    <PageLayout.Content\n      width={args['Content.width']}\n      padding={args['Content.padding']}\n      hidden={{\n        narrow: args['Content.hidden.narrow'],\n        regular: args['Content.hidden.regular'],\n        wide: args['Content.hidden.wide'],\n      }}\n    >\n      <Placeholder\n        height={args['Content placeholder height']}\n        label=\"Content\"\n      />\n    </PageLayout.Content>\n    {args['Render pane?'] ? (\n      <PageLayout.Pane\n        position={{\n          narrow: args['Pane.position.narrow'],\n          regular: args['Pane.position.regular'],\n          wide: args['Pane.position.wide'],\n        }}\n        width={args['Pane.width']}\n        minWidth={args['Pane.minWidth']}\n        sticky={args['Pane.sticky']}\n        resizable={args['Pane.resizable']}\n        padding={args['Pane.padding']}\n        divider={{\n          narrow: args['Pane.divider.narrow'],\n          regular: args['Pane.divider.regular'],\n          wide: args['Pane.divider.wide'],\n        }}\n        hidden={{\n          narrow: args['Pane.hidden.narrow'],\n          regular: args['Pane.hidden.regular'],\n          wide: args['Pane.hidden.wide'],\n        }}\n      >\n        <Placeholder height={args['Pane placeholder height']} label=\"Pane\" />\n      </PageLayout.Pane>\n    ) : null}\n    {args['Render footer?'] ? (\n      <PageLayout.Footer\n        padding={args['Footer.padding']}\n        divider={{\n          narrow: args['Footer.divider.narrow'],\n          regular: args['Footer.divider.regular'],\n          wide: args['Footer.divider.wide'],\n        }}\n        hidden={{\n          narrow: args['Footer.hidden.narrow'],\n          regular: args['Footer.hidden.regular'],\n          wide: args['Footer.hidden.wide'],\n        }}\n      >\n        <Placeholder\n          height={args['Footer placeholder height']}\n          label=\"Footer\"\n        />\n      </PageLayout.Footer>\n    ) : null}\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--pull-request-page",
          "code": "() => (\n  <PageLayout>\n    <PageLayout.Header>\n      <div className={classes.HeaderStack}>\n        <div>\n          <Heading as=\"h1\" className={classes.TitleHeading}>\n            Input validation styles{' '}\n            <Text className={classes.TitleSubdued}>#1831</Text>\n          </Heading>\n          <div className={classes.StatusRow}>\n            <StateLabel status=\"pullOpened\">Open</StateLabel>\n            <Text className={classes.StatusMeta}>\n              <Link href=\"#\" muted className={classes.BoldMetaLink}>\n                mperrotti\n              </Link>{' '}\n              wants to merge 3 commits into{' '}\n              <BranchName href=\"#\">main</BranchName> from{' '}\n              <BranchName href=\"#\">mp/validation-styles</BranchName>\n            </Text>\n          </div>\n        </div>\n        <TabNav>\n          <TabNav.Link href=\"#\" selected>\n            Conversation\n          </TabNav.Link>\n          <TabNav.Link href=\"#\">Commits</TabNav.Link>\n          <TabNav.Link href=\"#\">Checks</TabNav.Link>\n          <TabNav.Link href=\"#\">Files changed</TabNav.Link>\n        </TabNav>\n      </div>\n    </PageLayout.Header>\n    <PageLayout.Content>\n      <div className={classes.ContentBox}></div>\n      <div className={classes.ScrollBox} tabIndex={0}>\n        This box has really long content. If it is too long, it will cause x\n        overflow and should show a scrollbar. When this overflows, it should not\n        break to overall page layout!\n      </div>\n    </PageLayout.Content>\n    <PageLayout.Pane aria-label=\"Side pane\">\n      <div className={classes.PaneStack}>\n        <div>\n          <Text className={classes.PaneSectionHeading}>Assignees</Text>\n          <Text className={classes.PaneMetaText}>\n            No one –{' '}\n            <Link href=\"#\" muted>\n              assign yourself\n            </Link>\n          </Text>\n        </div>\n        <div role=\"separator\" className={classes.PaneSeparator}></div>\n        <div>\n          <Text className={classes.PaneSectionHeading}>Labels</Text>\n          <Text className={classes.PaneMetaText}>None yet</Text>\n        </div>\n      </div>\n    </PageLayout.Pane>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--sticky-pane",
          "code": "(args) => (\n  <PageLayout\n    rowGap=\"none\"\n    columnGap=\"none\"\n    padding=\"none\"\n    containerWidth=\"full\"\n  >\n    <PageLayout.Header padding=\"normal\" divider=\"line\">\n      <Placeholder label=\"Header\" height={64} />\n    </PageLayout.Header>\n    <PageLayout.Content padding=\"normal\" width=\"large\">\n      <div className={classes.ContentGrid}>\n        {Array.from({\n          length: args.numParagraphsInContent,\n        }).map((_, i) => {\n          const testId = `content${i}`\n          return (\n            <p key={i} className={classes.Paragraph}>\n              <span data-testid={testId}>\n                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n                enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n                ante quam, at varius lorem molestie vel. Sed at eros consequat,\n                varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n                commodo. Phasellus at imperdiet risus. Donec sit amet massa\n                purus. Nunc sem lectus, bibendum a sapien nec, tristique tempus\n                felis. Ut porttitor auctor tellus in imperdiet. Ut blandit\n                tincidunt augue, quis fringilla nunc tincidunt sed. Vestibulum\n                auctor euismod nisi. Nullam tincidunt est in mi tincidunt\n                dictum. Sed consectetur aliquet velit ut ornare.\n              </span>\n            </p>\n          )\n        })}\n      </div>\n    </PageLayout.Content>\n    <PageLayout.Pane\n      position=\"start\"\n      resizable\n      padding=\"normal\"\n      divider=\"line\"\n      sticky={args.sticky}\n      aria-label=\"Side pane\"\n    >\n      <div className={classes.ContentGrid}>\n        {Array.from({\n          length: args.numParagraphsInPane,\n        }).map((_, i) => {\n          const testId = `paragraph${i}`\n          return (\n            <p key={i} className={classes.Paragraph}>\n              <span data-testid={testId}>\n                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n                enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n                ante quam, at varius lorem molestie vel. Sed at eros consequat,\n                varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n                commodo. Phasellus at imperdiet risus. Donec sit amet massa\n                purus.\n              </span>\n            </p>\n          )\n        })}\n        <p>\n          Donec sit amet massa purus.{' '}\n          <Link inline href=\"#foo\">\n            Plura de lorem Ispum.\n          </Link>\n        </p>\n      </div>\n    </PageLayout.Pane>\n    <PageLayout.Footer padding=\"normal\" divider=\"line\">\n      <Placeholder label=\"Footer\" height={64} />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--nested-scroll-container",
          "code": "(args) => (\n  <div className={classes.NestedScrollContainer}>\n    <Placeholder label=\"Above scroll container\" height={120} />\n    <div className={classes.OverflowAuto}>\n      <PageLayout\n        rowGap=\"none\"\n        columnGap=\"none\"\n        padding=\"none\"\n        containerWidth=\"full\"\n      >\n        <PageLayout.Header padding=\"normal\" divider=\"line\">\n          <Placeholder label=\"Header\" height={64} />\n        </PageLayout.Header>\n        <PageLayout.Content padding=\"normal\" width=\"large\">\n          <div\n            className={classes.ContentGrid}\n            tabIndex={0}\n            role=\"region\"\n            aria-label=\"Page content\"\n          >\n            {Array.from({\n              length: args.numParagraphsInContent,\n            }).map((_, i) => (\n              <p key={i} className={classes.Paragraph}>\n                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n                enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n                ante quam, at varius lorem molestie vel. Sed at eros consequat,\n                varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n                commodo. Phasellus at imperdiet risus. Donec sit amet massa\n                purus. Nunc sem lectus, bibendum a sapien nec, tristique tempus\n                felis. Ut porttitor auctor tellus in imperdiet. Ut blandit\n                tincidunt augue, quis fringilla nunc tincidunt sed. Vestibulum\n                auctor euismod nisi. Nullam tincidunt est in mi tincidunt\n                dictum. Sed consectetur aliquet velit ut ornare.\n              </p>\n            ))}\n          </div>\n        </PageLayout.Content>\n        <PageLayout.Pane\n          position=\"start\"\n          padding=\"normal\"\n          divider=\"line\"\n          sticky\n          aria-label=\"Side pane\"\n        >\n          <div className={classes.ContentGrid}>\n            {Array.from({\n              length: args.numParagraphsInPane,\n            }).map((_, i) => (\n              <p key={i} className={classes.Paragraph}>\n                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at\n                enim id lorem tempus egestas a non ipsum. Maecenas imperdiet\n                ante quam, at varius lorem molestie vel. Sed at eros consequat,\n                varius tellus et, auctor felis. Donec pulvinar lacinia urna nec\n                commodo. Phasellus at imperdiet risus. Donec sit amet massa\n                purus.\n              </p>\n            ))}\n          </div>\n        </PageLayout.Pane>\n        <PageLayout.Footer padding=\"normal\" divider=\"line\">\n          <Placeholder label=\"Footer\" height={64} />\n        </PageLayout.Footer>\n      </PageLayout>\n    </div>\n    <Placeholder label=\"Below scroll container\" height={120} />\n  </div>\n)"
        },
        {
          "id": "components-pagelayout-features--custom-sticky-header",
          "code": "(args) => (\n  // a box to create a sticky top element that will be on the consumer side and outside of the PageLayout component\n  <div data-testid=\"story-window\">\n    <header\n      data-testid=\"sticky-header\"\n      className={classes.StickyHeader}\n      style={{\n        height: args.offsetHeader,\n      }}\n    >\n      Custom sticky header\n    </header>\n    <PageLayout\n      rowGap=\"none\"\n      columnGap=\"none\"\n      padding=\"none\"\n      containerWidth=\"full\"\n    >\n      <PageLayout.Content padding=\"normal\" width=\"large\">\n        <div className={classes.ContentGrid} data-testid=\"scrollContainer\">\n          {Array.from({\n            length: args.numParagraphsInContent,\n          }).map((_, i) => {\n            const testId = `content${i}`\n            return (\n              <p key={i} className={classes.Paragraph}>\n                <span data-testid={testId}>\n                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin\n                  vitae orci et magna consectetur ullamcorper eget ac purus. Nam\n                  at enim id lorem tempus egestas a non ipsum. Maecenas\n                  imperdiet ante quam, at varius lorem molestie vel. Sed at eros\n                  consequat, varius tellus et, auctor felis. Donec pulvinar\n                  lacinia urna nec commodo. Phasellus at imperdiet risus. Donec\n                  sit amet massa purus. Nunc sem lectus, bibendum a sapien nec,\n                  tristique tempus felis. Ut porttitor auctor tellus in\n                  imperdiet. Ut blandit tincidunt augue, quis fringilla nunc\n                  tincidunt sed. Vestibulum auctor euismod nisi. Nullam\n                  tincidunt est in mi tincidunt dictum. Sed consectetur aliquet\n                  velit ut ornare.\n                </span>\n              </p>\n            )\n          })}\n        </div>\n      </PageLayout.Content>\n      <PageLayout.Pane\n        position=\"start\"\n        padding=\"normal\"\n        divider=\"line\"\n        aria-label=\"Aside pane\"\n        sticky\n        offsetHeader={args.offsetHeader}\n      >\n        <div className={classes.ContentGrid}>\n          {Array.from({\n            length: args.numParagraphsInPane,\n          }).map((_, i) => {\n            const testId = `paragraph${i}`\n            return (\n              <p key={i} className={classes.Paragraph}>\n                <span data-testid={testId}>\n                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam\n                  at enim id lorem tempus egestas a non ipsum. Maecenas\n                  imperdiet ante quam, at varius lorem molestie vel. Sed at eros\n                  consequat, varius tellus et, auctor felis. Donec pulvinar\n                  lacinia urna nec commodo. Phasellus at imperdiet risus. Donec\n                  sit amet massa purus.\n                </span>\n              </p>\n            )\n          })}\n        </div>\n      </PageLayout.Pane>\n      <PageLayout.Footer padding=\"normal\" divider=\"line\">\n        <Placeholder label=\"Footer\" height={64} />\n      </PageLayout.Footer>\n    </PageLayout>\n  </div>\n)"
        },
        {
          "id": "components-pagelayout-features--resizable-pane",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Pane resizable position=\"start\" aria-label=\"Side pane\">\n      <Placeholder height={320} label=\"Pane\" />\n    </PageLayout.Pane>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--scroll-container-within-page-layout-pane",
          "code": "() => (\n  <div className={classes.NestedScrollContainer}>\n    <div className={classes.OverflowAuto}>\n      <Placeholder label=\"Above inner scroll container\" height={120} />\n      <PageLayout\n        rowGap=\"none\"\n        columnGap=\"none\"\n        padding=\"none\"\n        containerWidth=\"full\"\n      >\n        <PageLayout.Pane\n          position=\"start\"\n          padding=\"normal\"\n          divider=\"line\"\n          sticky\n          aria-label=\"Sticky pane\"\n        >\n          <div className={classes.OverflowAuto}>\n            <PageLayout.Pane padding=\"normal\" aria-label=\"Side pane\">\n              <Placeholder label=\"Inner scroll container\" height={800} />\n            </PageLayout.Pane>\n          </div>\n        </PageLayout.Pane>\n        <PageLayout.Content padding=\"normal\" width=\"large\">\n          <div\n            className={classes.ContentGrid}\n            tabIndex={0}\n            role=\"region\"\n            aria-label=\"Page content\"\n          >\n            <Placeholder label=\"Page content\" height={1600} />\n          </div>\n        </PageLayout.Content>\n      </PageLayout>\n      <Placeholder label=\"Beneath inner scroll container\" height={120} />\n    </div>\n  </div>\n)"
        },
        {
          "id": "components-pagelayout-features--custom-pane-widths",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Pane\n      resizable\n      width={{\n        min: '200px',\n        default: '300px',\n        max: '400px',\n      }}\n      aria-label=\"Side pane\"\n    >\n      <Placeholder height={320} label=\"Pane\" />\n    </PageLayout.Pane>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--with-custom-pane-heading",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Pane resizable position=\"start\" aria-label=\"Side pane\">\n      <Heading as=\"h2\" className={classes.PaneHeading} id=\"pane-heading\">\n        Pane Heading\n      </Heading>\n      <Placeholder height={320} label=\"Pane\" />\n    </PageLayout.Pane>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--resizable-pane-without-persistence",
          "code": "() => {\n  const [currentWidth, setCurrentWidth] = React.useState<number>(\n    defaultPaneWidth.medium,\n  )\n  return (\n    <PageLayout>\n      <PageLayout.Header>\n        <Placeholder height={64} label=\"Header\" />\n      </PageLayout.Header>\n      <PageLayout.Pane\n        resizable\n        currentWidth={currentWidth}\n        onResizeEnd={setCurrentWidth}\n        aria-label=\"Side pane\"\n      >\n        <Placeholder\n          height={320}\n          label={`Pane (resizable, not persisted, width: ${currentWidth}px)`}\n        />\n      </PageLayout.Pane>\n      <PageLayout.Content>\n        <Placeholder height={640} label=\"Content\" />\n      </PageLayout.Content>\n      <PageLayout.Footer>\n        <Placeholder height={64} label=\"Footer\" />\n      </PageLayout.Footer>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-pagelayout-features--resizable-pane-with-custom-persistence",
          "code": "() => {\n  const key = 'page-layout-features-stories-custom-persistence-pane-width'\n\n  // Read initial width from localStorage (CSR only), falling back to medium preset\n  const getInitialWidth = (): number => {\n    if (typeof window !== 'undefined') {\n      const storedWidth = localStorage.getItem(key)\n      if (storedWidth !== null) {\n        const parsed = parseFloat(storedWidth)\n        if (!isNaN(parsed) && parsed > 0) {\n          return parsed\n        }\n      }\n    }\n    return defaultPaneWidth.medium\n  }\n  const [currentWidth, setCurrentWidth] =\n    React.useState<number>(getInitialWidth)\n  useIsomorphicLayoutEffect(() => {\n    setCurrentWidth(getInitialWidth())\n  }, [])\n  const handleWidthChange = (width: number) => {\n    setCurrentWidth(width)\n    localStorage.setItem(key, width.toString())\n  }\n  return (\n    <PageLayout>\n      <PageLayout.Header>\n        <Placeholder height={64} label=\"Header\" />\n      </PageLayout.Header>\n      <PageLayout.Pane\n        width={{\n          min: '256px',\n          default: `${defaultPaneWidth.medium}px`,\n          max: '600px',\n        }}\n        resizable\n        currentWidth={currentWidth}\n        onResizeEnd={handleWidthChange}\n        aria-label=\"Side pane\"\n      >\n        <Placeholder height={320} label={`Pane (width: ${currentWidth}px)`} />\n      </PageLayout.Pane>\n      <PageLayout.Content>\n        <Placeholder height={640} label=\"Content\" />\n      </PageLayout.Content>\n      <PageLayout.Footer>\n        <Placeholder height={64} label=\"Footer\" />\n      </PageLayout.Footer>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-pagelayout-features--resizable-pane-with-number-width",
          "code": "() => {\n  const key = 'page-layout-features-stories-number-width'\n\n  // Read initial width from localStorage (CSR only), falling back to medium preset\n  const getInitialWidth = (): number => {\n    if (typeof window !== 'undefined') {\n      const storedWidth = localStorage.getItem(key)\n      if (storedWidth !== null) {\n        const parsed = parseInt(storedWidth, 10)\n        if (!isNaN(parsed) && parsed > 0) {\n          return parsed\n        }\n      }\n    }\n    return defaultPaneWidth.medium\n  }\n  const [currentWidth, setCurrentWidth] =\n    React.useState<number>(getInitialWidth)\n  const handleWidthChange = (newWidth: number) => {\n    setCurrentWidth(newWidth)\n    localStorage.setItem(key, newWidth.toString())\n  }\n  return (\n    <PageLayout>\n      <PageLayout.Header>\n        <Placeholder height={64} label=\"Header\" />\n      </PageLayout.Header>\n      <PageLayout.Pane\n        width=\"medium\"\n        resizable\n        currentWidth={currentWidth}\n        onResizeEnd={handleWidthChange}\n        aria-label=\"Side pane\"\n      >\n        <Placeholder height={320} label={`Pane (width: ${currentWidth}px)`} />\n      </PageLayout.Pane>\n      <PageLayout.Content>\n        <Placeholder height={640} label=\"Content\" />\n      </PageLayout.Content>\n      <PageLayout.Footer>\n        <Placeholder height={64} label=\"Footer\" />\n      </PageLayout.Footer>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-pagelayout-features--resizable-pane-with-controlled-width",
          "code": "() => {\n  const key = 'page-layout-features-stories-controlled-width'\n\n  // Read initial width from localStorage (CSR only), falling back to medium preset\n  const getInitialWidth = (): number => {\n    if (typeof window !== 'undefined') {\n      const storedWidth = localStorage.getItem(key)\n      if (storedWidth !== null) {\n        const parsed = parseInt(storedWidth, 10)\n        if (!isNaN(parsed) && parsed > 0) {\n          return parsed\n        }\n      }\n    }\n    return defaultPaneWidth.medium\n  }\n  const [currentWidth, setCurrentWidth] =\n    React.useState<number>(getInitialWidth)\n  const handleWidthChange = (newWidth: number) => {\n    setCurrentWidth(newWidth)\n    localStorage.setItem(key, newWidth.toString())\n  }\n  return (\n    <PageLayout>\n      <PageLayout.Header>\n        <Placeholder height={64} label=\"Header\" />\n      </PageLayout.Header>\n      <PageLayout.Pane\n        width={{\n          min: '256px',\n          default: '296px',\n          max: '600px',\n        }}\n        resizable\n        currentWidth={currentWidth}\n        onResizeEnd={handleWidthChange}\n        aria-label=\"Side pane\"\n      >\n        <Placeholder height={320} label={`Pane (current: ${currentWidth}px)`} />\n      </PageLayout.Pane>\n      <PageLayout.Content>\n        <Placeholder height={640} label=\"Content\" />\n      </PageLayout.Content>\n      <PageLayout.Footer>\n        <Placeholder height={64} label=\"Footer\" />\n      </PageLayout.Footer>\n    </PageLayout>\n  )\n}"
        },
        {
          "id": "components-pagelayout-features--sidebar-start",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Sidebar position=\"start\" aria-label=\"Navigation sidebar\">\n      <Placeholder height={800} label=\"Sidebar (Start)\" />\n    </PageLayout.Sidebar>\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--sidebar-end",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Sidebar position=\"end\" aria-label=\"Inspector sidebar\">\n      <Placeholder height={800} label=\"Sidebar (End)\" />\n    </PageLayout.Sidebar>\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--resizable-sidebar",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Sidebar\n      resizable\n      position=\"end\"\n      aria-label=\"Resizable sidebar\"\n      style={{\n        height: 'auto',\n      }}\n      width={{\n        min: '200px',\n        default: '300px',\n        max: '2000px',\n      }}\n    >\n      <Placeholder height=\"100%\" label=\"Resizable Sidebar\" />\n    </PageLayout.Sidebar>\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Pane position=\"start\" aria-label=\"Side pane\">\n      <Placeholder height={320} label=\"Pane\" />\n    </PageLayout.Pane>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--sidebar-with-pane-resizable",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Sidebar\n      style={{\n        height: 'auto',\n      }}\n      resizable\n      position=\"end\"\n      aria-label=\"Navigation sidebar\"\n      width={{\n        min: '200px',\n        default: '300px',\n        max: '2000px',\n      }}\n    >\n      <Placeholder height=\"100%\" label=\"Resizable Sidebar\" />\n    </PageLayout.Sidebar>\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Pane resizable position=\"start\" aria-label=\"Side pane\">\n      <Placeholder height={320} label=\"Resizable Pane\" />\n    </PageLayout.Pane>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--sticky-sidebar",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Sidebar sticky position=\"start\" aria-label=\"Sticky sidebar\">\n      <Placeholder height={200} label=\"Sticky Sidebar\" />\n    </PageLayout.Sidebar>\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Content>\n      <Placeholder height={2000} label=\"Tall Content (scroll to test sticky)\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--sidebar-fullscreen-responsive-variant",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Sidebar\n      position=\"start\"\n      responsiveVariant=\"fullscreen\"\n      aria-label=\"Fullscreen sidebar\"\n    >\n      <Placeholder height={800} label=\"Sidebar (fullscreen at narrow)\" />\n    </PageLayout.Sidebar>\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "containerWidth",
          "type": "| 'full' | 'medium' | 'large' | 'xlarge'",
          "defaultValue": "'xlarge'",
          "description": "The maximum width of the page container."
        },
        {
          "name": "padding",
          "type": "| 'none' | 'condensed' | 'normal'",
          "defaultValue": "'normal'",
          "description": "The spacing between the outer edges of the page container and the viewport"
        },
        {
          "name": "columnGap",
          "type": "| 'none' | 'condensed' | 'normal'",
          "defaultValue": "'normal'",
          "description": ""
        },
        {
          "name": "rowGap",
          "type": "| 'none' | 'condensed' | 'normal'",
          "defaultValue": "'normal'",
          "description": ""
        }
      ],
      "subcomponents": [
        {
          "name": "PageLayout.Header",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "A unique label for the rendered banner landmark"
            },
            {
              "name": "aria-labelledby",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "An id to an element which uniquely labels the rendered banner landmark"
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'none'",
              "description": "The amount of padding inside the header."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'none'",
              "description": ""
            },
            {
              "name": "dividerWhenNarrow",
              "type": "| 'inherit' | 'none' | 'line' | 'filled'",
              "defaultValue": "'inherit'",
              "deprecated": true,
              "description": "Use the divider prop with a responsive value instead."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the header is hidden."
            }
          ]
        },
        {
          "name": "PageLayout.Content",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "'main'",
              "description": "Change the root node to another HTML element or custom component."
            },
            {
              "name": "width",
              "type": "| 'full' | 'medium' | 'large' | 'xlarge'",
              "defaultValue": "'full'",
              "description": "The maximum width of the content region."
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'none'",
              "description": "The amount of padding inside the content."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "PageLayout.Pane",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "description": "Label for the pane. Required if the pane overflows and doesn't have aria-labelledby."
            },
            {
              "name": "aria-labelledby",
              "type": "string | undefined",
              "description": "Id of an element that acts as a label for the pane. Required if the pane overflows and doesn't have aria-label."
            },
            {
              "name": "width",
              "type": "| 'small' | 'medium' | 'large' | { min: string max: string default: string }",
              "defaultValue": "'medium'",
              "description": "The width of the pane. If using custom widths, provide an object with keys 'min', 'max' and 'default'."
            },
            {
              "name": "minWidth",
              "type": "number",
              "defaultValue": "256",
              "description": "The minimum width of the pane."
            },
            {
              "name": "resizable",
              "type": "boolean",
              "defaultValue": "false",
              "description": "When true, the pane may be resized by the user. Uses localStorage persistence by default. Note: with default persistence in SSR, the server-rendered width may differ from the stored client width, causing a brief layout shift on hydration. Use `onResizeEnd` with server-aware storage to avoid this."
            },
            {
              "name": "currentWidth",
              "type": "number | undefined",
              "description": "Current/controlled width value in pixels. Required when `onResizeEnd` is provided. Pass `undefined` when the persisted value has not loaded yet. The `width` prop still defines the default used when resetting (e.g., double-click)."
            },
            {
              "name": "onResizeEnd",
              "type": "(width: number) => void",
              "description": "Callback fired when a resize operation ends (drag release or keyboard key up). When provided, replaces localStorage persistence. Requires `currentWidth`."
            },
            {
              "name": "widthStorageKey",
              "type": "string",
              "defaultValue": "'paneWidth'",
              "description": "localStorage key used to persist the pane width across sessions. Only applies when `resizable` is `true` and no `onResizeEnd` callback is provided."
            },
            {
              "name": "sticky",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the pane should stick to the top of the screen while the content scrolls."
            },
            {
              "name": "offsetHeader",
              "type": "number | string",
              "defaultValue": "0",
              "description": "Use offsetHeader along with the sticky prop to push the sticky pane down to make room for a sticky header if necessary. Use the type `string` to specify the height with a unit i.e. 5rem; otherwise the type `number` will be taken as px."
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'none'",
              "description": "The amount of padding inside the pane."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'none'",
              "description": ""
            },
            {
              "name": "dividerWhenNarrow",
              "type": "| 'inherit' | 'none' | 'line' | 'filled'",
              "defaultValue": "'inherit'",
              "deprecated": true,
              "description": "Use the divider prop with a responsive value instead."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the pane is hidden."
            },
            {
              "name": "position",
              "type": "'end' | 'start' | { narrow?: 'end' | 'start'; regular?: 'end' | 'start'; wide?: 'end' | 'start'; }",
              "description": "Which side of the page the pane should be on. Can be changed for different viewport widths.",
              "defaultValue": ""
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLDivElement>"
            }
          ]
        },
        {
          "name": "PageLayout.Sidebar",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "description": "A unique label for the sidebar region."
            },
            {
              "name": "aria-labelledby",
              "type": "string | undefined",
              "description": "An id to an element which uniquely labels the sidebar region."
            },
            {
              "name": "position",
              "type": "'start' | 'end'",
              "defaultValue": "'start'",
              "description": "Position of the sidebar relative to the page layout. The sidebar spans the full height of the layout, adjacent to the header, content, and footer."
            },
            {
              "name": "width",
              "type": "| 'small' | 'medium' | 'large' | { min: string max: string default: string }",
              "defaultValue": "'medium'",
              "description": "The width of the sidebar. If using custom widths, provide an object with keys 'min', 'max' and 'default'."
            },
            {
              "name": "minWidth",
              "type": "number",
              "defaultValue": "256",
              "description": "Minimum width of the sidebar when resizable."
            },
            {
              "name": "resizable",
              "type": "boolean",
              "defaultValue": "false",
              "description": "When true, the sidebar may be resized by the user. Width is persisted to localStorage by default."
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'none'",
              "description": "The amount of padding inside the sidebar."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line'",
              "defaultValue": "'none'",
              "description": "Divider style between the sidebar and the rest of the layout."
            },
            {
              "name": "sticky",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the sidebar sticks to the viewport when scrolling. When enabled, the sidebar uses position: sticky with top: 0 and height: 100vh."
            },
            {
              "name": "responsiveVariant",
              "type": "| 'default' | 'fullscreen'",
              "defaultValue": "'default'",
              "description": "Controls sidebar behavior at narrow viewport widths (below 768px). 'default' retains its normal inline layout. 'fullscreen' expands to cover the full viewport like a dialog overlay."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the sidebar is hidden."
            }
          ]
        },
        {
          "name": "PageLayout.Footer",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "A unique label for the rendered contentinfo landmark"
            },
            {
              "name": "aria-labelledby",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "An id to an element which uniquely labels the rendered contentinfo landmark"
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'none'",
              "description": "The amount of padding inside the footer."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'none'",
              "description": ""
            },
            {
              "name": "dividerWhenNarrow",
              "type": "| 'inherit' | 'none' | 'line' | 'filled'",
              "defaultValue": "'inherit'",
              "deprecated": true,
              "description": "Use the divider prop with a responsive value instead."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the footer is hidden."
            }
          ]
        }
      ]
    },
    "pagehead": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Pagehead",
      "id": "pagehead",
      "name": "Pagehead",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-pagehead--default",
          "code": "() => (\n  <Pagehead>\n    <Heading as=\"h2\" variant=\"small\">\n      Pagehead\n    </Heading>\n  </Pagehead>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "as",
          "type": "string",
          "defaultValue": "div",
          "description": "Sets the underlying HTML tag for the component"
        }
      ],
      "subcomponents": []
    },
    "pagination": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Pagination",
      "id": "pagination",
      "name": "Pagination",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-pagination--default",
          "code": "() => {\n  const [page, setPage] = useState(2)\n  return (\n    <Pagination\n      pageCount={15}\n      currentPage={page}\n      onPageChange={(e, n) => {\n        e.preventDefault()\n        setPage(n)\n      }}\n      showPages={{\n        narrow: false,\n      }}\n    />\n  )\n}"
        },
        {
          "id": "components-pagination-features--larger-page-count-margin",
          "code": "() => (\n  <Pagination\n    pageCount={15}\n    currentPage={5}\n    marginPageCount={4}\n    onPageChange={(e) => e.preventDefault()}\n  />\n)"
        },
        {
          "id": "components-pagination-features--hide-page-numbers",
          "code": "() => (\n  <Pagination\n    pageCount={15}\n    currentPage={5}\n    showPages={false}\n    onPageChange={(e) => e.preventDefault()}\n  />\n)"
        },
        {
          "id": "components-pagination-features--hide-page-numbers-by-viewport",
          "code": "() => (\n  <>\n    <Pagination\n      pageCount={15}\n      currentPage={5}\n      showPages={{\n        narrow: false,\n      }}\n      onPageChange={(e) => e.preventDefault()}\n    />\n    <p>Page numbers are hidden on narrow viewports.</p>\n  </>\n)"
        },
        {
          "id": "components-pagination-features--higher-surrounding-page-count",
          "code": "() => (\n  <Pagination\n    pageCount={15}\n    currentPage={5}\n    surroundingPageCount={4}\n    onPageChange={(e) => e.preventDefault()}\n  />\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "currentPage",
          "type": "number",
          "defaultValue": "",
          "required": true,
          "description": "The currently selected page."
        },
        {
          "name": "pageCount",
          "type": "number",
          "defaultValue": "",
          "required": true,
          "description": "The total number of pages."
        },
        {
          "name": "hrefBuilder",
          "type": "function",
          "defaultValue": "",
          "description": "A function to generate links based on page number."
        },
        {
          "name": "marginPageCount",
          "type": "number",
          "defaultValue": "1",
          "description": "How many pages to always show at the left and right of the component."
        },
        {
          "name": "onPageChange",
          "type": "function",
          "defaultValue": "(e: MouseEvent<Element, MouseEvent>, n: number) => void",
          "description": "Called with event and page number when a page is clicked."
        },
        {
          "name": "showPages",
          "type": "boolean | { narrow?: boolean, regular?: boolean, wide?: boolean }",
          "defaultValue": "true",
          "description": "Whether or not to show the individual page links."
        },
        {
          "name": "surroundingPageCount",
          "type": "number",
          "defaultValue": "2",
          "description": "How many pages to display on each side of the currently selected page."
        },
        {
          "name": "renderPage",
          "type": "function",
          "defaultValue": "(props: PageProps) => ReactNode",
          "description": "Provide a custom component or render prop to render each page link within the component."
        }
      ],
      "subcomponents": []
    },
    "popover": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Popover",
      "id": "popover",
      "name": "Popover",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-popover--default",
          "code": "() => (\n  <Popover relative open={true} caret=\"top\">\n    <Popover.Content\n      style={{\n        marginTop: 'var(--base-size-8)',\n      }}\n    >\n      <Heading\n        style={{\n          fontSize: 'var(--text-title-size-small)',\n        }}\n      >\n        Popover heading\n      </Heading>\n      <Text as=\"p\">Message about popovers</Text>\n      <Button>Got it!</Button>\n    </Popover.Content>\n  </Popover>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "as",
          "type": "string",
          "defaultValue": "div",
          "description": "Sets the underlying HTML tag for the component"
        },
        {
          "name": "caret",
          "type": "| 'top' | 'bottom' | 'left' | 'right' | 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right' | 'left-bottom' | 'left-top' | 'right-bottom' | 'right-top' ",
          "defaultValue": "'top'",
          "description": "Controls the position of the caret"
        },
        {
          "name": "open",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Controls the visibility of the popover."
        },
        {
          "name": "relative",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Set to true to render the popover using relative positioning."
        }
      ],
      "subcomponents": [
        {
          "name": "Popover.Content",
          "props": [
            {
              "name": "as",
              "type": "string",
              "defaultValue": "div",
              "description": "Sets the underlying HTML tag for the component"
            },
            {
              "name": "width",
              "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'auto'",
              "defaultValue": "'small'",
              "description": "Sets the width of the popover content."
            },
            {
              "name": "height",
              "type": "| 'small' | 'medium' | 'large' | 'xlarge' | 'fit-content' | 'auto'",
              "defaultValue": "'fit-content'",
              "description": "Sets the height of the popover content."
            },
            {
              "name": "overflow",
              "type": "| 'auto' | 'hidden' | 'scroll' | 'visible'",
              "defaultValue": "'auto'",
              "description": "Sets the overflow behavior of the popover content."
            },
            {
              "name": "onClickOutside",
              "type": "(event: MouseEvent | TouchEvent) => void",
              "description": "Callback fired when a click is detected outside the popover content"
            },
            {
              "name": "ignoreClickRefs",
              "type": "React.RefObject<HTMLElement>[]",
              "description": "Refs to elements that should be ignored when detecting outside clicks"
            }
          ]
        }
      ]
    },
    "portal": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Portal",
      "id": "portal",
      "name": "Portal",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "behaviors-portal--default",
          "code": "() => (\n  <>\n    Root position\n    <div className={clsx(classes.PortalContainer, classes.OuterContainer)}>\n      Outer container\n      <div className={clsx(classes.PortalContainer, classes.InnerContainer)}>\n        Inner container\n        <Portal>\n          Portaled content rendered at <code>&lt;BaseStyles&gt;</code> root.\n        </Portal>\n      </div>\n    </div>\n  </>\n)"
        },
        {
          "id": "behaviors-portal-features--custom-portal-root-by-id",
          "code": "() => (\n  <>\n    Root position\n    <div\n      className={clsx(classes.PortalContainer, classes.OuterContainer)}\n      id=\"__primerPortalRoot__\"\n    >\n      Outer container\n      <div className={clsx(classes.PortalContainer, classes.InnerContainer)}>\n        Inner container\n        <Portal>Portaled content rendered at the outer container.</Portal>\n      </div>\n    </div>\n  </>\n)"
        },
        {
          "id": "behaviors-portal-features--custom-portal-root-by-registration",
          "code": "() => {\n  const outerContainerRef = React.useRef<HTMLDivElement>(null)\n  const [mounted, setMounted] = React.useState(false)\n  React.useEffect(() => {\n    if (outerContainerRef.current instanceof HTMLElement) {\n      registerPortalRoot(outerContainerRef.current)\n      setMounted(true)\n    }\n  }, [])\n  return (\n    <>\n      Root position\n      <div\n        className={clsx(classes.PortalContainer, classes.OuterContainer)}\n        ref={outerContainerRef}\n      >\n        {mounted ? (\n          <>\n            Outer container\n            <div\n              className={clsx(classes.PortalContainer, classes.InnerContainer)}\n            >\n              Inner container\n              <Portal>Portaled content rendered at the outer container.</Portal>\n            </div>\n          </>\n        ) : null}\n      </div>\n    </>\n  )\n}"
        },
        {
          "id": "behaviors-portal-features--multiple-portal-roots",
          "code": "() => {\n  const outerContainerRef = React.useRef<HTMLDivElement>(null)\n  const innerContainerRef = React.useRef<HTMLDivElement>(null)\n  const [mounted, setMounted] = React.useState(false)\n  React.useEffect(() => {\n    if (\n      outerContainerRef.current instanceof HTMLElement &&\n      innerContainerRef.current instanceof HTMLElement\n    ) {\n      registerPortalRoot(outerContainerRef.current, 'outer')\n      registerPortalRoot(innerContainerRef.current, 'inner')\n      setMounted(true)\n    }\n  }, [outerContainerRef])\n  return (\n    <>\n      Root position\n      <div\n        className={clsx(classes.PortalContainer, classes.OuterContainer)}\n        ref={outerContainerRef}\n      >\n        Outer container\n        <div\n          className={clsx(classes.PortalContainer, classes.InnerContainer)}\n          ref={innerContainerRef}\n        >\n          {mounted ? (\n            <>\n              <Portal containerName=\"outer\">\n                Portaled content rendered at the outer container.\n              </Portal>\n              <Portal containerName=\"inner\">\n                Portaled content rendered at the end of the inner container.\n              </Portal>\n              <Portal>\n                Portaled content rendered at <code>&lt;BaseStyles&gt;</code>{' '}\n                root.\n              </Portal>\n            </>\n          ) : null}\n          Inner container\n        </div>\n      </div>\n    </>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "onMount",
          "type": "function",
          "defaultValue": "",
          "description": "Called when this portal is added to the DOM"
        },
        {
          "name": "containerName",
          "type": "string",
          "defaultValue": "",
          "description": "Renders the portal children into the container registered with the given name. If omitted, children are rendered into the default portal root."
        }
      ],
      "subcomponents": []
    },
    "progress_bar": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ProgressBar",
      "id": "progress_bar",
      "name": "ProgressBar",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-progressbar--default",
          "code": "() => <ProgressBar aria-label=\"Upload test.png\" />"
        },
        {
          "id": "components-progressbar-features--progress-zero",
          "code": "() => <ProgressBar progress=\"0\" aria-label=\"Upload test.png\" />"
        },
        {
          "id": "components-progressbar-features--progress-half",
          "code": "() => <ProgressBar progress=\"50\" aria-label=\"Upload test.png\" />"
        },
        {
          "id": "components-progressbar-features--progress-done",
          "code": "() => <ProgressBar progress=\"100\" aria-label=\"Upload test.png\" />"
        },
        {
          "id": "components-progressbar-features--size-small",
          "code": "() => (\n  <ProgressBar progress=\"66\" barSize=\"small\" aria-label=\"Upload test.png\" />\n)"
        },
        {
          "id": "components-progressbar-features--size-large",
          "code": "() => (\n  <ProgressBar progress=\"66\" barSize=\"large\" aria-label=\"Upload test.png\" />\n)"
        },
        {
          "id": "components-progressbar-features--inline",
          "code": "() => (\n  <ProgressBar\n    inline\n    progress=\"66\"\n    style={{\n      width: '100px',\n    }}\n    aria-label=\"Upload test.png\"\n  />\n)"
        },
        {
          "id": "components-progressbar-features--all-colors",
          "code": "() => (\n  <ProgressBar aria-label=\"Upload test.png\">\n    <ProgressBar.Item\n      progress={20}\n      aria-label=\"Photo Usage\"\n      bg=\"accent.emphasis\"\n    />\n    <ProgressBar.Item\n      progress={15}\n      aria-label=\"Application Usage\"\n      bg=\"danger.emphasis\"\n    />\n    <ProgressBar.Item\n      progress={12}\n      aria-label=\"Music Usage\"\n      bg=\"severe.emphasis\"\n    />\n    <ProgressBar.Item\n      progress={11}\n      aria-label=\"Music Usage\"\n      bg=\"done.emphasis\"\n    />\n    <ProgressBar.Item\n      progress={8}\n      aria-label=\"Music Usage\"\n      bg=\"sponsors.emphasis\"\n    />\n    <ProgressBar.Item\n      progress={7}\n      aria-label=\"Music Usage\"\n      bg=\"neutral.emphasis\"\n    />\n    <ProgressBar.Item\n      progress={7}\n      aria-label=\"Music Usage\"\n      bg=\"attention.emphasis\"\n    />\n  </ProgressBar>\n)"
        },
        {
          "id": "components-progressbar-features--multiple-items",
          "code": "() => (\n  <ProgressBar>\n    <ProgressBar.Item\n      progress={33}\n      aria-label=\"Photo Usage\"\n      bg=\"accent.emphasis\"\n    />\n    <ProgressBar.Item\n      progress={23}\n      aria-label=\"Application Usage\"\n      bg={'danger.emphasis'}\n    />\n    <ProgressBar.Item\n      progress={14}\n      aria-label=\"Music Usage\"\n      bg={'severe.emphasis'}\n    />\n  </ProgressBar>\n)"
        },
        {
          "id": "components-progressbar-features--animated",
          "code": "() => <ProgressBar progress=\"50\" aria-label=\"Upload test.png\" animated />"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "animated",
          "type": "boolean",
          "description": "Whether the filled in area(s) of the progress bar will be animated or not"
        },
        {
          "name": "progress",
          "type": "number",
          "defaultValue": "0",
          "description": "Used to set the size of the green bar"
        },
        {
          "name": "barSize",
          "type": "| 'small' | 'large' | 'default'",
          "defaultValue": "'default'",
          "description": "Controls the height of the progress bar. If omitted, height is set to the default height."
        },
        {
          "name": "inline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Styles the progress bar inline"
        },
        {
          "name": "bg",
          "type": "string",
          "defaultValue": "'bg.successInverse'",
          "description": "Set the progress bar color"
        }
      ],
      "subcomponents": [
        {
          "name": "ProgressBar.Item",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "Defines a string value that labels the current element.\n@see aria-labelledby.",
              "defaultValue": ""
            },
            {
              "name": "bg",
              "type": "string",
              "description": "Set the progress segment color",
              "defaultValue": "success.emphasis"
            },
            {
              "name": "progress",
              "type": "string | number",
              "description": "Used to set the size of the green bar",
              "defaultValue": "0"
            }
          ]
        }
      ]
    },
    "radio": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Radio",
      "id": "radio",
      "name": "Radio",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-radio--default",
          "code": "() => (\n  <form>\n    <FormControl>\n      <Radio name=\"default-radio-name\" value=\"default\" />\n      <FormControl.Label>Label</FormControl.Label>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-radio-features--with-leading-visual",
          "code": "() => {\n  return (\n    <form>\n      <FormControl>\n        <FormControl.LeadingVisual>\n          <MarkGithubIcon />\n        </FormControl.LeadingVisual>\n        <Radio value=\"default\" name=\"default-radio-name\" />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n      <FormControl>\n        <FormControl.LeadingVisual>\n          <Avatar src={`https://github.com/lukasoppermann.png`} />\n        </FormControl.LeadingVisual>\n        <Radio value=\"default\" name=\"default-radio-name\" />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-radio-features--disabled",
          "code": "() => {\n  return (\n    <form>\n      <FormControl disabled>\n        <Radio value=\"default\" name=\"default-radio-name\" />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-radio-features--with-caption",
          "code": "() => {\n  return (\n    <form>\n      <FormControl>\n        <Radio value=\"default\" name=\"default-radio-name\" />\n        <FormControl.Label>Default label</FormControl.Label>\n        <FormControl.Caption>This is a caption</FormControl.Caption>\n      </FormControl>\n    </form>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "value",
          "type": "string",
          "defaultValue": "",
          "required": true,
          "description": "A unique value that is never shown to the user"
        },
        {
          "name": "name",
          "type": "string",
          "defaultValue": "",
          "description": "Required for grouping multiple radios"
        },
        {
          "name": "checked",
          "type": "boolean",
          "defaultValue": "",
          "description": "Modifies true/false value of the native radio"
        },
        {
          "name": "defaultChecked",
          "type": "boolean",
          "defaultValue": "",
          "description": "Selects the radio by default in uncontrolled mode"
        },
        {
          "name": "onChange",
          "type": "(event: React.ChangeEvent) => void",
          "defaultValue": "",
          "description": "A callback function that is triggered when the input state has been changed"
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "",
          "description": "Modifies the native disabled state of the native checkbox"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLInputElement>"
        }
      ],
      "subcomponents": []
    },
    "radio_group": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/RadioGroup",
      "id": "radio_group",
      "name": "RadioGroup",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-radiogroup--default",
          "code": "() => (\n  <RadioGroup name=\"defaultRadioGroup\">\n    <RadioGroup.Label>Choices</RadioGroup.Label>\n    <FormControl>\n      <Radio value=\"one\" />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </RadioGroup>\n)"
        },
        {
          "id": "components-radiogroup-features--visually-hidden-label",
          "code": "() => (\n  <RadioGroup name=\"defaultRadioGroup\">\n    <RadioGroup.Label visuallyHidden>Choices</RadioGroup.Label>\n    <FormControl>\n      <Radio value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"two\" />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </RadioGroup>\n)"
        },
        {
          "id": "components-radiogroup-features--with-external-label",
          "code": "() => (\n  <>\n    <div id=\"choiceHeading\" className={classes.ExternalLabel}>\n      External label\n    </div>\n    <RadioGroup aria-labelledby=\"choiceHeading\" name=\"defaultRadioGroup\">\n      <FormControl>\n        <Radio value=\"one\" />\n        <FormControl.Label>Choice one</FormControl.Label>\n      </FormControl>\n      <FormControl>\n        <Radio value=\"two\" />\n        <FormControl.Label>Choice two</FormControl.Label>\n      </FormControl>\n      <FormControl>\n        <Radio value=\"three\" />\n        <FormControl.Label>Choice three</FormControl.Label>\n      </FormControl>\n    </RadioGroup>\n  </>\n)"
        },
        {
          "id": "components-radiogroup-features--error",
          "code": "() => (\n  <RadioGroup name=\"defaultRadioGroup\">\n    <RadioGroup.Label>Choices</RadioGroup.Label>\n    <FormControl>\n      <Radio value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"two\" />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n    <RadioGroup.Validation variant=\"error\">\n      Something went wrong\n    </RadioGroup.Validation>\n  </RadioGroup>\n)"
        },
        {
          "id": "components-radiogroup-features--success",
          "code": "() => (\n  <RadioGroup name=\"defaultRadioGroup\">\n    <RadioGroup.Label>Choices</RadioGroup.Label>\n    <FormControl>\n      <Radio value=\"one\" />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n    <RadioGroup.Validation variant=\"success\">Great job!</RadioGroup.Validation>\n  </RadioGroup>\n)"
        },
        {
          "id": "components-radiogroup-features--caption",
          "code": "() => (\n  <RadioGroup name=\"defaultRadioGroup\">\n    <RadioGroup.Label>Choices</RadioGroup.Label>\n    <RadioGroup.Caption>Caption</RadioGroup.Caption>\n    <FormControl>\n      <Radio value=\"one\" />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Radio value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </RadioGroup>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-labelledby",
          "type": "string",
          "defaultValue": "",
          "description": "Used when associating the input group with a label other than RadioGroup.Label"
        },
        {
          "name": "children",
          "type": "RadioGroup.Label | RadioGroup.Caption | RadioGroup.Validation | FormControl",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the input group allows user input"
        },
        {
          "name": "id",
          "type": "string",
          "defaultValue": "A generated string",
          "description": "The unique identifier for this input group. Used to associate the label, validation text, and caption text.\nYou may want a custom ID to make it easier to select elements in integration tests."
        },
        {
          "name": "name",
          "type": "string",
          "defaultValue": "",
          "required": true,
          "description": "The name used to identify this group of radios"
        },
        {
          "name": "onChange",
          "type": "(selected: string | null, e?: ChangeEvent<HTMLInputElement>) => void",
          "defaultValue": "",
          "description": "An onChange handler that gets called when the selection changes"
        },
        {
          "name": "required",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the user must make a selection before the owning form can be submitted"
        }
      ],
      "subcomponents": [
        {
          "name": "RadioGroup.Label",
          "props": [
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "defaultValue": "false",
              "description": "If true, the fieldset legend will be visually hidden"
            }
          ]
        },
        {
          "name": "RadioGroup.Caption",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The caption content"
            }
          ]
        },
        {
          "name": "RadioGroup.Validation",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The validation message"
            },
            {
              "name": "variant",
              "type": "'error' | 'success'",
              "defaultValue": "",
              "required": true,
              "description": "Changes the visual style to match the validation status"
            }
          ]
        }
      ]
    },
    "relative_time": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/RelativeTime",
      "id": "relative_time",
      "name": "RelativeTime",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-relativetime--default",
          "code": "() => <RelativeTime date={new Date('2020-01-01T00:00:00Z')} noTitle={true} />"
        },
        {
          "id": "components-relativetime-features--micro-format",
          "code": "(args) => {\n  const { date, ...rest } = args\n  return (\n    <RelativeTime\n      noTitle={true}\n      {...rest}\n      date={new Date(date)}\n      format=\"micro\"\n    />\n  )\n}"
        },
        {
          "id": "components-relativetime-features--recent-time",
          "code": "(args) => {\n  const { ...rest } = args\n  return <RelativeTime noTitle={true} {...rest} date={new Date()} />\n}"
        },
        {
          "id": "components-relativetime-features--count-down-timer",
          "code": "(args) => {\n  const { ...rest } = args\n  return <RelativeTime noTitle={true} {...rest} />\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "datetime",
          "type": "string",
          "defaultValue": "",
          "required": true,
          "description": "An ISO8601 time representing the time"
        },
        {
          "name": "date",
          "type": "string",
          "defaultValue": "",
          "description": "Instead of passing the `datetime`, it is possible to pass a full `Date` object into the `date` prop"
        },
        {
          "name": "format",
          "type": "'auto' | 'micro' | 'elapsed'",
          "defaultValue": "'auto'",
          "description": "The format with which to display the time"
        },
        {
          "name": "tense",
          "type": "'auto' | 'past' | 'future'",
          "defaultValue": "'auto'",
          "description": "The tense to use when displaying a relative time"
        },
        {
          "name": "precision",
          "type": "'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'",
          "defaultValue": "'second'",
          "description": "The precision to use when displaying an elapsed time"
        },
        {
          "name": "threshold",
          "type": "string",
          "defaultValue": "'P30D'",
          "description": "The threshold (ISO8601 duration) to display relative dates within"
        },
        {
          "name": "prefix",
          "type": "string",
          "defaultValue": "'on'",
          "description": "The prefix to use when displaying a localised (non relative) date"
        },
        {
          "name": "second",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render seconds"
        },
        {
          "name": "minute",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render minutes"
        },
        {
          "name": "hour",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render hours"
        },
        {
          "name": "weekday",
          "type": "'short' | 'long' | 'narrow'",
          "defaultValue": "",
          "description": "The format with which to render weekdays"
        },
        {
          "name": "day",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render days"
        },
        {
          "name": "month",
          "type": "'numeric' | '2-digit' | 'short' | 'long' | 'narrow'",
          "defaultValue": "'numeric'",
          "description": "The format with which to render months"
        },
        {
          "name": "year",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render years"
        },
        {
          "name": "timeZoneName",
          "type": "'long' | 'short' | 'shortOffset' | 'longOffset' | 'shortGeneric' | 'longGeneric'",
          "defaultValue": "",
          "description": "The format with which to render the time zone"
        },
        {
          "name": "ref",
          "type": "React.RefObject<RelativeTimeElement>"
        },
        {
          "name": "noTitle",
          "type": "boolean",
          "defaultValue": "",
          "description": "Removes the `title` attribute provided on the element by default"
        },
        {
          "name": "attributeChangedCallback",
          "type": "(attrName: string, oldValue: unknown, newValue: unknown) => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "connectedCallback",
          "type": "() => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "onRelativeTimeUpdated",
          "type": "null | (event: RelativeTimeUpdatedEvent) => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "update",
          "type": "() => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"relative-time\""
        }
      ],
      "subcomponents": []
    },
    "segmented_control": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SegmentedControl",
      "id": "segmented_control",
      "name": "SegmentedControl",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-segmentedcontrol--default",
          "code": "() => (\n  <SegmentedControl aria-label=\"File view\">\n    <SegmentedControl.Button defaultSelected>Preview</SegmentedControl.Button>\n    <SegmentedControl.Button>Raw</SegmentedControl.Button>\n    <SegmentedControl.Button>Blame</SegmentedControl.Button>\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--with-icons",
          "code": "() => (\n  <SegmentedControl aria-label=\"File view\">\n    <SegmentedControl.Button\n      defaultSelected\n      aria-label={'Preview'}\n      leadingVisual={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingVisual={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingVisual={PeopleIcon}>\n      Blame\n    </SegmentedControl.Button>\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--controlled",
          "code": "() => {\n  const [selectedIndex, setSelectedIndex] = useState(0)\n  const handleChange = (i: number) => {\n    setSelectedIndex(i)\n  }\n  return (\n    <SegmentedControl aria-label=\"File view\" onChange={handleChange}>\n      <SegmentedControl.Button selected={selectedIndex === 0}>\n        Preview\n      </SegmentedControl.Button>\n      <SegmentedControl.Button selected={selectedIndex === 1}>\n        Raw\n      </SegmentedControl.Button>\n      <SegmentedControl.Button selected={selectedIndex === 2}>\n        Blame\n      </SegmentedControl.Button>\n    </SegmentedControl>\n  )\n}"
        },
        {
          "id": "components-segmentedcontrol-features--variant-narrow-hide-labels",
          "code": "() => (\n  <SegmentedControl\n    aria-label=\"File view\"\n    variant={{\n      narrow: 'hideLabels',\n      regular: 'default',\n      wide: 'default',\n    }}\n  >\n    <SegmentedControl.Button\n      defaultSelected\n      aria-label={'Preview'}\n      leadingVisual={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingVisual={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingVisual={PeopleIcon}>\n      Blame\n    </SegmentedControl.Button>\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--variant-narrow-action-menu",
          "code": "() => (\n  <SegmentedControl\n    aria-label=\"File view\"\n    variant={{\n      narrow: 'dropdown',\n      regular: 'default',\n      wide: 'default',\n    }}\n  >\n    <SegmentedControl.Button\n      defaultSelected\n      aria-label={'Preview'}\n      leadingVisual={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingVisual={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingVisual={PeopleIcon}>\n      Blame\n    </SegmentedControl.Button>\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--fullwidth-narrow",
          "code": "() => (\n  <SegmentedControl\n    aria-label=\"File view\"\n    fullWidth={{\n      narrow: true,\n      regular: false,\n      wide: false,\n    }}\n  >\n    <SegmentedControl.Button\n      defaultSelected\n      aria-label={'Preview'}\n      leadingVisual={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingVisual={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingVisual={PeopleIcon}>\n      Blame\n    </SegmentedControl.Button>\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--fullwidth-regular",
          "code": "() => (\n  <SegmentedControl\n    aria-label=\"File view\"\n    fullWidth={{\n      narrow: false,\n      regular: true,\n      wide: false,\n    }}\n  >\n    <SegmentedControl.Button\n      defaultSelected\n      aria-label={'Preview'}\n      leadingVisual={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingVisual={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingVisual={PeopleIcon}>\n      Blame\n    </SegmentedControl.Button>\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--fullwidth-all",
          "code": "() => (\n  <SegmentedControl aria-label=\"File view\" fullWidth>\n    <SegmentedControl.Button\n      defaultSelected\n      aria-label={'Preview'}\n      leadingVisual={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingVisual={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingVisual={PeopleIcon}>\n      Blame\n    </SegmentedControl.Button>\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--icon-only",
          "code": "() => (\n  <SegmentedControl aria-label=\"File view\">\n    <SegmentedControl.IconButton\n      defaultSelected\n      aria-label={'Preview'}\n      icon={EyeIcon}\n    />\n    <SegmentedControl.IconButton aria-label={'Raw'} icon={FileCodeIcon} />\n    <SegmentedControl.IconButton aria-label={'Blame'} icon={PeopleIcon} />\n  </SegmentedControl>\n)"
        },
        {
          "id": "components-segmentedcontrol-features--associated-with-a-label-and-caption",
          "code": "() => (\n  <div className={classes.LabelAndCaptionContainer}>\n    <div className={classes.LabelAndCaption}>\n      <Text\n        className={classes.TextLargeBold}\n        id=\"scLabel-vert\"\n        style={{\n          display: 'block',\n        }}\n      >\n        File view\n      </Text>\n      <Text\n        className={classes.TextMediumSubtle}\n        id=\"scCaption-vert\"\n        style={{\n          display: 'block',\n        }}\n      >\n        Change the way the file is viewed\n      </Text>\n    </div>\n    <SegmentedControl\n      aria-labelledby=\"scLabel-vert\"\n      aria-describedby=\"scCaption-vert\"\n    >\n      <SegmentedControl.Button defaultSelected>Preview</SegmentedControl.Button>\n      <SegmentedControl.Button>Raw</SegmentedControl.Button>\n      <SegmentedControl.Button>Blame</SegmentedControl.Button>\n    </SegmentedControl>\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "aria-describedby",
          "type": "string",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "fullWidth",
          "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
          "defaultValue": "",
          "description": "Whether the control fills the width of its parent"
        },
        {
          "name": "onChange",
          "type": "(selectedIndex?: number) => void",
          "defaultValue": "",
          "description": "The handler that gets called when a segment is selected"
        },
        {
          "name": "variant",
          "type": "| 'default' | { narrow?: 'hideLabels' | 'dropdown' | 'default' regular?: 'hideLabels' | 'dropdown' | 'default' wide?: 'hideLabels' | 'dropdown' | 'default' }",
          "defaultValue": "'default'",
          "description": "Configure alternative ways to render the control when it gets rendered in tight spaces"
        },
        {
          "name": "size",
          "type": "'small' | 'medium'",
          "description": "The size of the buttons",
          "defaultValue": ""
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        }
      ],
      "subcomponents": [
        {
          "name": "SegmentedControl.Button",
          "props": [
            {
              "name": "leadingVisual",
              "type": "Component",
              "defaultValue": "",
              "description": "The leading visual comes before item label"
            },
            {
              "name": "leadingIcon",
              "deprecated": true,
              "type": "Component",
              "defaultValue": "",
              "description": "Deprecated: use `leadingVisual` instead. The leading icon comes before item label."
            },
            {
              "name": "selected",
              "type": "boolean",
              "defaultValue": "",
              "description": "Whether the segment is selected. This is used for controlled SegmentedControls, and needs to be updated using the onChange handler on SegmentedControl."
            },
            {
              "name": "defaultSelected",
              "type": "boolean",
              "defaultValue": "",
              "description": "Whether the segment is selected. This is used for uncontrolled SegmentedControls to pick one SegmentedControlButton that is selected on the initial render."
            },
            {
              "name": "count",
              "type": "number | string",
              "defaultValue": "",
              "description": "The number to display in the counter label."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>"
            }
          ]
        },
        {
          "name": "SegmentedControl.IconButton",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": ""
            },
            {
              "name": "icon",
              "type": "Component",
              "defaultValue": "",
              "required": true,
              "description": "The icon that represents the segmented control item"
            },
            {
              "name": "selected",
              "type": "boolean",
              "defaultValue": "",
              "description": "Whether the segment is selected. This is used for controlled SegmentedControls, and needs to be updated using the onChange handler on SegmentedControl."
            },
            {
              "name": "size",
              "type": "'small' | 'medium'",
              "defaultValue": "",
              "description": "The size of the buttons"
            },
            {
              "name": "defaultSelected",
              "type": "boolean",
              "defaultValue": "",
              "description": "Whether the segment is selected. This is used for uncontrolled SegmentedControls to pick one SegmentedControlButton that is selected on the initial render."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>"
            },
            {
              "name": "tooltipDirection",
              "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
              "required": false
            },
            {
              "name": "description",
              "type": "string",
              "required": false,
              "description": "If `description` is provided, we will use a Tooltip to describe the button. Then `aria-label` is used to label the button.",
              "defaultValue": ""
            }
          ]
        }
      ]
    },
    "select": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Select",
      "id": "select",
      "name": "Select",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-select--default",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--with-option-groups",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select>\n        <Select.OptGroup label=\"Group one\">\n          <Select.Option value=\"one\">Choice one</Select.Option>\n          <Select.Option value=\"two\">Choice two</Select.Option>\n          <Select.Option value=\"three\">Choice three</Select.Option>\n          <Select.Option value=\"four\">Choice four</Select.Option>\n        </Select.OptGroup>\n        <Select.OptGroup disabled label=\"Group two\">\n          <Select.Option value=\"five\">Choice five</Select.Option>\n          <Select.Option value=\"six\">Choice six</Select.Option>\n        </Select.OptGroup>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--disabled",
          "code": "() => (\n  <form>\n    <FormControl disabled>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--with-caption",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <FormControl.Caption>This is a caption</FormControl.Caption>\n      <Select>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--visually-hidden-label",
          "code": "() => (\n  <form>\n    <Heading as=\"h2\" variant=\"small\">\n      Primer form title\n    </Heading>\n    <FormControl>\n      <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n      <Select>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n      <FormControl.Caption>\n        Label is visually hidden; the title describes the purpose visually\n      </FormControl.Caption>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--error",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n      <FormControl.Validation variant=\"error\">\n        Something went wrong\n      </FormControl.Validation>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--success",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n      <FormControl.Validation variant=\"success\">Success</FormControl.Validation>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--block",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select block>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--small",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select size=\"small\">\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--large",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select size=\"large\">\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--with-custom-styling",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select className={classes.CustomSelect}>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-select-features--with-placeholder-option",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select placeholder=\"No choice selected\">\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </form>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "block",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Creates a full width input element"
        },
        {
          "name": "contrast",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Changes background color to a higher contrast color"
        },
        {
          "name": "placeholder",
          "type": "string",
          "defaultValue": "",
          "description": "Placeholder text to show when no option is selected.\nThis option is hidden from the dropdown menu when the 'required' prop is set"
        },
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "",
          "description": "Creates a smaller or larger input than the default."
        },
        {
          "name": "validationStatus",
          "type": "'error' | 'success'",
          "defaultValue": "",
          "description": "Style the input to match the status"
        }
      ],
      "subcomponents": []
    },
    "select_panel": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SelectPanel",
      "id": "select_panel",
      "docsId": "select_panel",
      "name": "SelectPanel",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-selectpanel--default",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\" // button text when no items are selected\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        width=\"medium\"\n        message={\n          filteredItems.length === 0\n            ? {\n                variant: 'empty',\n                title: 'No items available',\n                body: '',\n              }\n            : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-item-dividers",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\" // button text when no items are selected\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-placeholder-for-search-input",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\" // button text when no items are selected\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        placeholderText=\"Filter labels\"\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--single-select",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput | undefined>(items[0])\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Label</FormControl.Label>\n      <SelectPanel\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button trailingAction={TriangleDownIcon} {...anchorProps}>\n            {children ?? 'Select Labels'}\n          </Button>\n        )}\n        placeholder=\"Select labels\" // button text when no items are selected\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--multi-select",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\"\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-external-anchor",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <Button\n        trailingAction={TriangleDownIcon}\n        ref={buttonRef}\n        onClick={() => setOpen(!open)}\n      >\n        {selected.map((selectedItem) => selectedItem.text).join(', ') ||\n          'Select labels'}\n      </Button>\n      <SelectPanel\n        renderAnchor={null}\n        anchorRef={buttonRef}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={filteredItems}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-secondary-action-button",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button trailingAction={TriangleDownIcon} {...anchorProps}>\n            {children}\n          </Button>\n        )}\n        placeholder=\"Select labels\" // button text when no items are selected\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        overlayProps={{\n          width: 'small',\n          height: 'medium',\n        }}\n        secondaryAction={\n          <SelectPanel.SecondaryActionButton>\n            Edit labels\n          </SelectPanel.SecondaryActionButton>\n        }\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-secondary-action-link",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button trailingAction={TriangleDownIcon} {...anchorProps}>\n            {children}\n          </Button>\n        )}\n        placeholder=\"Select labels\" // button text when no items are selected\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        overlayProps={{\n          width: 'small',\n          height: 'medium',\n        }}\n        secondaryAction={\n          <SelectPanel.SecondaryActionLink href=\"#\">\n            Edit labels\n          </SelectPanel.SecondaryActionLink>\n        }\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-groups",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>([])\n  const [filter, setFilter] = useState('')\n  const filteredItems = listOfItems.filter((item) =>\n    item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Options</FormControl.Label>\n      <SelectPanel\n        title=\"Attach files and symbols\"\n        subtitle=\"Choose which files and symbols you want to chat about. Use fewer references for more accurate responses.\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button trailingAction={TriangleDownIcon} {...anchorProps}>\n            {children}\n          </Button>\n        )}\n        placeholder=\"Select options\" // button text when no items are selected\n        groupMetadata={groupMetadata}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        overlayProps={{\n          width: 'large',\n          height: 'xlarge',\n        }}\n        width=\"medium\"\n        message={\n          filteredItems.length === 0 ? NoResultsMessage(filter) : undefined\n        }\n      />\n    </FormControl>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "items",
          "type": "ItemInput[]",
          "required": true,
          "description": "A collection of `Item` props and `Item`-level custom `Item` renderers.",
          "defaultValue": ""
        },
        {
          "name": "title",
          "type": "string | React.ReactElement",
          "defaultValue": "\"Select an item\" or \"Select items\"",
          "description": "A descriptive title for the panel"
        },
        {
          "name": "subtitle",
          "type": "string | React.ReactElement",
          "defaultValue": "",
          "description": "When provided, a subtitle is displayed below the title"
        },
        {
          "name": "onOpenChange",
          "type": "( open: boolean, gesture: | 'anchor-click' | 'anchor-key-press' | 'click-outside' | 'escape' | 'selection' | 'cancel' ) => void",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "placeholder",
          "type": "string",
          "defaultValue": "",
          "description": "Text used in anchor when there are no selected items"
        },
        {
          "name": "placeholderText",
          "type": "string",
          "defaultValue": "Filter items",
          "description": "Text used as placeholder for search input"
        },
        {
          "name": "inputLabel",
          "type": "string",
          "defaultValue": "Same as placeholderText",
          "description": "The aria-label for the filter input"
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "aria-label to attach to the base DOM node of the list",
          "defaultValue": ""
        },
        {
          "name": "filterValue",
          "type": "string",
          "description": "The current value of the search input",
          "defaultValue": ""
        },
        {
          "name": "selected",
          "type": "ItemInput | ItemInput[] | undefined",
          "defaultValue": "",
          "required": true,
          "description": "Specify the selected item(s)"
        },
        {
          "name": "open",
          "type": "boolean",
          "required": true,
          "description": "Determines whether the overlay portion of the component should be shown or not",
          "defaultValue": ""
        },
        {
          "name": "anchorId",
          "type": "string",
          "description": "An override to the internal id that will be spread on to the renderAnchor",
          "defaultValue": ""
        },
        {
          "name": "anchorRef",
          "type": "RefObject<HTMLElement>",
          "description": "An override to the internal renderAnchor ref that will be used to position the overlay.\nWhen renderAnchor is null this can be used to make an anchor that is detached from ActionMenu.\nAn override to the internal ref that will be spread on to the renderAnchor",
          "defaultValue": ""
        },
        {
          "name": "onSelectedChange",
          "type": "(selected: ItemInput | ItemInput[]) => void",
          "defaultValue": "",
          "required": true,
          "description": "Provide a callback called when the selected item(s) change"
        },
        {
          "name": "onFilterChange",
          "type": "(value: string, e: ChangeEvent<HTMLInputElement>) => void",
          "description": "Callback when the search input changes",
          "defaultValue": ""
        },
        {
          "name": "onCancel",
          "type": "() => void",
          "description": "(Narrow screens and variant=modal) Callback when the user hits cancel or close",
          "defaultValue": ""
        },
        {
          "name": "overlayProps",
          "type": "Partial<OverlayProps>",
          "defaultValue": "",
          "description": "See [Overlay props](/react/Overlay#props)."
        },
        {
          "name": "textInputProps",
          "type": "Partial<Omit<TextInputProps, 'onChange'>>",
          "defaultValue": "",
          "description": "See [TextInput props](/react/TextInput#props)."
        },
        {
          "name": "variant",
          "type": "'anchored' | 'modal'",
          "description": "Anchored by default, SelectPanel can be opened as a modal",
          "defaultValue": "'anchored'"
        },
        {
          "name": "footer",
          "type": "string | React.ReactElement",
          "defaultValue": "null",
          "description": "Please use `secondaryAction` instead.",
          "deprecated": true
        },
        {
          "name": "message",
          "type": "{title: string | React.ReactElement; variant: 'empty' | 'error' | 'warning';  body: React.ReactNode; icon?:React.ComponentType<IconProps>;action?: React.ReactElement;}",
          "defaultValue": "A default empty message is provided if this option is not configured. Supply a custom empty message to override the default.",
          "description": "Message to display in the panel in case of error or empty results"
        },
        {
          "name": "notice",
          "type": "{text: string | React.ReactElement; variant: 'empty' | 'error' | 'warning';}",
          "description": "Optional notice to display on top of the panel"
        },
        {
          "name": "secondaryAction",
          "type": "React.ReactElement",
          "defaultValue": "null",
          "description": "Secondary action, it will be rendered in the footer of the panel. Use `SecondaryActionButton` or `SecondaryActionLink` for the action."
        },
        {
          "name": "showSelectedOptionsFirst",
          "type": "boolean",
          "description": "Whether to display the selected items at the top of the list",
          "default": "true"
        },
        {
          "name": "showSelectAll",
          "type": "boolean",
          "defaultValue": "false",
          "description": "When `true` and on a multi-select SelectPanel, displays a 'Select all' checkbox that allows users to select or deselect all visible items at once. The checkbox label automatically toggles between 'Select all' and 'Deselect all' based on the current selection state, and shows an indeterminate state when some items are selected."
        },
        {
          "name": "disableFullscreenOnNarrow",
          "type": "boolean",
          "description": "Whether to disable fullscreen behavior on narrow viewports. When `true`, the panel will maintain its anchored position regardless of viewport size. When `false`, the panel will go fullscreen on narrow viewports (if feature flag is enabled).",
          "defaultValue": "undefined (uses feature flag default)"
        },
        {
          "name": "loading",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the panel is in a loading state. When `true`, the panel will display a loading spinner. If `loading` is not provided, the panel will infer the loading state based on the contents of `items` available."
        },
        {
          "name": "align",
          "type": "'start' | 'end' | 'center'",
          "defaultValue": "'start'",
          "description": "Determines the alignment of the panel relative to the anchor. Defaults to 'start' which aligns the left edge of the panel with the left edge of the anchor."
        },
        {
          "name": "scrollContainerRef",
          "type": "React.Ref<HTMLDivElement | null>",
          "defaultValue": "undefined",
          "description": "A ref assigned to the scrollable container wrapping the ActionList"
        },
        {
          "name": "actionListProps",
          "type": "Partial<ActionListProps>",
          "defaultValue": "undefined",
          "description": "See [ActionList props](/react/ActionList#props)."
        },
        {
          "name": "focusOutBehavior",
          "type": "'start' | 'wrap'",
          "defaultValue": "'wrap'",
          "description": "Determines how keyboard focus behaves when navigating beyond the first or last item in the list."
        },
        {
          "name": "onActiveDescendantChanged",
          "type": "(newActiveDescendant: HTMLElement | undefined, previousActiveDescendant: HTMLElement | undefined, directlyActivated: boolean) => void | undefined",
          "defaultValue": "undefined",
          "description": "Callback function that is called when the active descendant changes."
        },
        {
          "name": "virtualized",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, enables client-side list virtualization. Only the visible items plus a small overscan buffer are rendered in the DOM, dramatically improving performance for large lists. Recommended for lists with more than 100 items. Has no effect when `groupMetadata` is provided."
        },
        {
          "name": "displayInViewport",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the panel will attempt to fit entirely into the visible viewport, without having to scroll."
        }
      ],
      "subcomponents": []
    },
    "skeleton_box": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Skeleton",
      "id": "skeleton_box",
      "name": "SkeletonBox",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-skeleton-skeletonbox--default",
          "code": "() => <SkeletonBox />"
        },
        {
          "id": "components-skeleton-skeletonbox-features--custom-height",
          "code": "() => <SkeletonBox height=\"4rem\" />"
        },
        {
          "id": "components-skeleton-skeletonbox-features--custom-width",
          "code": "() => <SkeletonBox width=\"300px\" />"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "delay",
          "type": "'short' | 'long' | number",
          "description": "Controls whether and how long to delay rendering the SkeletonBox. Set to 'short' to delay by 300ms, 'long' to delay by 1000ms, or provide a custom number of milliseconds.",
          "defaultValue": "false"
        },
        {
          "name": "width",
          "type": "string",
          "description": "Width of the skeleton box. Accepts any valid CSS `width` value."
        },
        {
          "name": "height",
          "defaultValue": "1rem",
          "type": "string",
          "description": "Height of the skeleton box. Accepts any valid CSS `height` value."
        },
        {
          "name": "className",
          "type": "string",
          "description": "The className of the skeleton box",
          "defaultValue": ""
        }
      ],
      "subcomponents": []
    },
    "skeleton_avatar": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SkeletonAvatar",
      "id": "skeleton_avatar",
      "name": "SkeletonAvatar",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-skeleton-skeletonavatar--default",
          "code": "() => <SkeletonAvatar />"
        },
        {
          "id": "components-skeleton-skeletonavatar-features--square",
          "code": "() => <SkeletonAvatar square />"
        },
        {
          "id": "components-skeleton-skeletonavatar-features--size",
          "code": "() => (\n  <div>\n    <SkeletonAvatar size={4} />\n    <SkeletonAvatar size={8} />\n    <SkeletonAvatar size={12} />\n    <SkeletonAvatar size={16} />\n    <SkeletonAvatar size={20} />\n    <SkeletonAvatar size={24} />\n    <SkeletonAvatar size={28} />\n    <SkeletonAvatar size={32} />\n    <SkeletonAvatar size={40} />\n    <SkeletonAvatar size={48} />\n    <SkeletonAvatar size={56} />\n    <SkeletonAvatar size={64} />\n  </div>\n)"
        },
        {
          "id": "components-skeleton-skeletonavatar-features--size-responsive",
          "code": "() => (\n  <div>\n    <SkeletonAvatar\n      size={{\n        narrow: 4,\n        regular: 8,\n        wide: 12,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 8,\n        regular: 12,\n        wide: 16,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 12,\n        regular: 16,\n        wide: 20,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 16,\n        regular: 20,\n        wide: 24,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 20,\n        regular: 24,\n        wide: 28,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 24,\n        regular: 28,\n        wide: 32,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 28,\n        regular: 32,\n        wide: 40,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 32,\n        regular: 40,\n        wide: 48,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 40,\n        regular: 48,\n        wide: 56,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 48,\n        regular: 56,\n        wide: 64,\n      }}\n    />\n  </div>\n)"
        },
        {
          "id": "components-skeleton-skeletonavatar-features--in-a-stack",
          "code": "() => (\n  <AvatarStack>\n    <SkeletonAvatar />\n    <SkeletonAvatar />\n    <SkeletonAvatar />\n    <SkeletonAvatar />\n  </AvatarStack>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "size",
          "type": "number | { narrow?: number; regular?: number; wide?: number; }",
          "defaultValue": "20",
          "description": "The size of the avatar in pixels."
        },
        {
          "name": "square",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the avatar will be square instead of circular."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling."
        }
      ],
      "subcomponents": []
    },
    "skeleton_text": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SkeletonText",
      "id": "skeleton_text",
      "name": "SkeletonText",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-skeleton-skeletontext--default",
          "code": "() => <SkeletonText />"
        },
        {
          "id": "components-skeleton-skeletontext-features--with-max-width",
          "code": "() => <SkeletonText maxWidth={200} />"
        },
        {
          "id": "components-skeleton-skeletontext-features--with-multiple-lines",
          "code": "() => <SkeletonText lines={3} />"
        },
        {
          "id": "components-skeleton-skeletontext-features--display",
          "code": "() => <SkeletonText size=\"display\" />"
        },
        {
          "id": "components-skeleton-skeletontext-features--subtitle",
          "code": "() => <SkeletonText size=\"subtitle\" />"
        },
        {
          "id": "components-skeleton-skeletontext-features--title-large",
          "code": "() => <SkeletonText size=\"titleLarge\" />"
        },
        {
          "id": "components-skeleton-skeletontext-features--title-medium",
          "code": "() => <SkeletonText size=\"titleMedium\" />"
        },
        {
          "id": "components-skeleton-skeletontext-features--title-small",
          "code": "() => <SkeletonText size=\"titleSmall\" />"
        },
        {
          "id": "components-skeleton-skeletontext-features--body-large",
          "code": "() => <SkeletonText size=\"bodyLarge\" />"
        },
        {
          "id": "components-skeleton-skeletontext-features--body-medium",
          "code": "() => <SkeletonText size=\"bodyMedium\" />"
        },
        {
          "id": "components-skeleton-skeletontext-features--body-small",
          "code": "() => <SkeletonText size=\"bodySmall\" />"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "size",
          "defaultValue": "'bodyMedium'",
          "type": "'display' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall' | 'subtitle'",
          "description": "Size of the text that the skeleton is replacing."
        },
        {
          "name": "lines",
          "defaultValue": "1",
          "type": "number",
          "description": "Number of lines of skeleton text to render."
        },
        {
          "name": "maxWidth",
          "type": "string",
          "description": "Maximum width that the line(s) of skeleton text can take up.  Accepts any valid CSS `max-width` value."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling."
        }
      ],
      "subcomponents": []
    },
    "spinner": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Spinner",
      "a11yReviewed": "2025-01-08",
      "id": "spinner",
      "importPath": "@primer/react",
      "name": "Spinner",
      "props": [
        {
          "description": "Sets the width and height of the spinner.",
          "name": "size",
          "type": "'small' | 'medium' | 'large'"
        },
        {
          "defaultValue": "Loading",
          "description": "Sets the text conveyed by assistive technologies such as screen readers. Set to `null` if the loading state is displayed in a text node somewhere else on the page.",
          "name": "srText",
          "type": "string | null"
        },
        {
          "deprecated": true,
          "description": "Sets the text conveyed by assistive technologies such as screen readers.",
          "name": "aria-label",
          "type": "string"
        },
        {
          "defaultValue": "",
          "description": "",
          "name": "className",
          "type": "string"
        },
        {
          "name": "data-*",
          "type": "string"
        },
        {
          "defaultValue": "false",
          "description": "Controls whether and how long to delay rendering the spinner. Set to `true` to delay by 1000ms, `'short'` to delay by 300ms, `'long'` to delay by 1000ms, or provide a custom number of milliseconds.",
          "name": "delay",
          "type": "boolean | 'short' | 'long' | number"
        }
      ],
      "status": "alpha",
      "stories": [
        {
          "id": "components-spinner--default",
          "code": "() => <Spinner />"
        },
        {
          "id": "components-spinner-features--small",
          "code": "() => <Spinner size=\"small\" />"
        },
        {
          "id": "components-spinner-features--large",
          "code": "() => <Spinner size=\"large\" />"
        },
        {
          "id": "components-spinner-features--suppress-screen-reader-text",
          "code": "() => (\n  <Stack direction=\"horizontal\" className={classes.SuppressScreenReaderText}>\n    <Spinner size=\"small\" srText={null} />\n    <AriaStatus>Loading...</AriaStatus>\n  </Stack>\n)"
        },
        {
          "id": "components-spinner-features--with-delay",
          "code": "() => <Spinner delay=\"long\" />"
        }
      ],
      "subcomponents": []
    },
    "split_page_layout": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SplitPageLayout",
      "id": "split_page_layout",
      "name": "SplitPageLayout",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-splitpagelayout--default",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Header>\n      <Placeholder label=\"Header\" height={100} />\n    </SplitPageLayout.Header>\n    <SplitPageLayout.Pane position=\"start\" aria-label=\"Pane\">\n      <Placeholder label=\"Pane\" height={400} />\n    </SplitPageLayout.Pane>\n    <SplitPageLayout.Content>\n      <Placeholder label=\"Content\" height={600} />\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <Placeholder label=\"Footer\" height={100} />\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--settings-page",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Pane position=\"start\" aria-label=\"Navigation Pane\">\n      <NavList aria-label=\"Main navigation\">\n        <NavList.Item href=\"#\">Profile</NavList.Item>\n        <NavList.Item href=\"#\" aria-current=\"page\">\n          Account\n        </NavList.Item>\n        <NavList.Item href=\"#\">Emails</NavList.Item>\n        <NavList.Item href=\"#\">Notifications</NavList.Item>\n      </NavList>\n    </SplitPageLayout.Pane>\n    <SplitPageLayout.Content>\n      <Heading as=\"h2\" className={classes.SectionHeading}>\n        Danger zone\n      </Heading>\n      <div className={classes.DeleteAccountContainer}>\n        <div className={classes.DeleteAccountTextContainer}>\n          <p className={classes.DeleteAccountTitle}>Delete account</p>\n          <p className={classes.DeleteAccountDescription}>\n            Are you sure you don&apos;t want to just downgrade your account to a\n            free account? We won&apos;t charge your credit card anymore.\n          </p>\n        </div>\n        <Button variant=\"danger\">Delete account</Button>\n      </div>\n    </SplitPageLayout.Content>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--with-sidebar-start",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Sidebar\n      position=\"start\"\n      aria-label=\"Inspector sidebar\"\n      style={{\n        height: 'auto',\n      }}\n    >\n      <div className={classes.SidebarContent}>\n        <p className={classes.SidebarHeading}>Sidebar</p>\n        <p className={classes.SidebarText}>\n          This sidebar spans the full height of the layout, adjacent to the\n          header, content, and footer.\n        </p>\n      </div>\n    </SplitPageLayout.Sidebar>\n    <SplitPageLayout.Header>\n      <Heading as=\"h1\">Page Title</Heading>\n    </SplitPageLayout.Header>\n    <SplitPageLayout.Pane position=\"start\" aria-label=\"Navigation Pane\">\n      <NavList aria-label=\"Main navigation\">\n        <NavList.Item href=\"#\">Profile</NavList.Item>\n        <NavList.Item href=\"#\" aria-current=\"page\">\n          Account\n        </NavList.Item>\n        <NavList.Item href=\"#\">Emails</NavList.Item>\n        <NavList.Item href=\"#\">Notifications</NavList.Item>\n      </NavList>\n    </SplitPageLayout.Pane>\n    <SplitPageLayout.Content>\n      <Heading as=\"h2\" className={classes.SectionHeading}>\n        Danger zone\n      </Heading>\n      <div className={classes.DeleteAccountContainer}>\n        <div className={classes.DeleteAccountTextContainer}>\n          <p className={classes.DeleteAccountTitle}>Delete account</p>\n          <p className={classes.DeleteAccountDescription}>\n            Are you sure you don&apos;t want to just downgrade your account to a\n            free account? We won&apos;t charge your credit card anymore.\n          </p>\n        </div>\n        <Button variant=\"danger\">Delete account</Button>\n      </div>\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <p>Footer content</p>\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--with-sidebar-end",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Sidebar\n      position=\"end\"\n      aria-label=\"Inspector sidebar\"\n      style={{\n        height: 'auto',\n      }}\n    >\n      <div className={classes.SidebarContent}>\n        <p className={classes.SidebarHeading}>Inspector</p>\n        <p className={classes.SidebarText}>\n          This sidebar is positioned at the end (right side) and spans the full\n          height.\n        </p>\n      </div>\n    </SplitPageLayout.Sidebar>\n    <SplitPageLayout.Header>\n      <Heading as=\"h1\">Page Title</Heading>\n    </SplitPageLayout.Header>\n    <SplitPageLayout.Pane position=\"start\" aria-label=\"Navigation Pane\">\n      <NavList aria-label=\"Main navigation\">\n        <NavList.Item href=\"#\">Profile</NavList.Item>\n        <NavList.Item href=\"#\" aria-current=\"page\">\n          Account\n        </NavList.Item>\n        <NavList.Item href=\"#\">Emails</NavList.Item>\n        <NavList.Item href=\"#\">Notifications</NavList.Item>\n      </NavList>\n    </SplitPageLayout.Pane>\n    <SplitPageLayout.Content>\n      <Heading as=\"h2\" className={classes.SectionHeading}>\n        Account Settings\n      </Heading>\n      <p>Main content area</p>\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <p>Footer content</p>\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--with-resizable-sidebar",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Sidebar\n      resizable\n      position=\"start\"\n      aria-label=\"Resizable sidebar\"\n      style={{\n        height: 'auto',\n      }}\n    >\n      <div className={classes.SidebarContent}>\n        <p className={classes.SidebarHeading}>Resizable Sidebar</p>\n        <p className={classes.SidebarText}>\n          Drag the edge to resize this sidebar. The width will be persisted\n          across sessions.\n        </p>\n      </div>\n    </SplitPageLayout.Sidebar>\n    <SplitPageLayout.Header>\n      <Heading as=\"h1\">Page Title</Heading>\n    </SplitPageLayout.Header>\n    <SplitPageLayout.Content>\n      <Heading as=\"h2\" className={classes.SectionHeading}>\n        Main Content\n      </Heading>\n      <p>\n        This layout has a resizable sidebar that can be dragged to adjust its\n        width.\n      </p>\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <p>Footer content</p>\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--with-sidebar-and-resizable-pane",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Sidebar\n      resizable\n      position=\"start\"\n      aria-label=\"Navigation sidebar\"\n      style={{\n        height: 'auto',\n      }}\n    >\n      <div className={classes.SidebarContent}>\n        <p className={classes.SidebarHeading}>Sidebar</p>\n        <p className={classes.SidebarText}>Full-height resizable sidebar</p>\n      </div>\n    </SplitPageLayout.Sidebar>\n    <SplitPageLayout.Header>\n      <Heading as=\"h1\">Page Title</Heading>\n    </SplitPageLayout.Header>\n    <SplitPageLayout.Pane resizable position=\"end\" aria-label=\"Details pane\">\n      <div className={classes.SidebarContent}>\n        <p className={classes.SidebarHeading}>Details Pane</p>\n        <p className={classes.SidebarText}>\n          This pane is also resizable and sits beside the content.\n        </p>\n      </div>\n    </SplitPageLayout.Pane>\n    <SplitPageLayout.Content>\n      <Heading as=\"h2\" className={classes.SectionHeading}>\n        Main Content\n      </Heading>\n      <p>\n        This layout demonstrates using both a full-height sidebar and a\n        resizable pane together. The sidebar spans the entire height while the\n        pane sits adjacent to the content area only.\n      </p>\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <p>Footer content</p>\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--with-sticky-sidebar",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Sidebar\n      sticky\n      position=\"start\"\n      aria-label=\"Sticky sidebar\"\n    >\n      <div className={classes.SidebarContent}>\n        <p className={classes.SidebarHeading}>Sticky Sidebar</p>\n        <p className={classes.SidebarText}>\n          This sidebar stays fixed in the viewport as you scroll the page\n          content.\n        </p>\n      </div>\n    </SplitPageLayout.Sidebar>\n    <SplitPageLayout.Header>\n      <Heading as=\"h1\">Page Title</Heading>\n    </SplitPageLayout.Header>\n    <SplitPageLayout.Content>\n      <Heading as=\"h2\" className={classes.SectionHeading}>\n        Scrollable Content\n      </Heading>\n      {Array.from({\n        length: 20,\n      }).map((_, i) => (\n        <p key={i}>\n          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at enim\n          id lorem tempus egestas a non ipsum. Maecenas imperdiet ante quam, at\n          varius lorem molestie vel.\n        </p>\n      ))}\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <p>Footer content</p>\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--sidebar-fullscreen-responsive-variant",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Sidebar\n      position=\"start\"\n      responsiveVariant=\"fullscreen\"\n      aria-label=\"Fullscreen sidebar\"\n      style={{\n        height: 'auto',\n      }}\n    >\n      <div className={classes.SidebarContent}>\n        <p className={classes.SidebarHeading}>Fullscreen on Narrow</p>\n        <p className={classes.SidebarText}>\n          Resize the viewport below 768px to see this sidebar expand to fill the\n          entire screen.\n        </p>\n      </div>\n    </SplitPageLayout.Sidebar>\n    <SplitPageLayout.Header>\n      <Heading as=\"h1\">Page Title</Heading>\n    </SplitPageLayout.Header>\n    <SplitPageLayout.Content>\n      <Heading as=\"h2\" className={classes.SectionHeading}>\n        Main Content\n      </Heading>\n      <p>This content is hidden behind the sidebar at narrow viewports.</p>\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <p>Footer content</p>\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "className",
          "type": "string"
        }
      ],
      "subcomponents": [
        {
          "name": "SplitPageLayout.Header",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the header."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'line'",
              "description": ""
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the header is hidden."
            }
          ]
        },
        {
          "name": "SplitPageLayout.Content",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "'main'",
              "description": "Change the root node to another HTML element or custom component."
            },
            {
              "name": "width",
              "type": "| 'full' | 'medium' | 'large' | 'xlarge'",
              "defaultValue": "'large'",
              "description": "The maximum width of the content region."
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the content."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            }
          ]
        },
        {
          "name": "SplitPageLayout.Pane",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "description": "Label for the pane. Required if the pane overflows and doesn't have aria-labelledby."
            },
            {
              "name": "aria-labelledby",
              "type": "string | undefined",
              "description": "Id of an element that acts as a label for the pane. Required if the pane overflows and doesn't have aria-label."
            },
            {
              "name": "width",
              "type": "| 'small' | 'medium' | 'large' | { min: string max: string default: string }",
              "defaultValue": "'medium'",
              "description": "The width of the pane. If using custom widths, provide an object with keys 'min', 'max' and 'default'."
            },
            {
              "name": "minWidth",
              "type": "number",
              "defaultValue": "256",
              "description": "The minimum width of the pane."
            },
            {
              "name": "resizable",
              "type": "boolean",
              "defaultValue": "false",
              "description": "When true, the pane may be resized by the user. Uses localStorage persistence by default. Note: with default persistence in SSR, the server-rendered width may differ from the stored client width, causing a brief layout shift on hydration. Use `onResizeEnd` with server-aware storage to avoid this."
            },
            {
              "name": "currentWidth",
              "type": "number | undefined",
              "description": "Current/controlled width value in pixels. Required when `onResizeEnd` is provided. Pass `undefined` when the persisted value has not loaded yet. The `width` prop still defines the default used when resetting (e.g., double-click)."
            },
            {
              "name": "onResizeEnd",
              "type": "(width: number) => void",
              "description": "Callback fired when a resize operation ends (drag release or keyboard key up). When provided, replaces localStorage persistence. Requires `currentWidth`."
            },
            {
              "name": "widthStorageKey",
              "type": "string",
              "defaultValue": "'paneWidth'",
              "description": "localStorage key used to persist the pane width across sessions. Only applies when `resizable` is `true` and no `onResizeEnd` callback is provided."
            },
            {
              "name": "sticky",
              "type": "boolean",
              "defaultValue": "true",
              "description": "Whether the pane should stick to the top of the screen while the content scrolls."
            },
            {
              "name": "offsetHeader",
              "type": "number | string",
              "defaultValue": "0",
              "description": "Use offsetHeader along with the sticky prop to push the sticky pane down to make room for a sticky header if necessary. Use the type `string` to specify the height with a unit i.e. 5rem; otherwise the type `number` will be taken as px."
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the pane."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'line'",
              "description": ""
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the pane is hidden."
            },
            {
              "name": "position",
              "type": "'end' | 'start' | {narrow?: 'end' | 'start', narrow?: 'end' | 'start', wide?: 'end' | 'start'}",
              "description": "Which side of the page the pane should be on. Can be changed for different viewport widths.",
              "defaultValue": "start"
            }
          ]
        },
        {
          "name": "SplitPageLayout.Sidebar",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "description": "A unique label for the sidebar region."
            },
            {
              "name": "aria-labelledby",
              "type": "string | undefined",
              "description": "An id to an element which uniquely labels the sidebar region."
            },
            {
              "name": "position",
              "type": "'start' | 'end'",
              "defaultValue": "'start'",
              "description": "Position of the sidebar relative to the page layout. The sidebar spans the full height of the layout, adjacent to the header, content, and footer."
            },
            {
              "name": "width",
              "type": "| 'small' | 'medium' | 'large' | { min: string max: string default: string }",
              "defaultValue": "'medium'",
              "description": "The width of the sidebar. If using custom widths, provide an object with keys 'min', 'max' and 'default'."
            },
            {
              "name": "minWidth",
              "type": "number",
              "defaultValue": "256",
              "description": "Minimum width of the sidebar when resizable."
            },
            {
              "name": "resizable",
              "type": "boolean",
              "defaultValue": "false",
              "description": "When true, the sidebar may be resized by the user. Width is persisted to localStorage by default."
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the sidebar."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line'",
              "defaultValue": "'line'",
              "description": "Divider style between the sidebar and the rest of the layout."
            },
            {
              "name": "sticky",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the sidebar sticks to the viewport when scrolling. When enabled, the sidebar uses position: sticky with top: 0 and height: 100vh."
            },
            {
              "name": "responsiveVariant",
              "type": "| 'default' | 'fullscreen'",
              "defaultValue": "'default'",
              "description": "Controls sidebar behavior at narrow viewport widths (below 768px). 'default' retains its normal inline layout. 'fullscreen' expands to cover the full viewport like a dialog overlay."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the sidebar is hidden."
            }
          ]
        },
        {
          "name": "SplitPageLayout.Footer",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the footer."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'line'",
              "description": ""
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the footer is hidden."
            }
          ]
        }
      ]
    },
    "stack": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Stack",
      "id": "stack",
      "name": "Stack",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-stack--default",
          "code": "() => (\n  <Stack>\n    <div\n      style={{\n        background: 'var(--display-lemon-bgColor-muted)',\n        borderRadius: 'var(--borderRadius-medium)',\n        padding: 'var(--base-size-8)',\n      }}\n    >\n      First\n    </div>\n    <div\n      style={{\n        background: 'var(--display-olive-bgColor-muted)',\n        borderRadius: 'var(--borderRadius-medium)',\n        padding: 'var(--base-size-8)',\n      }}\n    >\n      Second\n    </div>\n    <div\n      style={{\n        background: 'var(--display-lime-bgColor-muted)',\n        borderRadius: 'var(--borderRadius-medium)',\n        padding: 'var(--base-size-8)',\n      }}\n    >\n      Third\n    </div>\n  </Stack>\n)"
        },
        {
          "id": "components-stack-features--gap-scale",
          "code": "() => (\n  <Stack gap=\"spacious\">\n    {(\n      ['none', 'tight', 'condensed', 'cozy', 'normal', 'spacious'] as const\n    ).map((gap) => (\n      <Stack key={gap}>\n        <span\n          style={{\n            fontSize: 'var(--text-body-size-small)',\n            color: 'var(--fgColor-muted)',\n          }}\n        >\n          gap=&quot;{gap}&quot;\n        </span>\n        <Stack direction=\"horizontal\" gap={gap}>\n          <Placeholder label=\"A\" />\n          <Placeholder label=\"B\" />\n          <Placeholder label=\"C\" />\n        </Stack>\n      </Stack>\n    ))}\n  </Stack>\n)"
        },
        {
          "id": "components-stack-features--directional-padding",
          "code": "() => (\n  <Stack gap=\"normal\">\n    <Stack\n      padding=\"normal\"\n      style={{\n        backgroundColor: 'var(--bgColor-muted)',\n      }}\n    >\n      <Placeholder label='padding=\"normal\" (all sides)' />\n    </Stack>\n    <Stack\n      padding=\"normal\"\n      paddingInline=\"spacious\"\n      style={{\n        backgroundColor: 'var(--bgColor-muted)',\n      }}\n    >\n      <Placeholder label='padding=\"normal\" paddingInline=\"spacious\"' />\n    </Stack>\n    <Stack\n      paddingBlock=\"condensed\"\n      paddingInline=\"spacious\"\n      style={{\n        backgroundColor: 'var(--bgColor-muted)',\n      }}\n    >\n      <Placeholder label='paddingBlock=\"condensed\" paddingInline=\"spacious\"' />\n    </Stack>\n  </Stack>\n)"
        },
        {
          "id": "components-stack-features--padding-scale",
          "code": "() => (\n  <Stack gap=\"spacious\">\n    {(\n      ['none', 'tight', 'condensed', 'cozy', 'normal', 'spacious'] as const\n    ).map((padding) => (\n      <Stack key={padding}>\n        <span\n          style={{\n            fontSize: 'var(--text-body-size-small)',\n            color: 'var(--fgColor-muted)',\n          }}\n        >\n          padding=&quot;{padding}&quot;\n        </span>\n        <Stack\n          padding={padding}\n          style={{\n            backgroundColor: 'var(--bgColor-muted)',\n          }}\n        >\n          <Placeholder label=\"Content\" />\n        </Stack>\n      </Stack>\n    ))}\n  </Stack>\n)"
        },
        {
          "id": "components-stack-features--shrinking-stack-items",
          "code": "() => (\n  <div\n    style={{\n      maxWidth: '200px',\n      padding: 'var(--base-size-8)',\n    }}\n  >\n    <Stack direction=\"horizontal\" gap=\"condensed\">\n      <Stack.Item shrink={false}>\n        <ShieldLockIcon size=\"small\" />\n      </Stack.Item>\n      <Stack.Item>\n        This stack has the leading icon set to prevent shrinking\n      </Stack.Item>\n    </Stack>\n    <Stack direction=\"horizontal\" gap=\"condensed\">\n      <Stack.Item shrink={true}>\n        <ShieldLockIcon size=\"small\" />\n      </Stack.Item>\n      <Stack.Item>\n        This stack item does not have the icon set to prevent shrinking\n      </Stack.Item>\n    </Stack>\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "gap",
          "type": "'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious' | ResponsiveValue<'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious'>",
          "description": "Specify the gap between children elements in the stack."
        },
        {
          "name": "direction",
          "type": "'horizontal' | 'vertical' | ResponsiveValue<'horizontal' | 'vertical'>",
          "description": "Specify the orientation for the stack container."
        },
        {
          "name": "align",
          "type": "'stretch' | 'start' | 'center' | 'end' | 'baseline' | ResponsiveValue<'stretch' | 'start' | 'center' | 'end' | 'baseline'>",
          "description": "Specify the alignment between items in the cross-axis of the orientation."
        },
        {
          "name": "wrap",
          "type": "'wrap' | 'nowrap' | ResponsiveValue<'wrap' | 'nowrap'>",
          "description": "Specify whether items are forced onto one line or can wrap onto multiple lines."
        },
        {
          "name": "justify",
          "type": "'start' | 'center' | 'end' | 'space-between' | 'space-evenly' | ResponsiveValue<'start' | 'center' | 'end' | 'space-between' | 'space-evenly'>",
          "description": "Specify how items will be distributed in the stacking direction."
        },
        {
          "name": "padding",
          "type": "'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious' | ResponsiveValue<'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious'>",
          "description": "Specify the padding of the stack container."
        },
        {
          "name": "paddingBlock",
          "type": "'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious' | ResponsiveValue<'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious'>",
          "description": "Specify the block (vertical) padding of the stack container. Overrides the block axis of padding when both are set."
        },
        {
          "name": "paddingInline",
          "type": "'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious' | ResponsiveValue<'none' | 'tight' | 'condensed' | 'cozy' | 'normal' | 'spacious'>",
          "description": "Specify the inline (horizontal) padding of the stack container. Overrides the inline axis of padding when both are set."
        },
        {
          "name": "className",
          "type": "string"
        }
      ],
      "subcomponents": [
        {
          "name": "Stack.Item",
          "props": [
            {
              "name": "grow",
              "type": "boolean | ResponsiveValue<boolean>",
              "description": "Allow item to keep size or expand to fill the available space."
            },
            {
              "name": "shrink",
              "type": "boolean | ResponsiveValue<boolean>",
              "description": "Allow item to keep size or shrink to fit the available space."
            },
            {
              "name": "className",
              "type": "string"
            }
          ]
        }
      ]
    },
    "state_label": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/StateLabel",
      "id": "state_label",
      "name": "StateLabel",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-statelabel-features--issue-opened",
          "code": "() => <StateLabel status=\"issueOpened\">Open</StateLabel>"
        },
        {
          "id": "components-statelabel-features--issue-closed",
          "code": "() => <StateLabel status=\"issueClosed\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--issue-closed-not-planned",
          "code": "() => <StateLabel status=\"issueClosedNotPlanned\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--issue-draft",
          "code": "() => <StateLabel status=\"issueDraft\">Draft</StateLabel>"
        },
        {
          "id": "components-statelabel-features--pull-opened",
          "code": "() => <StateLabel status=\"pullOpened\">Open</StateLabel>"
        },
        {
          "id": "components-statelabel-features--pull-closed",
          "code": "() => <StateLabel status=\"pullClosed\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--pull-merged",
          "code": "() => <StateLabel status=\"pullMerged\">Merged</StateLabel>"
        },
        {
          "id": "components-statelabel-features--queued",
          "code": "() => <StateLabel status=\"pullQueued\">Queued</StateLabel>"
        },
        {
          "id": "components-statelabel-features--draft",
          "code": "() => <StateLabel status=\"draft\">Draft</StateLabel>"
        },
        {
          "id": "components-statelabel-features--unavailable",
          "code": "() => <StateLabel status=\"unavailable\">Unavailable</StateLabel>"
        },
        {
          "id": "components-statelabel-features--alert-opened",
          "code": "() => <StateLabel status=\"alertOpened\">Open</StateLabel>"
        },
        {
          "id": "components-statelabel-features--alert-fixed",
          "code": "() => <StateLabel status=\"alertFixed\">Fixed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--alert-dismissed",
          "code": "() => <StateLabel status=\"alertDismissed\">Dismissed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--alert-closed",
          "code": "() => <StateLabel status=\"alertClosed\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--small",
          "code": "() => (\n  <StateLabel status=\"issueOpened\" size=\"small\">\n    Open\n  </StateLabel>\n)"
        },
        {
          "id": "components-statelabel-features--open",
          "code": "() => (\n  <StateLabel status=\"open\">\n    {/* Because open is a generic status, a visually hidden text could be added to specify the type of the artifact */}\n    <VisuallyHidden>Milestone</VisuallyHidden>\n    Open\n  </StateLabel>\n)"
        },
        {
          "id": "components-statelabel-features--closed",
          "code": "() => <StateLabel status=\"closed\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--archived",
          "code": "() => <StateLabel status=\"archived\">Archived</StateLabel>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "variant",
          "type": "'small' | 'normal'",
          "defaultValue": "'normal'"
        },
        {
          "name": "status",
          "type": "'issueOpened' | 'issueClosed' | 'issueClosedNotPlanned' | 'pullOpened' | 'pullClosed' | 'pullMerged' | 'draft' | 'issueDraft' | 'pullQueued' | 'unavailable' | 'alertOpened' | 'alertFixed' | 'alertDismissed' | 'alertClosed' | 'open' | 'closed' | 'archived'",
          "required": true
        }
      ],
      "subcomponents": []
    },
    "sub_nav": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SubNav",
      "id": "sub_nav",
      "name": "SubNav",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-subnav-features--selected",
          "code": "() => (\n  <SubNav aria-label=\"Main\">\n    <SubNav.Links>\n      <SubNav.Link href=\"#home\" selected>\n        Home\n      </SubNav.Link>\n      <SubNav.Link href=\"#documentation\">Documentation</SubNav.Link>\n      <SubNav.Link href=\"#support\">Support</SubNav.Link>\n    </SubNav.Links>\n  </SubNav>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "actions",
          "type": "React.ReactNode",
          "description": "Place another element, such as a button, to the opposite side of the navigation items."
        },
        {
          "name": "align",
          "type": "'right'",
          "description": "Use `right` to have navigation items aligned right."
        },
        {
          "name": "full",
          "type": "boolean",
          "description": "Used to make navigation fill the width of the container."
        },
        {
          "name": "label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element.",
          "defaultValue": ""
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element."
        }
      ],
      "subcomponents": [
        {
          "name": "SubNav.Link",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "default": "'a'"
            },
            {
              "name": "href",
              "type": "string"
            },
            {
              "name": "selected",
              "type": "boolean",
              "description": "Whether this item represents the current page"
            },
            {
              "name": "to",
              "type": "string | Partial<Path>",
              "description": "Used when the item is rendered using a component like React Router's `Link`. The path to navigate to."
            }
          ]
        },
        {
          "name": "SubNav.Links",
          "props": []
        }
      ]
    },
    "tab_nav": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TabNav",
      "id": "tab_nav",
      "name": "TabNav",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-tabnav--default",
          "code": "() => (\n  <TabNav aria-label=\"Main\">\n    <TabNav.Link href=\"#\" selected>\n      Home\n    </TabNav.Link>\n    <TabNav.Link href=\"#\">Documentation</TabNav.Link>\n    <TabNav.Link href=\"#\">Support</TabNav.Link>\n  </TabNav>\n)"
        },
        {
          "id": "deprecated-components-tabnav-features--selected",
          "code": "() => (\n  <TabNav aria-label=\"Main\">\n    <TabNav.Link href=\"#\">Home</TabNav.Link>\n    <TabNav.Link href=\"#\" selected>\n      Documentation\n    </TabNav.Link>\n    <TabNav.Link href=\"#\">Support</TabNav.Link>\n  </TabNav>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element."
        }
      ],
      "subcomponents": [
        {
          "name": "TabNav.Link",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "'a'"
            },
            {
              "name": "href",
              "type": "string"
            },
            {
              "name": "selected",
              "type": "boolean"
            },
            {
              "name": "to",
              "type": "string | Partial<Path>",
              "description": "Used when the item is rendered using a component like React Router's `Link`. The path to navigate to."
            }
          ]
        }
      ]
    },
    "text": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Text",
      "id": "text",
      "name": "Text",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-text--default",
          "code": "() => <Text>Default Text</Text>"
        },
        {
          "id": "components-text-features--polymorphism",
          "code": "() => (\n  <div className={classes.PolymorphismContainer}>\n    <Text as=\"em\">Emphasized text</Text>\n    <Text as=\"i\">Italicized text</Text>\n    <Text as=\"strong\">Strong text</Text>\n    <Text as=\"small\">Small text</Text>\n    <Text as=\"u\">Text with underline</Text>\n  </div>\n)"
        },
        {
          "id": "components-text-features--styled-text",
          "code": "() => (\n  <Text as=\"p\" className={classes.StyledText} size=\"small\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--size-small",
          "code": "() => (\n  <Text as=\"span\" size=\"small\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--size-medium",
          "code": "() => (\n  <Text as=\"span\" size=\"medium\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--size-large",
          "code": "() => (\n  <Text as=\"span\" size=\"large\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--light-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"light\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--normal-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"normal\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--medium-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"medium\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--semibold-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"semibold\">\n    Stylized text\n  </Text>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "as",
          "defaultValue": "'span'",
          "type": "React.ElementType"
        },
        {
          "name": "size",
          "type": "'large' | 'medium' | 'small'"
        },
        {
          "name": "weight",
          "type": "'light' | 'normal' | 'medium' | 'semibold'"
        },
        {
          "name": "whiteSpace",
          "type": "'pre' | 'normal' | 'nowrap' | 'pre-wrap' | 'pre-line'"
        }
      ],
      "subcomponents": []
    },
    "text_input": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TextInput",
      "id": "text_input",
      "name": "TextInput",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-textinput--default",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--disabled",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput disabled />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--with-caption",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <FormControl.Caption>This is a caption</FormControl.Caption>\n      <TextInput />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--visually-hidden-label",
          "code": "() => (\n  <form>\n    <Heading as=\"h2\" variant=\"small\">\n      Primer form title\n    </Heading>\n    <FormControl>\n      <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n      <TextInput />\n      <FormControl.Caption>\n        Label is visually hidden; the title describes the purpose visually\n      </FormControl.Caption>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--error",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput />\n      <FormControl.Validation variant=\"error\">\n        Something went wrong\n      </FormControl.Validation>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--success",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput />\n      <FormControl.Validation variant=\"success\">\n        Something went wrong\n      </FormControl.Validation>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--block",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput block />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--small",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput size=\"small\" />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--large",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput size=\"large\" />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--required",
          "code": "() => (\n  <form>\n    <FormControl required>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput size=\"large\" />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textinput-features--with-leading-visual",
          "code": "() => {\n  const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput leadingVisual={Checkmark} />\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Enter monies</FormControl.Label>\n        <TextInput leadingVisual=\"$\" />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-trailing-icon",
          "code": "() => {\n  const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n  return (\n    <div>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput trailingVisual={Checkmark} />\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Enter monies</FormControl.Label>\n        <TextInput trailingVisual=\"minutes\" placeholder=\"200\" />\n      </FormControl>\n    </div>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-trailing-action",
          "code": "() => {\n  const [value, setValue] = useState('sample text')\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(event.target.value)\n  }\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput\n          value={value}\n          onChange={handleChange}\n          trailingAction={\n            <Stack\n              justify=\"center\"\n              style={{\n                minWidth: '34px',\n              }}\n            >\n              {value.length ? (\n                <TextInput.Action\n                  onClick={() => setValue('')}\n                  icon={XCircleFillIcon}\n                  aria-label=\"Clear input\"\n                />\n              ) : undefined}\n            </Stack>\n          }\n        />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-tooltip-direction",
          "code": "() => {\n  const [value, setValue] = useState('sample text')\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(event.target.value)\n  }\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput\n          value={value}\n          onChange={handleChange}\n          trailingAction={\n            <Stack\n              justify=\"center\"\n              style={{\n                minWidth: '34px',\n              }}\n            >\n              {value.length ? (\n                <TextInput.Action\n                  onClick={() => setValue('')}\n                  icon={XCircleFillIcon}\n                  aria-label=\"Clear input\"\n                  tooltipDirection=\"nw\"\n                />\n              ) : undefined}\n            </Stack>\n          }\n        />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-loading-indicator",
          "code": "(args: FormControlArgs<TextInputProps>) => {\n  return (\n    <div>\n      <h3>No visual</h3>\n\n      <div className={classes.MarginBottom}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput value=\"auto\" {...args} />\n        </FormControl>\n      </div>\n      <div className={classes.MarginBottom}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput value=\"leading\" {...args} loaderPosition=\"leading\" />\n        </FormControl>\n      </div>\n      <div className={classes.MarginBottomLarge}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput value=\"trailing\" {...args} loaderPosition=\"trailing\" />\n        </FormControl>\n      </div>\n\n      <h3>Leading visual</h3>\n\n      <div className={classes.MarginBottom}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput leadingVisual={Calendar} {...args} value=\"auto\" />\n        </FormControl>\n      </div>\n      <div className={classes.MarginBottom}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={Calendar}\n            {...args}\n            loaderPosition=\"leading\"\n            value=\"leading\"\n          />\n        </FormControl>\n      </div>\n      <div className={classes.MarginBottomLarge}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={Calendar}\n            {...args}\n            loaderPosition=\"trailing\"\n            value=\"trailing\"\n          />\n        </FormControl>\n      </div>\n\n      <h3>Trailing visual</h3>\n      <FormControl>\n        <div className={classes.MarginBottom}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput trailingVisual={Calendar} {...args} value=\"auto\" />\n          </FormControl>\n        </div>\n        <div className={classes.MarginBottom}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput\n              trailingVisual={Calendar}\n              {...args}\n              loaderPosition=\"leading\"\n              value=\"leading\"\n            />\n          </FormControl>\n        </div>\n        <div className={classes.MarginBottomLarge}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput\n              trailingVisual={Calendar}\n              {...args}\n              loaderPosition=\"trailing\"\n              value=\"trailing\"\n            />\n          </FormControl>\n        </div>\n      </FormControl>\n\n      <h3>Both visuals</h3>\n\n      <div className={classes.MarginBottom}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            size=\"small\"\n            leadingVisual={Calendar}\n            trailingVisual={Calendar}\n            {...args}\n            value=\"auto\"\n          />\n        </FormControl>\n      </div>\n      <div className={classes.MarginBottom}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={Calendar}\n            trailingVisual={Calendar}\n            {...args}\n            loaderPosition=\"leading\"\n            value=\"leading\"\n          />\n        </FormControl>\n      </div>\n      <div className={classes.MarginBottom}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            size=\"large\"\n            leadingVisual={Calendar}\n            trailingVisual={Calendar}\n            {...args}\n            loaderPosition=\"trailing\"\n            value=\"trailing\"\n          />\n        </FormControl>\n      </div>\n    </div>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-autocomplete-attribute",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>First name</FormControl.Label>\n      <TextInput autoComplete=\"given-name\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Last name</FormControl.Label>\n      <TextInput autoComplete=\"family-name\" />\n    </FormControl>\n  </form>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Gives the input an accessible name."
        },
        {
          "name": "autoComplete",
          "type": "string",
          "defaultValue": "",
          "description": "Allows input to autofill based on value given."
        },
        {
          "name": "block",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Creates a full-width input element"
        },
        {
          "name": "characterLimit",
          "type": "number",
          "description": "The maximum number of characters allowed in the input"
        },
        {
          "name": "contrast",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Changes background color to a higher contrast color"
        },
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "",
          "description": "Creates a smaller or larger input than the default."
        },
        {
          "name": "loading",
          "type": "boolean",
          "defaultValue": "",
          "description": "Whether to show a loading indicator in the input"
        },
        {
          "name": "loaderPosition",
          "type": "'auto' | 'leading' | 'trailing'",
          "defaultValue": "",
          "description": "Which position to render the loading indicator\n\n- 'auto' (default): at the end of the input, unless a `leadingVisual` is passed. Then, it will render at the beginning\n- 'leading': at the beginning of the input\n- 'trailing': at the end of the input"
        },
        {
          "name": "loaderText",
          "type": "string",
          "defaultValue": "Loading",
          "description": "Text for screen readers to convey the loading state, should be descriptive and explain what is loading. This prop should only be used if there is visible context explaining what is loading, to ensure that context is provided to all users."
        },
        {
          "name": "leadingVisual",
          "type": "string | React.ComponentType",
          "defaultValue": "",
          "description": "Visual positioned on the left edge inside the input"
        },
        {
          "name": "monospace",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Shows input in monospace font"
        },
        {
          "name": "trailingVisual",
          "type": "string | React.ComponentType",
          "defaultValue": "",
          "description": "Visual positioned on the right edge inside the input"
        },
        {
          "name": "trailingAction",
          "type": "React.ReactElement<HTMLProps<HTMLButtonElement>>",
          "defaultValue": "",
          "description": "A visual that renders inside the input after the typing area"
        },
        {
          "name": "validationStatus",
          "type": "'error' | 'success'",
          "defaultValue": "",
          "description": "Style the input to match the status"
        },
        {
          "name": "variant",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use size) Creates a smaller or larger input than the default."
        },
        {
          "name": "width",
          "type": "string | number",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use css modules) Set the width of the input"
        },
        {
          "name": "maxWidth",
          "type": "string | number",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use css modules) Set the maximum width of the input"
        },
        {
          "name": "minWidth",
          "type": "string | number",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use css modules) Set the minimum width of the input"
        },
        {
          "name": "icon",
          "type": "React.ComponentType",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use leadingVisual or trailingVisual) An Octicon React component. To be used inside of input. Positioned on the left edge."
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLInputElement>"
        }
      ],
      "subcomponents": [
        {
          "name": "TextInput.Action",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "description": "Text that appears in a tooltip. If an icon is passed, this is also used as the label used by assistive technologies."
            },
            {
              "name": "tooltipDirection",
              "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
              "defaultValue": "s",
              "description": "Sets where the tooltip renders in relation to the target."
            },
            {
              "name": "icon",
              "type": "React.FunctionComponent",
              "defaultValue": "",
              "description": "The icon to render inside the button"
            },
            {
              "name": "variant",
              "type": "'default' | 'primary' | 'invisible' | 'danger'",
              "defaultValue": "",
              "deprecated": true,
              "description": "(Deprecated so that only the 'invisible' variant is used) Determine's the styles on a button"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"button\""
            }
          ],
          "passthrough": {
            "element": "button",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attributes"
          }
        }
      ]
    },
    "text_input_with_tokens": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TextInputWithTokens",
      "id": "text_input_with_tokens",
      "name": "TextInputWithTokens",
      "status": "deprecated",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "deprecated-components-textinputwithtokens--default",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInputWithTokens tokens={tokens} onTokenRemove={onTokenRemove} />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--with-leading-visual",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInputWithTokens\n        leadingVisual={NumberIcon}\n        tokens={tokens}\n        onTokenRemove={onTokenRemove}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--with-trailing-visual",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInputWithTokens\n        trailingVisual={CheckIcon}\n        tokens={tokens}\n        onTokenRemove={onTokenRemove}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--with-loading-indicator",
          "code": "(args: FormControlArgs<TextInputWithTokensProps>) => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <form className={classes.Grid}>\n      <FormControl>\n        <FormControl.Label>No visual</FormControl.Label>\n        <TextInputWithTokens\n          {...args}\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n        />\n      </FormControl>\n\n      <FormControl>\n        <FormControl.Label>Leading visual</FormControl.Label>\n        <TextInputWithTokens\n          {...args}\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          leadingVisual={NumberIcon}\n        />\n      </FormControl>\n\n      <FormControl>\n        <FormControl.Label>Both visuals</FormControl.Label>\n        <TextInputWithTokens\n          {...args}\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          leadingVisual={NumberIcon}\n          trailingVisual={CheckIcon}\n        />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--using-issue-label-tokens",
          "code": "() => {\n  const [tokens, setTokens] = useState([\n    {\n      text: 'enhancement',\n      id: 1,\n      fillColor: '#a2eeef',\n    },\n    {\n      text: 'bug',\n      id: 2,\n      fillColor: '#d73a4a',\n    },\n    {\n      text: 'good first issue',\n      id: 3,\n      fillColor: '#0cf478',\n    },\n  ])\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokenComponent={IssueLabelToken}\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n        />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--unstyled",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 2))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label visuallyHidden>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          className={classes.Unstyled}\n        />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--prevent-tokens-from-wrapping",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          preventTokenWrapping\n        />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--max-height",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 7))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <div className={classes.MaxWidth}>\n      {/* Setting max-width to force tokens to wrap and demo `maxHeight` behavior */}\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          maxHeight={70}\n          block // `block` only needed to fill parent width without overflowing\n        />\n      </FormControl>\n    </div>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--size",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          size=\"small\"\n        />\n      </FormControl>\n    </form>\n  )\n}"
        },
        {
          "id": "deprecated-components-textinputwithtokens-features--truncated",
          "code": "() => {\n  const [tokens, setTokens] = useState(mockTokens)\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <form>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          visibleTokenCount={5}\n        />\n      </FormControl>\n    </form>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "tokens",
          "type": "TokenProps[]",
          "defaultValue": "",
          "required": true,
          "description": "The array of tokens to render"
        },
        {
          "name": "onTokenRemove",
          "type": "(tokenId: string|number) => void",
          "defaultValue": "",
          "required": true,
          "description": "The function that gets called when a token is removed"
        },
        {
          "name": "tokenComponent",
          "type": "React.ComponentType<any>",
          "defaultValue": "Token",
          "description": "The component used to render each token"
        },
        {
          "name": "maxHeight",
          "type": "React.CSSProperties['maxHeight']",
          "defaultValue": "",
          "description": "The maximum height of the component. If the content in the input exceeds this height, it will scroll vertically"
        },
        {
          "name": "preventTokenWrapping",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether tokens should render inline horizontally. By default, tokens wrap to new lines"
        },
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large' | 'xlarge'",
          "defaultValue": "xlarge",
          "description": "The size of the tokens and text input"
        },
        {
          "name": "hideTokenRemoveButtons",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the remove buttons should be rendered in the tokens"
        },
        {
          "name": "validationStatus",
          "type": "'error' | 'success'",
          "defaultValue": "",
          "description": "Style the input to match the status"
        },
        {
          "name": "visibleTokenCount",
          "type": "number",
          "defaultValue": "",
          "description": "The number of tokens to display before truncating"
        }
      ],
      "passthrough": {
        "element": "TextInput",
        "url": "/react/TextInput"
      },
      "subcomponents": []
    },
    "textarea": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Textarea",
      "id": "textarea",
      "name": "Textarea",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-textarea--default",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--disabled",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea disabled />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--with-caption",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <FormControl.Caption>This is a caption</FormControl.Caption>\n      <Textarea />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--visually-hidden-label",
          "code": "() => (\n  <form>\n    <Heading as=\"h2\" variant=\"small\">\n      Primer form title\n    </Heading>\n    <FormControl>\n      <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n      <Textarea />\n      <FormControl.Caption>\n        Label is visually hidden; the title describes the purpose visually\n      </FormControl.Caption>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--error",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea />\n      <FormControl.Validation variant=\"error\">\n        Something went wrong\n      </FormControl.Validation>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--success",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea />\n      <FormControl.Validation variant=\"success\">Success</FormControl.Validation>\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--block",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea block />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--custom-height",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea rows={3} />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--custom-width",
          "code": "() => (\n  <form>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea cols={60} />\n    </FormControl>\n  </form>\n)"
        },
        {
          "id": "components-textarea-features--custom-resize-behavior",
          "code": "() => (\n  <Stack as=\"form\">\n    <FormControl>\n      <FormControl.Label>\n        Resize in either direction (default)\n      </FormControl.Label>\n      <Textarea resize=\"both\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>No resize</FormControl.Label>\n      <Textarea resize=\"none\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Horizontal resize</FormControl.Label>\n      <Textarea resize=\"horizontal\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Vertical resize</FormControl.Label>\n      <Textarea resize=\"vertical\" />\n    </FormControl>\n  </Stack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "required",
          "type": "boolean",
          "defaultValue": "",
          "description": "Indicates to the user and assistive technologies that the field value is required"
        },
        {
          "name": "cols",
          "type": "number",
          "defaultValue": "",
          "description": "Specifies the visible width of a text area."
        },
        {
          "name": "rows",
          "type": "number",
          "defaultValue": "",
          "description": "Specifies the visible height of a text area."
        },
        {
          "name": "block",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Expands with width of the component to fill the parent elements"
        },
        {
          "name": "resize",
          "type": "'both' | 'horizontal' | 'vertical' | 'none'",
          "defaultValue": "'both'",
          "description": "Changes the resize behavior"
        },
        {
          "name": "characterLimit",
          "type": "number",
          "description": "The maximum number of characters allowed in the textarea"
        },
        {
          "name": "contrast",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Changes background color to a higher contrast color"
        },
        {
          "name": "validationStatus",
          "type": "'success' | 'error' | undefined",
          "defaultValue": "",
          "description": "Style the textarea to match the current form validation status"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLTextAreaElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"input\""
        },
        {
          "name": "className",
          "type": "string | undefined",
          "description": "The className to apply to the wrapper element"
        },
        {
          "name": "minHeight",
          "type": "number",
          "description": "The minimum height of the textarea"
        },
        {
          "name": "maxHeight",
          "type": "number",
          "description": "The maximum height of the textarea"
        }
      ],
      "subcomponents": []
    },
    "timeline": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Timeline",
      "id": "timeline",
      "name": "Timeline",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-timeline--default",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--clip-sidebar",
          "code": "() => (\n  <Timeline clipSidebar>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--clip-sidebar-start",
          "code": "() => (\n  <Timeline clipSidebar=\"start\">\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--clip-sidebar-end",
          "code": "() => (\n  <Timeline clipSidebar=\"end\">\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--condensed-items",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item condensed>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item condensed>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Break />\n    <Timeline.Item condensed>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item condensed>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--timeline-break",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"done\">\n        <Octicon icon={GitMergeIcon} aria-label=\"Merged\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Break />\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitBranchIcon} aria-label=\"Branch\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--badge-variants",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"accent\">\n        <Octicon icon={GitPullRequestIcon} aria-label=\"Pull request\" />\n      </Timeline.Badge>\n      <Timeline.Body>Accent</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"success\">\n        <Octicon icon={IssueClosedIcon} aria-label=\"Closed\" />\n      </Timeline.Badge>\n      <Timeline.Body>Success</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"attention\">\n        <Octicon icon={FlameIcon} aria-label=\"Attention\" />\n      </Timeline.Badge>\n      <Timeline.Body>Attention</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"severe\">\n        <Octicon icon={SkipIcon} aria-label=\"Severe\" />\n      </Timeline.Badge>\n      <Timeline.Body>Severe</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"danger\">\n        <Octicon icon={XIcon} aria-label=\"Danger\" />\n      </Timeline.Badge>\n      <Timeline.Body>Danger</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"done\">\n        <Octicon icon={GitMergeIcon} aria-label=\"Merged\" />\n      </Timeline.Badge>\n      <Timeline.Body>Done</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"open\">\n        <Octicon icon={IssueOpenedIcon} aria-label=\"Open\" />\n      </Timeline.Badge>\n      <Timeline.Body>Open</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"closed\">\n        <Octicon icon={IssueClosedIcon} aria-label=\"Closed\" />\n      </Timeline.Badge>\n      <Timeline.Body>Closed</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge variant=\"sponsors\">\n        <Octicon icon={HeartIcon} aria-label=\"Sponsors\" />\n      </Timeline.Badge>\n      <Timeline.Body>Sponsors</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--with-inline-links",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>\n        <Link href=\"#\" className={classes.LinkWithBoldStyle} muted>\n          Monalisa\n        </Link>\n        enabled auto-merge (squash)\n      </Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--with-actions",
          "code": "() => (\n  <div\n    className={classes.RealisticTimeline}\n    onClick={(e) => {\n      if ((e.target as HTMLElement).closest('a')) e.preventDefault()\n    }}\n  >\n    <Timeline>\n      <Timeline.Item>\n        <Timeline.Badge variant=\"done\">\n          <Octicon icon={GitMergeIcon} aria-label=\"Merged\" />\n        </Timeline.Badge>\n        <Timeline.Body>\n          <Link href=\"#\" className={classes.LinkWithBoldStyle} muted>\n            Monalisa\n          </Link>\n          merged via the queue into <BranchName href=\"#\">main</BranchName> with\n          commit{' '}\n          <Link href=\"#\" className={classes.CommitSha}>\n            01e49tb\n          </Link>{' '}\n          <Link href=\"#\" className={classes.Timestamp} muted>\n            just now\n          </Link>\n          <div className={classes.ChecksSubline}>28 checks passed</div>\n        </Timeline.Body>\n        <Timeline.Actions>\n          <Button size=\"small\">View details</Button>\n          <Button size=\"small\">Revert</Button>\n        </Timeline.Actions>\n      </Timeline.Item>\n      <Timeline.Item>\n        <Timeline.Badge>\n          <Octicon icon={RepoPushIcon} aria-label=\"Force-push\" />\n        </Timeline.Badge>\n        <Timeline.Body>\n          <Link href=\"#\" className={classes.LinkWithBoldStyle} muted>\n            Monalisa\n          </Link>\n          force-pushed the <BranchName href=\"#\">main</BranchName> branch from{' '}\n          <Link href=\"#\" className={classes.CommitSha}>\n            01e49tb\n          </Link>{' '}\n          to{' '}\n          <Link href=\"#\" className={classes.CommitSha}>\n            02f50uc\n          </Link>{' '}\n          <Link href=\"#\" className={classes.Timestamp} muted>\n            2 hours ago\n          </Link>\n        </Timeline.Body>\n        <Timeline.Actions>\n          <Button size=\"small\">Compare</Button>\n        </Timeline.Actions>\n      </Timeline.Item>\n      <Timeline.Item condensed>\n        <Timeline.Badge>\n          <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n        </Timeline.Badge>\n        <Timeline.Body>\n          <Link href=\"#\" muted>\n            Update README.md\n          </Link>\n        </Timeline.Body>\n        <Timeline.Actions>\n          <Label className={classes.SignatureLabelVerified}>Verified</Label>\n          <Octicon\n            icon={CheckIcon}\n            className={classes.IconSuccess}\n            aria-label=\"All checks passed\"\n          />\n          <Link href=\"#\" className={classes.ShaLink} muted>\n            3fbdc0\n          </Link>\n        </Timeline.Actions>\n      </Timeline.Item>\n      <Timeline.Item condensed>\n        <Timeline.Badge>\n          <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n        </Timeline.Badge>\n        <Timeline.Body>\n          <Link href=\"#\" muted>\n            Initial commit\n          </Link>\n        </Timeline.Body>\n        <Timeline.Actions>\n          <Label>Unverified</Label>\n          <Octicon\n            icon={XIcon}\n            className={classes.IconDanger}\n            aria-label=\"Some checks failed\"\n          />\n          <Link href=\"#\" className={classes.ShaLink} muted>\n            3fbdc0\n          </Link>\n        </Timeline.Actions>\n      </Timeline.Item>\n      <Timeline.Item>\n        <Timeline.Badge>\n          <Octicon icon={CrossReferenceIcon} aria-label=\"Cross-reference\" />\n        </Timeline.Badge>\n        <Timeline.Body>\n          <Avatar\n            src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n            size={20}\n            className={classes.InlineAvatar}\n          />\n          <Link href=\"#\" className={classes.LinkWithBoldStyle} muted>\n            Monalisa\n          </Link>\n          mentioned this pull request{' '}\n          <Link href=\"#\" className={classes.Timestamp} muted>\n            just now\n          </Link>\n          <div className={classes.CrossReferenceRow}>\n            <div className={classes.CrossReferenceContent}>\n              <div className={classes.CrossReferenceTitle}>\n                <Link href=\"#\" className={classes.CrossReferenceLink}>\n                  <span className={classes.CrossReferenceName}>\n                    Fix positioning of Autocomplete overlay menu\n                  </span>{' '}\n                  <span className={classes.CrossReferenceNumber}>\n                    primer/react#7431\n                  </span>\n                </Link>\n              </div>\n              <div className={classes.CrossReferenceTaskline}>\n                <Octicon icon={TasklistIcon} size={16} />\n                17 tasks\n              </div>\n            </div>\n            <div className={classes.CrossReferenceActions}>\n              <Octicon\n                icon={LockIcon}\n                size={16}\n                className={classes.CrossReferenceMeta}\n              />\n              <StateLabel status=\"pullOpened\" size=\"medium\">\n                Open\n              </StateLabel>\n            </div>\n          </div>\n        </Timeline.Body>\n      </Timeline.Item>\n    </Timeline>\n  </div>\n)"
        },
        {
          "id": "components-timeline-features--with-avatar",
          "code": "() => (\n  <div className={classes.AvatarGutter}>\n    <Timeline>\n      <Timeline.Item>\n        <Timeline.Avatar>\n          <Avatar\n            size={40}\n            src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n            alt=\"\"\n          />\n        </Timeline.Avatar>\n        <Timeline.Badge>\n          <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n        </Timeline.Badge>\n        <Timeline.Body>\n          <Link href=\"#\" className={classes.LinkWithBoldStyle} muted>\n            Monalisa\n          </Link>\n          opened this pull request\n        </Timeline.Body>\n      </Timeline.Item>\n      <Timeline.Item condensed>\n        <Timeline.Avatar>\n          <Avatar\n            size={16}\n            src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n            alt=\"\"\n          />\n        </Timeline.Avatar>\n        <Timeline.Badge>\n          <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n        </Timeline.Badge>\n        <Timeline.Body>Monalisa pushed a commit</Timeline.Body>\n      </Timeline.Item>\n    </Timeline>\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "clipSidebar",
          "type": "| boolean | 'start' | 'end' | 'both'",
          "description": "Controls which ends of the sidebar are clipped. When set to `true` or `'both'`, hides the sidebar above the first and below the last Timeline.Item. Use `'start'` to only clip the top or `'end'` to only clip the bottom."
        }
      ],
      "subcomponents": [
        {
          "name": "Timeline.Item",
          "props": [
            {
              "name": "condensed",
              "type": "boolean",
              "description": "Reduces vertical padding and removes background from an item's badge."
            }
          ]
        },
        {
          "name": "Timeline.Badge",
          "props": [
            {
              "name": "variant",
              "type": "'accent' | 'success' | 'attention' | 'severe' | 'danger' | 'done' | 'open' | 'closed' | 'sponsors'",
              "description": "The color variant of the badge."
            }
          ]
        },
        {
          "name": "Timeline.Body",
          "props": []
        },
        {
          "name": "Timeline.Break",
          "props": []
        },
        {
          "name": "Timeline.Actions",
          "props": []
        },
        {
          "name": "Timeline.Avatar",
          "props": []
        }
      ]
    },
    "toggle_switch": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ToggleSwitch",
      "id": "toggle_switch",
      "name": "ToggleSwitch",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-toggleswitch--default",
          "code": "() => (\n  <>\n    <Text id=\"toggle\" className={classes.TextMediumBold}>\n      Toggle label\n    </Text>\n    <ToggleSwitch aria-labelledby=\"toggle\" />\n  </>\n)"
        },
        {
          "id": "components-toggleswitch-features--small",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <span id=\"toggle\" className={styles.ToggleLabel}>\n      Toggle label\n    </span>\n    <ToggleSwitch size=\"small\" aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--with-caption",
          "code": "() => (\n  <div className={styles.Row}>\n    <div className={styles.ColGrow}>\n      <span className={styles.SwitchLabel} id=\"switchLabel\">\n        Notifications\n      </span>\n      <span className={styles.SwitchCaption} id=\"switchCaption\">\n        Notifications will be delivered via email and the GitHub notification\n        center\n      </span>\n    </div>\n    <ToggleSwitch\n      aria-labelledby=\"switchLabel\"\n      aria-describedby=\"switchCaption\"\n    />\n  </div>\n)"
        },
        {
          "id": "components-toggleswitch-features--disabled",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <span id=\"toggle\" className={styles.ToggleLabel}>\n      Toggle label\n    </span>\n    <ToggleSwitch disabled aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--checked",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <span id=\"toggle\" className={styles.ToggleLabel}>\n      Toggle label\n    </span>\n    <ToggleSwitch checked aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--checked-disabled",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <span id=\"toggle\" className={styles.ToggleLabel}>\n      Toggle label\n    </span>\n    <ToggleSwitch checked disabled aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--loading",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <span id=\"toggle\" className={styles.ToggleLabel}>\n      Toggle label\n    </span>\n    <ToggleSwitch loading aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--label-end",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <span id=\"toggle\" className={styles.ToggleLabel}>\n      Toggle label\n    </span>\n    <ToggleSwitch statusLabelPosition=\"end\" aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--controlled",
          "code": "() => {\n  const [isOn, setIsOn] = React.useState(false)\n  const onClick = React.useCallback(() => {\n    setIsOn(!isOn)\n  }, [setIsOn, isOn])\n  const handleSwitchChange = (on: boolean) => {\n    action(`new switch \"on\" state: ${on}`)\n  }\n  return (\n    <>\n      <div\n        className={styles.Row}\n        style={{\n          maxWidth: '300px',\n        }}\n      >\n        <span\n          className={clsx(styles.ColGrow, styles.SwitchLabel)}\n          id=\"switchLabel\"\n        >\n          Notifications\n        </span>\n        <ToggleSwitch\n          onClick={onClick}\n          onChange={handleSwitchChange}\n          checked={isOn}\n          aria-labelledby=\"switchLabel\"\n        />\n      </div>\n      <p>The switch is {isOn ? 'on' : 'off'}</p>\n    </>\n  )\n}"
        },
        {
          "id": "components-toggleswitch-features--with-custom-labels",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <span id=\"toggle\" className={styles.ToggleLabel}>\n      Toggle label\n    </span>\n    <ToggleSwitch\n      buttonLabelOn=\"Active\"\n      buttonLabelOff=\"Inactive\"\n      aria-labelledby=\"toggle\"\n    />\n  </ToggleSwitchStoryWrapper>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-describedby",
          "type": "string",
          "defaultValue": "",
          "description": "The id of the DOM node that describes the switch"
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "defaultValue": "",
          "required": true,
          "description": "The id of the DOM node that labels the switch"
        },
        {
          "name": "defaultChecked",
          "type": "boolean",
          "defaultValue": "",
          "description": "Uncontrolled - whether the switch is turned on"
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "",
          "description": "Whether the switch is ready for user input"
        },
        {
          "name": "loading",
          "type": "boolean",
          "defaultValue": "",
          "description": "Whether the switch's value is being calculated"
        },
        {
          "name": "checked",
          "type": "boolean",
          "defaultValue": "",
          "description": "Whether the switch is turned on"
        },
        {
          "name": "onChange",
          "type": "(on: boolean) => void",
          "defaultValue": "",
          "description": "The callback that is called when the switch is toggled on or off"
        },
        {
          "name": "onClick",
          "type": "(e: MouseEvent) => void",
          "defaultValue": "",
          "description": "The callback that is called when the switch is clicked"
        },
        {
          "name": "size",
          "type": "'small' | 'medium'",
          "defaultValue": "'medium'",
          "description": "Size of the switch"
        },
        {
          "name": "statusLabelPosition",
          "type": "'start' | 'end'",
          "defaultValue": "'start'",
          "description": "Whether the \"on\" and \"off\" labels should appear before or after the switch.\n\n**This should only be changed when the switch's alignment needs to be adjusted.** For example: It needs to be left-aligned because the label appears above it and the caption appears below it."
        },
        {
          "name": "loadingLabelDelay",
          "type": "number",
          "defaultValue": "2000",
          "description": "When the switch is in the loading state, this value controls the amount of delay in milliseconds before the word \"Loading\" is announced to screen readers."
        },
        {
          "name": "loadingLabel",
          "type": "string",
          "defaultValue": "'Loading'",
          "description": "The text that is announced to AT such as screen readers when the switch is in a loading state."
        },
        {
          "name": "buttonType",
          "type": "'button' | 'submit' | 'reset'",
          "defaultValue": "'button'",
          "description": "As it’s part of form behavior, this controls whether the button is of type `button`, `submit`, or `reset`."
        },
        {
          "name": "buttonLabelOn",
          "type": "string",
          "defaultValue": "'On'",
          "description": "The text to display when the toggle switch is turned on. Only customize this label if there is a more specific label for the context. For example, you might use 'Show' if the setting is 'Show images'."
        },
        {
          "name": "buttonLabelOff",
          "type": "string",
          "defaultValue": "'Off'",
          "description": "The text to display when the toggle switch is turned off. Only customize this label if there is a more specific label for the context. For example, you might use 'Hide' if the setting is 'Show images'."
        }
      ],
      "subcomponents": []
    },
    "token": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Token",
      "id": "token",
      "name": "Token",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-token--default",
          "code": "() => <Token text=\"token\" />"
        },
        {
          "id": "components-token-features--interactive-token",
          "code": "() => {\n  return (\n    <div className={classes.TokenRow}>\n      <Token\n        as=\"a\"\n        href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n        text=\"Link\"\n      />\n      <Token as=\"button\" onClick={action('clicked')} text=\"Button\" />\n    </div>\n  )\n}"
        },
        {
          "id": "components-token-features--token-with-leading-visual",
          "code": "() => {\n  return <Token text=\"token\" leadingVisual={GitBranchIcon} />\n}"
        },
        {
          "id": "components-token-features--token-with-on-remove-fn",
          "code": "({ ...args }) => {\n  return (\n    <div className={classes.TokenRow}>\n      <Token text=\"token\" onRemove={action('remove me')} {...args} />\n      <Token\n        as=\"a\"\n        href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n        onRemove={action('remove me')}\n        text=\"Link\"\n        {...args}\n      />\n      <Token\n        as=\"button\"\n        onClick={action('clicked')}\n        onRemove={action('remove me')}\n        text=\"Button\"\n        {...args}\n      />\n    </div>\n  )\n}"
        },
        {
          "id": "components-token-features--default-issue-label-token",
          "code": "() => {\n  return <IssueLabelToken text=\"good first issue\" />\n}"
        },
        {
          "id": "components-token-features--interactive-issue-label-token",
          "code": "() => {\n  return (\n    <div className={classes.TokenRow}>\n      <IssueLabelToken\n        as=\"a\"\n        href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n        text=\"Link\"\n      />\n      <IssueLabelToken as=\"button\" onClick={action('clicked')} text=\"Button\" />\n    </div>\n  )\n}"
        },
        {
          "id": "components-token-features--issue-label-token-with-on-remove-fn",
          "code": "() => {\n  return (\n    <div className={classes.TokenRow}>\n      <IssueLabelToken text=\"token\" onRemove={action('remove me')} />\n      <IssueLabelToken\n        as=\"a\"\n        href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n        onRemove={action('remove me')}\n        text=\"Link\"\n      />\n      <IssueLabelToken\n        as=\"button\"\n        onClick={action('clicked')}\n        onRemove={action('remove me')}\n        text=\"Button\"\n      />\n    </div>\n  )\n}"
        },
        {
          "id": "components-token-features--small-token",
          "code": "() => <Token text=\"token\" size=\"small\" />"
        },
        {
          "id": "components-token-features--large-token",
          "code": "() => <Token text=\"token\" size=\"xlarge\" />"
        },
        {
          "id": "components-token-features--x-large-token",
          "code": "() => <Token text=\"token\" size=\"xlarge\" />"
        },
        {
          "id": "components-token-features--issue-label-token-custom-colors",
          "code": "() => {\n  return (\n    <div className={classes.TokenColumn}>\n      <div className={classes.TokenRow}>\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Link\"\n          fillColor=\"#0366d6\"\n        />\n        <IssueLabelToken\n          as=\"button\"\n          onClick={action('clicked')}\n          text=\"Button\"\n          fillColor=\"lightpink\"\n        />\n      </div>\n      <h3>Color examples</h3>\n      <div className={classes.TokenWrapRow}>\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"😀 Link\"\n          fillColor=\"#8c50c8\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Token\"\n          fillColor=\"#a9d3bc\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"🚨 Problem\"\n          fillColor=\"#98afa7\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"📥 Inbox\"\n          fillColor=\"#573807\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"deeppink\"\n          fillColor=\"#b7b41e\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"👹 Link\"\n          fillColor=\"#0f65b1\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Tiger\"\n          fillColor=\"#e7bc68\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"🐛 coral\"\n          fillColor=\"#D6F2DE\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Long label\"\n          fillColor=\"#161E37\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"✅ Done\"\n          fillColor=\"#232323\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Hello\"\n          fillColor=\"#E0E0E0\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Lorem\"\n          fillColor=\"#aed531\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Lorem\"\n          fillColor=\"#d980fc\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Lorem\"\n          fillColor=\"#e7f922\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"🚀 Lorem\"\n          fillColor=\"#ef70e9\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Lorem\"\n          fillColor=\"#72ea84\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"Lorem\"\n          fillColor=\"#87e50b\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"🤷 Lorem\"\n          fillColor=\"#fcf646\"\n        />\n        <IssueLabelToken\n          as=\"a\"\n          href=\"/?path=/story/components-token-features--issue-label-token-custom-colors\"\n          text=\"💡 Light\"\n          fillColor=\"#E40C74\"\n        />\n      </div>\n    </div>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "leadingVisual",
          "type": "React.ComponentType<React.PropsWithChildren<any>>",
          "description": "A function that renders a component before the token text"
        },
        {
          "name": "text",
          "required": true,
          "type": "string",
          "description": "The text label inside the token"
        },
        {
          "name": "as",
          "type": "'button' | 'a' | 'span'",
          "defaultValue": "'span'"
        },
        {
          "name": "onRemove",
          "type": "() => void",
          "description": "The function that gets called when a user clicks the remove button, or keys `Backspace` or `Delete` when focused on the token"
        },
        {
          "name": "hideRemoveButton",
          "type": "boolean",
          "description": "Whether the remove button should be rendered in the token"
        },
        {
          "name": "isSelected",
          "type": "boolean",
          "description": "Whether the token is selected"
        },
        {
          "name": "id",
          "type": "number | string",
          "description": "A unique identifier that can be associated with the token"
        },
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large' | 'xlarge'",
          "description": "Which size the token will be rendered at"
        }
      ],
      "subcomponents": [
        {
          "name": "IssueLabelToken",
          "props": [
            {
              "name": "fillColor",
              "type": "string",
              "description": "The color that corresponds to the label"
            },
            {
              "name": "text",
              "required": true,
              "type": "string",
              "description": "The text label inside the token"
            },
            {
              "name": "as",
              "type": "'button' | 'a' | 'span'",
              "defaultValue": "'span'"
            },
            {
              "name": "onRemove",
              "type": "() => void",
              "description": "The function that gets called when a user clicks the remove button, or keys `Backspace` or `Delete` when focused on the token"
            },
            {
              "name": "hideRemoveButton",
              "type": "boolean",
              "description": "Whether the remove button should be rendered in the token"
            },
            {
              "name": "isSelected",
              "type": "boolean",
              "description": "Whether the token is selected"
            },
            {
              "name": "id",
              "type": "number | string",
              "description": "A unique identifier that can be associated with the token"
            },
            {
              "name": "size",
              "type": "'small' | 'medium' | 'large' | 'xlarge'",
              "description": "Which size the token will be rendered at"
            }
          ]
        }
      ]
    },
    "tooltip": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Tooltip",
      "id": "tooltip",
      "name": "Tooltip",
      "docsId": "tooltip",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-tooltip--default",
          "code": "() => (\n  <>\n    <div className={classes.BannerContainer}>\n      <Banner\n        title=\"Planned for deprecation\"\n        description={\n          <div data-a11y-link-underlines=\"true\">\n            There are plans to deprecate this component in a future release. We\n            recommend using{' '}\n            <Link\n              inline={true}\n              href=\"/react/storybook/?path=/story/components-tooltipv2--default\"\n            >\n              Tooltip\n            </Link>{' '}\n            instead.\n          </div>\n        }\n        variant=\"warning\"\n      />\n    </div>\n    <div className={classes.PaddedContainer}>\n      <Tooltip aria-label=\"Hello, Tooltip!\">\n        <Button>Hover me</Button>\n      </Tooltip>\n    </div>\n  </>\n)"
        },
        {
          "id": "deprecated-components-tooltip-features--all-directions",
          "code": "() => (\n  <div className={classes.AllDirectionsRow}>\n    <Tooltip direction=\"n\" aria-label=\"Supplementary text\">\n      <Button>North</Button>\n    </Tooltip>\n    <Tooltip direction=\"s\" aria-label=\"Supplementary text\">\n      <Button>South</Button>\n    </Tooltip>\n    <Tooltip direction=\"e\" aria-label=\"Supplementary text\">\n      <Button>East</Button>\n    </Tooltip>\n    <Tooltip direction=\"w\" aria-label=\"Supplementary text\">\n      <Button>West</Button>\n    </Tooltip>\n    <Tooltip direction=\"ne\" aria-label=\"Supplementary text\">\n      <Button>North East</Button>\n    </Tooltip>\n    <Tooltip direction=\"nw\" aria-label=\"Supplementary text\">\n      <Button>North West</Button>\n    </Tooltip>\n    <Tooltip direction=\"se\" aria-label=\"Supplementary text\">\n      <Button>Southeast</Button>\n    </Tooltip>\n    <Tooltip direction=\"sw\" aria-label=\"Supplementary text\">\n      <Button>Southwest</Button>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "deprecated-components-tooltip-features--icon-button-tooltip",
          "code": "() => (\n  <div className={classes.PaddedContainer}>\n    <Tooltip aria-label=\"Search\">\n      <IconButton icon={SearchIcon} aria-label=\"Search\" />\n    </Tooltip>\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "align",
          "type": "'left' | 'right'"
        },
        {
          "name": "direction",
          "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
          "defaultValue": "n",
          "description": "Sets where the tooltip renders in relation to the target."
        },
        {
          "name": "noDelay",
          "type": "boolean",
          "description": "When set to `true`, tooltip appears without any delay."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Text used in `aria-label` (for accessibility)"
        },
        {
          "name": "wrap",
          "type": "boolean",
          "description": "Use `true` to allow text within tooltip to wrap."
        }
      ],
      "subcomponents": []
    },
    "tooltip_v2": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TooltipV2",
      "id": "tooltip_v2",
      "name": "Tooltip",
      "docsId": "tooltip",
      "status": "beta",
      "a11yReviewed": "2025-01-08",
      "importPath": "@primer/react/next",
      "stories": [
        {
          "id": "components-tooltipv2--default",
          "code": "() => (\n  <div className={classes.PaddedContainer}>\n    <Tooltip text=\"This change can't be undone.\">\n      <Button>Delete</Button>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--anchor-has-margin",
          "code": "() => (\n  <div className={classes.PaddedContainer}>\n    <Tooltip text=\"Tooltip is still centered\">\n      <Button className={classes.MarginLeftButton}>\n        Button has 16px margin Left\n      </Button>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--label-type",
          "code": "() => (\n  <div>\n    <Tooltip text=\"Contribution Documentation for 'Primer React'\" type=\"label\">\n      <Link\n        href=\"https://github.com/primer/react/contributor-docs/CONTRIBUTING.md\"\n        className={classes.LabelLink}\n      >\n        <Octicon icon={BookIcon} className={classes.LabelIcon} />\n      </Link>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--description-type",
          "code": "() => (\n  <div className={classes.PaddedContainer}>\n    <Tooltip text=\"Supplementary text\" direction=\"n\">\n      <Button>Save</Button>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--icon-button-with-description",
          "code": "() => (\n  <div className={classes.PaddedContainer}>\n    <Tooltip text=\"Supplementary text for icon button\" direction=\"e\">\n      <IconButton icon={SearchIcon} aria-label=\"Search\" />\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--all-directions",
          "code": "() => (\n  <div className={classes.AllDirectionsRow}>\n    <Tooltip direction=\"n\" text=\"Supplementary text\">\n      <Button>North</Button>\n    </Tooltip>\n    <Tooltip direction=\"s\" text=\"Supplementary text\">\n      <Button>South</Button>\n    </Tooltip>\n    <Tooltip direction=\"e\" text=\"Supplementary text\">\n      <Button>East</Button>\n    </Tooltip>\n    <Tooltip direction=\"w\" text=\"Supplementary text\">\n      <Button>West</Button>\n    </Tooltip>\n    <Tooltip direction=\"ne\" text=\"Supplementary text\">\n      <Button>North East</Button>\n    </Tooltip>\n    <Tooltip direction=\"nw\" text=\"Supplementary text\">\n      <Button>North West</Button>\n    </Tooltip>\n    <Tooltip direction=\"se\" text=\"Supplementary text\">\n      <Button>Southeast</Button>\n    </Tooltip>\n    <Tooltip direction=\"sw\" text=\"Supplementary text\">\n      <Button>Southwest</Button>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--multiline-text",
          "code": "() => (\n  <div>\n    <Tooltip\n      direction=\"e\"\n      text=\"Random long text that needs to be wrapped and be multipline and have some paddings around\"\n    >\n      <Button>Multiline East</Button>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--calculated-direction",
          "code": "() => (\n  <div className={classes.AllDirectionsRow}>\n    <Tooltip\n      direction=\"w\"\n      text=\"But appears in the east direction due to not having enough space in the west\"\n    >\n      <Button>West</Button>\n    </Tooltip>\n\n    <Tooltip text=\"The direction here is north by default but there is not enough space in the north therefore the tooltip appears in the south\">\n      <Button>North</Button>\n    </Tooltip>\n  </div>\n)"
        },
        {
          "id": "components-tooltipv2-features--on-action-menu-anchor",
          "code": "() => (\n  <div className={classes.ActionMenuRow}>\n    <ActionMenu>\n      <ActionMenu.Anchor>\n        <Tooltip text=\"Supplementary text to add here\" direction=\"n\">\n          <Button\n            leadingVisual={GitBranchIcon}\n            trailingAction={TriangleDownIcon}\n          >\n            ActionMenu.Anchor w/ t\n          </Button>\n        </Tooltip>\n      </ActionMenu.Anchor>\n      <ActionMenu.Overlay width=\"medium\">\n        <ActionList>\n          <ActionList.Item onSelect={() => alert('Main')}>\n            <ActionList.LeadingVisual>\n              <CheckIcon />\n            </ActionList.LeadingVisual>\n            main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 1')}>\n            branch-1\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 2')}>\n            branch-2\n          </ActionList.Item>\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n    <ActionMenu>\n      <Tooltip text=\"Supplementary text to add here\" direction=\"n\">\n        <ActionMenu.Button leadingVisual={GitBranchIcon}>\n          ActionMenu.Button w/ t\n        </ActionMenu.Button>\n      </Tooltip>\n      <ActionMenu.Overlay width=\"medium\">\n        <ActionList>\n          <ActionList.Item onSelect={() => alert('Main')}>\n            <ActionList.LeadingVisual>\n              <CheckIcon />\n            </ActionList.LeadingVisual>\n            main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 1')}>\n            branch-1\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 2')}>\n            branch-2\n          </ActionList.Item>\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n    <ActionMenu>\n      <ActionMenu.Anchor>\n        <Button leadingVisual={GitBranchIcon} trailingAction={TriangleDownIcon}>\n          ActionMenu.Anchor\n        </Button>\n      </ActionMenu.Anchor>\n      <ActionMenu.Overlay width=\"medium\">\n        <ActionList>\n          <ActionList.Item onSelect={() => alert('Main')}>\n            <ActionList.LeadingVisual>\n              <CheckIcon />\n            </ActionList.LeadingVisual>\n            main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 1')}>\n            branch-1\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 2')}>\n            branch-2\n          </ActionList.Item>\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n    <ActionMenu>\n      <ActionMenu.Button leadingVisual={GitBranchIcon}>\n        ActionMenu.Button\n      </ActionMenu.Button>\n\n      <ActionMenu.Overlay width=\"medium\">\n        <ActionList>\n          <ActionList.Item onSelect={() => alert('Main')}>\n            <ActionList.LeadingVisual>\n              <CheckIcon />\n            </ActionList.LeadingVisual>\n            main <ActionList.TrailingVisual>default</ActionList.TrailingVisual>\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 1')}>\n            branch-1\n          </ActionList.Item>\n          <ActionList.Item onSelect={() => alert('Branch 2')}>\n            branch-2\n          </ActionList.Item>\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n  </div>\n)"
        }
      ],
      "props": [
        {
          "name": "direction",
          "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
          "defaultValue": "s",
          "description": "Sets where the tooltip renders in relation to the target."
        },
        {
          "name": "text",
          "required": true,
          "type": "string",
          "description": "The text to be displayed in the tooltip"
        },
        {
          "name": "type",
          "type": "'label' | 'description'",
          "defaultValue": "description",
          "description": "The type of tooltip. `label` is used for labelling the element that triggers tooltip. `description` is used for describing or adding a supplementary information to the element that triggers the tooltip."
        },
        {
          "name": "keybindingHint",
          "type": "string | string[]",
          "description": "Optional keybinding hint to indicate the availability of a keyboard shortcut. Pass a string for a single shortcut or an array of strings to show multiple shortcuts joined with \"or\". Supported syntax is described in the docs for the `KeybindingHint` component."
        },
        {
          "name": "delay",
          "type": "'short' | 'medium' | 'long'",
          "defaultValue": "short",
          "description": "Sets the delay before showing the tooltip. `short` is 50ms (default), `medium` is 400ms, and `long` is 1200ms."
        }
      ],
      "subcomponents": []
    },
    "topic_tag": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TopicTag",
      "id": "topic_tag",
      "name": "TopicTag",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-topictag--default",
          "code": "() => <TopicTag>react</TopicTag>"
        },
        {
          "id": "experimental-components-topictag-features--as-button",
          "code": "() => <TopicTag as=\"button\">react</TopicTag>"
        },
        {
          "id": "experimental-components-topictag-features--as-group",
          "code": "() => {\n  const tags = [\n    'react',\n    'nodejs',\n    'javascript',\n    'd3',\n    'teachers',\n    'community',\n    'education',\n    'programming',\n    'curriculum',\n    'math',\n  ]\n  return (\n    <TopicTagGroup>\n      {tags.map((tag) => (\n        <TopicTag key={tag} href={`/topics/${tag}`}>\n          {tag}\n        </TopicTag>\n      ))}\n    </TopicTagGroup>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "as",
          "type": "React.ElementType",
          "description": "The HTML element or React component to render as the root element"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Provide a class name for styling on the outermost element"
        }
      ],
      "subcomponents": [
        {
          "name": "TopicTag.Group",
          "props": [
            {
              "name": "className",
              "type": "string",
              "description": "Provide a class name for styling on the outermost element"
            }
          ]
        }
      ]
    },
    "tree_view": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TreeView",
      "id": "tree_view",
      "name": "TreeView",
      "status": "beta",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-treeview--default",
          "code": "() => (\n  <nav aria-label=\"Files changed\">\n    <TreeView aria-label=\"Files changed\">\n      <TreeView.Item id=\"src\" defaultExpanded>\n        <TreeView.LeadingVisual>\n          <TreeView.DirectoryIcon />\n        </TreeView.LeadingVisual>\n        src\n        <TreeView.SubTree>\n          <TreeView.Item id=\"src/Avatar.tsx\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            Avatar.tsx\n            <TreeView.TrailingVisual label=\"Added\">\n              <Octicon icon={DiffAddedIcon} className={classes.SuccessIcon} />\n            </TreeView.TrailingVisual>\n          </TreeView.Item>\n          <TreeView.Item id=\"src/Button.tsx\" current>\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            Button.tsx\n            <TreeView.TrailingVisual label=\"Modified\">\n              <Octicon\n                icon={DiffModifiedIcon}\n                className={classes.AttentionIcon}\n              />\n            </TreeView.TrailingVisual>\n          </TreeView.Item>\n        </TreeView.SubTree>\n      </TreeView.Item>\n      <TreeView.Item id=\"package.json\">\n        <TreeView.LeadingVisual>\n          <FileIcon />\n        </TreeView.LeadingVisual>\n        package.json\n        <TreeView.TrailingVisual label=\"Modified\">\n          <Octicon icon={DiffModifiedIcon} className={classes.AttentionIcon} />\n        </TreeView.TrailingVisual>\n      </TreeView.Item>\n    </TreeView>\n  </nav>\n)"
        },
        {
          "id": "components-treeview-features--files",
          "code": "() => (\n  <nav aria-label=\"Files\">\n    <TreeView aria-label=\"Files\" truncate={false}>\n      <TreeView.Item id=\"src\" defaultExpanded>\n        <TreeView.LeadingVisual>\n          <TreeView.DirectoryIcon />\n        </TreeView.LeadingVisual>\n        src\n        <TreeView.SubTree>\n          <TreeView.Item id=\"src/Avatar.tsx\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            Avatar.tsx\n          </TreeView.Item>\n          <TreeView.Item id=\"src/Button\" current>\n            <TreeView.LeadingVisual>\n              <TreeView.DirectoryIcon />\n            </TreeView.LeadingVisual>\n            Button\n            <TreeView.SubTree>\n              <TreeView.Item id=\"src/Button/Button.tsx\">\n                <TreeView.LeadingVisual>\n                  <FileIcon />\n                </TreeView.LeadingVisual>\n                Button.tsx\n              </TreeView.Item>\n              <TreeView.Item id=\"src/Button/Button.test.tsx\">\n                <TreeView.LeadingVisual>\n                  <FileIcon />\n                </TreeView.LeadingVisual>\n                Button.test.tsx\n              </TreeView.Item>\n            </TreeView.SubTree>\n          </TreeView.Item>\n          <TreeView.Item id=\"src/ReallyLongFileNameThatShouldBeTruncated.tsx\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            ReallyLongFileNameThatShouldBeTruncated.tsx\n          </TreeView.Item>\n        </TreeView.SubTree>\n      </TreeView.Item>\n      <TreeView.Item\n        id=\"public\"\n        // eslint-disable-next-line no-console\n        onExpandedChange={(isExpanded) =>\n          console.log(\n            `${isExpanded ? 'Expanded' : 'Collapsed'} \"public\" folder `,\n          )\n        }\n      >\n        <TreeView.LeadingVisual>\n          <TreeView.DirectoryIcon />\n        </TreeView.LeadingVisual>\n        public\n        <TreeView.SubTree>\n          <TreeView.Item id=\"public/index.html\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            index.html\n          </TreeView.Item>\n          <TreeView.Item id=\"public/favicon.ico\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            favicon.ico\n          </TreeView.Item>\n        </TreeView.SubTree>\n      </TreeView.Item>\n      <TreeView.Item id=\"package.json\">\n        <TreeView.LeadingVisual>\n          <FileIcon />\n        </TreeView.LeadingVisual>\n        package.json\n      </TreeView.Item>\n    </TreeView>\n  </nav>\n)"
        },
        {
          "id": "components-treeview-features--files-changed",
          "code": "() => {\n  return (\n    <nav aria-label=\"Files\">\n      <TreeView aria-label=\"Files\" truncate={false}>\n        <TreeView.Item id=\"src\" defaultExpanded>\n          <TreeView.LeadingVisual>\n            <TreeView.DirectoryIcon />\n          </TreeView.LeadingVisual>\n          src\n          <TreeView.SubTree>\n            <TreeView.Item id=\"src/Avatar.tsx\">\n              <TreeView.LeadingVisual>\n                <FileIcon />\n              </TreeView.LeadingVisual>\n              Avatar.tsx\n              <TreeView.TrailingVisual label=\"added\">\n                <Octicon icon={DiffAddedIcon} className={classes.SuccessIcon} />\n              </TreeView.TrailingVisual>\n            </TreeView.Item>\n            <TreeView.Item id=\"src/Button\" defaultExpanded>\n              <TreeView.LeadingVisual>\n                <TreeView.DirectoryIcon />\n              </TreeView.LeadingVisual>\n              Button\n              <TreeView.SubTree>\n                <TreeView.Item id=\"src/Button/Button.tsx\" current>\n                  <TreeView.LeadingVisual>\n                    <FileIcon />\n                  </TreeView.LeadingVisual>\n                  Button.tsx\n                  <TreeView.TrailingVisual label=\"modified\">\n                    <Octicon\n                      icon={DiffModifiedIcon}\n                      className={classes.AttentionIcon}\n                    />\n                  </TreeView.TrailingVisual>\n                </TreeView.Item>\n                <TreeView.Item id=\"src/Button/Button.test.tsx\">\n                  <TreeView.LeadingVisual>\n                    <FileIcon />\n                  </TreeView.LeadingVisual>\n                  Button.test.tsx\n                  <TreeView.TrailingVisual label=\"modified\">\n                    <Octicon\n                      icon={DiffModifiedIcon}\n                      className={classes.AttentionIcon}\n                    />\n                  </TreeView.TrailingVisual>\n                </TreeView.Item>\n              </TreeView.SubTree>\n            </TreeView.Item>\n            <TreeView.Item id=\"src/ReallyLongFileNameThatShouldBeTruncated.tsx\">\n              <TreeView.LeadingVisual>\n                <FileIcon />\n              </TreeView.LeadingVisual>\n              ReallyLongFileNameThatShouldBeTruncated.tsx\n              <TreeView.TrailingVisual label=\"modified\">\n                <Octicon\n                  icon={DiffModifiedIcon}\n                  className={classes.AttentionIcon}\n                />\n              </TreeView.TrailingVisual>\n            </TreeView.Item>\n          </TreeView.SubTree>\n        </TreeView.Item>\n        <TreeView.Item id=\"public\" defaultExpanded>\n          <TreeView.LeadingVisual>\n            <TreeView.DirectoryIcon />\n          </TreeView.LeadingVisual>\n          public\n          <TreeView.SubTree>\n            <TreeView.Item id=\"public/index.html\">\n              <TreeView.LeadingVisual>\n                <FileIcon />\n              </TreeView.LeadingVisual>\n              index.html\n              <TreeView.TrailingVisual label=\"renamed\">\n                <Octicon icon={DiffRenamedIcon} />\n              </TreeView.TrailingVisual>\n            </TreeView.Item>\n            <TreeView.Item id=\"public/favicon.ico\">\n              <TreeView.LeadingVisual>\n                <FileIcon />\n              </TreeView.LeadingVisual>\n              favicon.ico\n              <TreeView.TrailingVisual label=\"removed\">\n                <Octicon\n                  icon={DiffRemovedIcon}\n                  className={classes.DangerIcon}\n                />\n              </TreeView.TrailingVisual>\n            </TreeView.Item>\n          </TreeView.SubTree>\n        </TreeView.Item>\n      </TreeView>\n    </nav>\n  )\n}"
        },
        {
          "id": "components-treeview-features--async-success",
          "code": "(args) => {\n  const [isLoading, setIsLoading] = React.useState(false)\n  const [asyncItems, setAsyncItems] = React.useState<string[]>([])\n  let state: SubTreeState = 'initial'\n  if (isLoading) {\n    state = 'loading'\n  } else if (asyncItems.length > 0) {\n    state = 'done'\n  }\n  return (\n    <nav aria-label=\"Files\">\n      <TreeView aria-label=\"Files\">\n        <TreeView.Item id=\"file-1\">\n          <TreeView.LeadingVisual>\n            <FileIcon />\n          </TreeView.LeadingVisual>\n          Some file\n        </TreeView.Item>\n        <TreeView.Item\n          id=\"async-directory\"\n          onExpandedChange={async (isExpanded) => {\n            if (asyncItems.length === 0 && isExpanded) {\n              setIsLoading(true)\n\n              // Load items\n              const items = await loadItems(args.responseTime)\n              setIsLoading(false)\n              setAsyncItems(items)\n            }\n          }}\n        >\n          <TreeView.LeadingVisual>\n            <TreeView.DirectoryIcon />\n          </TreeView.LeadingVisual>\n          Directory with async items\n          <TreeView.SubTree state={state}>\n            {asyncItems.map((item) => (\n              <TreeView.Item id={`item-${item}`} key={item}>\n                <TreeView.LeadingVisual>\n                  <FileIcon />\n                </TreeView.LeadingVisual>\n                {item}\n              </TreeView.Item>\n            ))}\n          </TreeView.SubTree>\n        </TreeView.Item>\n        <TreeView.Item id=\"another-file\">\n          <TreeView.LeadingVisual>\n            <FileIcon />\n          </TreeView.LeadingVisual>\n          Another file\n        </TreeView.Item>\n      </TreeView>\n    </nav>\n  )\n}"
        },
        {
          "id": "components-treeview-features--async-error",
          "code": "(args) => {\n  const [isLoading, setIsLoading] = React.useState(false)\n  const [asyncItems, setAsyncItems] = React.useState<string[]>([])\n  const [error, setError] = React.useState<Error | null>(null)\n  let state: SubTreeState = 'initial'\n  if (isLoading) {\n    state = 'loading'\n  } else if (error) {\n    state = 'error'\n  } else if (asyncItems.length > 0) {\n    state = 'done'\n  }\n  async function loadItems() {\n    if (asyncItems.length === 0) {\n      setIsLoading(true)\n      try {\n        // Try to load items\n        const items = await alwaysFails(args.responseTime)\n        setAsyncItems(items)\n      } catch (error) {\n        setError(error as Error)\n      } finally {\n        setIsLoading(false)\n      }\n    }\n  }\n  return (\n    <TreeView aria-label=\"Files\">\n      <TreeView.Item id=\"some-file\">\n        <TreeView.LeadingVisual>\n          <FileIcon />\n        </TreeView.LeadingVisual>\n        Some file\n      </TreeView.Item>\n      <TreeView.Item\n        id=\"async-directory\"\n        onExpandedChange={(isExpanded) => {\n          if (isExpanded) {\n            loadItems()\n          }\n        }}\n      >\n        <TreeView.LeadingVisual>\n          <TreeView.DirectoryIcon />\n        </TreeView.LeadingVisual>\n        Directory with async items\n        <TreeView.SubTree state={state}>\n          {error ? (\n            <TreeView.ErrorDialog\n              onRetry={() => {\n                setError(null)\n                loadItems()\n              }}\n              onDismiss={() => {\n                setError(null)\n              }}\n            >\n              {error.message}\n            </TreeView.ErrorDialog>\n          ) : null}\n          {asyncItems.map((item) => (\n            <TreeView.Item key={item} id={`item-${item}`}>\n              <TreeView.LeadingVisual>\n                <FileIcon />\n              </TreeView.LeadingVisual>\n              {item}\n            </TreeView.Item>\n          ))}\n        </TreeView.SubTree>\n      </TreeView.Item>\n      <TreeView.Item id=\"another-file\">\n        <TreeView.LeadingVisual>\n          <FileIcon />\n        </TreeView.LeadingVisual>\n        Another file\n      </TreeView.Item>\n    </TreeView>\n  )\n}"
        },
        {
          "id": "components-treeview-features--async-with-count",
          "code": "(args) => {\n  const [isLoading, setIsLoading] = React.useState(false)\n  const [asyncItems, setAsyncItems] = React.useState<string[]>([])\n  let state: SubTreeState = 'initial'\n  if (isLoading) {\n    state = 'loading'\n  } else if (asyncItems.length > 0) {\n    state = 'done'\n  }\n  return (\n    <nav aria-label=\"Files\">\n      <TreeView aria-label=\"Files\">\n        <TreeView.Item id=\"some-file\">\n          <TreeView.LeadingVisual>\n            <FileIcon />\n          </TreeView.LeadingVisual>\n          Some file\n        </TreeView.Item>\n        <TreeView.Item\n          id=\"async-directory\"\n          onExpandedChange={async (isExpanded) => {\n            if (asyncItems.length === 0 && isExpanded) {\n              setIsLoading(true)\n\n              // Load items\n              const items = await loadItems(args.responseTime)\n              setIsLoading(false)\n              setAsyncItems(items)\n            }\n          }}\n        >\n          <TreeView.LeadingVisual>\n            <TreeView.DirectoryIcon />\n          </TreeView.LeadingVisual>\n          Directory with async items\n          <TreeView.SubTree state={state} count={args.count}>\n            {asyncItems.map((item) => (\n              <TreeView.Item key={item} id={`item-${item}`}>\n                <TreeView.LeadingVisual>\n                  <FileIcon />\n                </TreeView.LeadingVisual>\n                {item}\n              </TreeView.Item>\n            ))}\n          </TreeView.SubTree>\n        </TreeView.Item>\n        <TreeView.Item id=\"another-file\">\n          <TreeView.LeadingVisual>\n            <FileIcon />\n          </TreeView.LeadingVisual>\n          Another file\n        </TreeView.Item>\n      </TreeView>\n    </nav>\n  )\n}"
        },
        {
          "id": "components-treeview-features--controlled",
          "code": "() => {\n  const [currentPath, setCurrentPath] = React.useState<string[]>([\n    'src',\n    'Avatar.tsx',\n  ])\n  const [tree, setTree] = React.useState<TreeItem[]>(initialTree)\n  return (\n    <div className={classes.ControlledContainer}>\n      <div className={classes.ButtonContainer}>\n        <Button onClick={() => setTree(collapseAll)}>Collapse all</Button>\n        <Button onClick={() => setTree(expandAll)}>Expand all</Button>\n      </div>\n      <nav aria-label=\"Files\">\n        <CurrentPathContext.Provider\n          value={{\n            currentPath,\n            setCurrentPath,\n          }}\n        >\n          <TreeView aria-label=\"Files\">\n            {tree.map((item) => (\n              <TreeItem\n                key={item.data.name}\n                item={item}\n                path={[item.data.name]}\n                onExpandedChange={(path, expanded) =>\n                  setTree((tree) => setExpanded(tree, path, expanded))\n                }\n              />\n            ))}\n          </TreeView>\n        </CurrentPathContext.Provider>\n      </nav>\n    </div>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) used to customize styles",
          "defaultValue": ""
        },
        {
          "name": "flat",
          "type": "boolean",
          "description": "Prevents the tree from indenting items. This should only be used when the tree is used to display a flat list of items."
        },
        {
          "name": "truncate",
          "type": "boolean",
          "description": "Whether to truncate node text",
          "defaultValue": "true"
        },
        {
          "name": "children",
          "type": "React.ReactNode",
          "required": true
        }
      ],
      "subcomponents": [
        {
          "name": "TreeView.Item",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "required": true
            },
            {
              "name": "id",
              "type": "string",
              "required": true,
              "description": "A unique identifier for the item."
            },
            {
              "name": "aria-label",
              "type": "string",
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "className",
              "type": "string",
              "description": "Class name(s) used to customize styles",
              "defaultValue": ""
            },
            {
              "name": "current",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Indicates whether the item is the current item. No more than one item should be current at once. The path to the current item will be expanded by default."
            },
            {
              "name": "defaultExpanded",
              "type": "boolean",
              "description": "The expanded state of the item when it is initially rendered. Use when you do not need to control the state."
            },
            {
              "name": "expanded",
              "type": "boolean",
              "description": "The controlled expanded state of item. Must be used in conjunction with onExpandedChange."
            },
            {
              "name": "secondaryActions",
              "type": "TreeViewSecondaryActions[]",
              "description": "An array of secondary actions to render in as a trailing action. Each action should have a 'label', 'icon', and 'onClick' handler."
            },
            {
              "name": "containIntrinsicSize",
              "type": "string",
              "description": "The size of this item's contents. Passing this will set 'content-visiblity: auto' on the content container, delaying rendering until the item is in the viewport."
            },
            {
              "name": "onExpandedChange",
              "type": "(expanded: boolean) => void",
              "description": "Event handler called when the expanded state of the item changes."
            },
            {
              "name": "onSelect",
              "type": "(event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) => void"
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "true",
              "description": "Truncate the item's text content with an ellipsis."
            },
            {
              "name": "ref",
              "type": "React.Ref<HTMLElement>"
            }
          ]
        },
        {
          "name": "TreeView.LeadingVisual",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "| React.ReactNode\n| (props: {isExpanded: boolean}) => React.ReactNode)"
            },
            {
              "name": "label",
              "type": "string",
              "description": "Provide an accessible label for the visual. This is not necessary for decorative visuals."
            }
          ]
        },
        {
          "name": "TreeView.TrailingVisual",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "| React.ReactNode\n| (props: {isExpanded: boolean}) => React.ReactNode)"
            },
            {
              "name": "label",
              "type": "string",
              "description": "Provide an accessible label for the visual. This is not necessary for decorative visuals."
            }
          ]
        },
        {
          "name": "TreeView.DirectoryIcon",
          "props": []
        },
        {
          "name": "TreeView.SubTree",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "state",
              "type": "| 'initial'\n| 'loading'\n| 'done'\n| 'error'",
              "description": "Specify a state if items in the subtree are loaded asynchronously. An asynchronous subtree can be in one of the following states: 'initial', 'loading', 'done', or 'error'. In the 'initial' state, items are neither loaded nor loading. In the 'loading' state, items are loading and the subtree will render a loading indicator. In the 'done' state, items are loaded. Screen readers will announce when a subtree enters the 'done' state. An 'error' state means that an error occurred while loading items."
            },
            {
              "name": "count",
              "type": "number",
              "description": "The number of items expected to be in the subtree. When in the loading state, the subtree will render a skeleton loading placeholder with the specified count of items"
            },
            {
              "name": "aria-label",
              "type": "string",
              "description": "An accessible name for the subtree. It is recommended that you provide a short version of the parent list item's name as the name of the subtree."
            }
          ]
        },
        {
          "name": "TreeView.ErrorDialog",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "React.ReactNode",
              "description": "The content of the dialog. This is usually a message explaining the error."
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "'Error'",
              "description": "The title of the dialog. This is usually a short description of the error."
            },
            {
              "name": "onRetry",
              "type": "() => void",
              "description": "Event handler called when the user clicks the retry button."
            },
            {
              "name": "onDismiss",
              "type": "() => void",
              "description": "Event handler called when the dialog is dismissed."
            }
          ]
        }
      ]
    },
    "truncate": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Truncate",
      "id": "truncate",
      "name": "Truncate",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-truncate--default",
          "code": "() => <Truncate title=\"Some example text\">Some example text</Truncate>"
        },
        {
          "id": "components-truncate-features--expandable",
          "code": "() => (\n  <Truncate title=\"Hover this example text\" expandable>\n    Hover this example text\n  </Truncate>\n)"
        },
        {
          "id": "components-truncate-features--inline",
          "code": "() => (\n  <>\n    <ArrowRightIcon />\n    <Truncate title=\"Inline example text\" inline>\n      Inline example text\n    </Truncate>\n    <ArrowLeftIcon />\n  </>\n)"
        },
        {
          "id": "components-truncate-features--max-width",
          "code": "() => (\n  <Truncate title=\"Some example text with a max width\" maxWidth={200}>\n    Some example text with a max width\n  </Truncate>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "maxWidth",
          "type": "number",
          "defaultValue": "125",
          "description": "Sets the max-width of the text."
        },
        {
          "name": "inline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Displays text as inline block and vertical aligns to the top."
        },
        {
          "name": "expandable",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Allows the truncated text to be displayed on hover."
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "'div'"
        }
      ],
      "subcomponents": []
    },
    "underline_nav": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/UnderlineNav",
      "id": "underline_nav",
      "name": "UnderlineNav",
      "status": "beta",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "components-underlinenav-features--default",
          "code": "() => {\n  const children = ['Code', 'Pull requests', 'Actions', 'Projects', 'Wiki']\n  return (\n    <UnderlineNav aria-label=\"Repository\">\n      {children.map((child: string, index: number) => (\n        <UnderlineNavItem\n          key={index}\n          href=\"#\"\n          aria-current={index === 0 ? 'page' : undefined}\n        >\n          {child}\n        </UnderlineNavItem>\n      ))}\n    </UnderlineNav>\n  )\n}"
        },
        {
          "id": "components-underlinenav-features--with-icons",
          "code": "() => {\n  return (\n    <UnderlineNav aria-label=\"Repository with icons\">\n      <UnderlineNav.Item leadingVisual={<CodeIcon />}>Code</UnderlineNav.Item>\n      <UnderlineNav.Item leadingVisual={<EyeIcon />} counter={6}>\n        Issues\n      </UnderlineNav.Item>\n      <UnderlineNav.Item\n        aria-current=\"page\"\n        leadingVisual={<GitPullRequestIcon />}\n      >\n        Pull Requests\n      </UnderlineNav.Item>\n      <UnderlineNav.Item leadingVisual={<CommentDiscussionIcon />} counter={7}>\n        Discussions\n      </UnderlineNav.Item>\n      <UnderlineNav.Item leadingVisual={<ProjectIcon />}>\n        Projects\n      </UnderlineNav.Item>\n    </UnderlineNav>\n  )\n}"
        },
        {
          "id": "components-underlinenav-features--with-counter-labels",
          "code": "() => {\n  return (\n    <UnderlineNav aria-label=\"Repository with counters\">\n      <UnderlineNav.Item\n        aria-current=\"page\"\n        leadingVisual={<CodeIcon />}\n        counter=\"11K\"\n      >\n        Code\n      </UnderlineNav.Item>\n      <UnderlineNav.Item leadingVisual={<IssueOpenedIcon />} counter={12}>\n        Issues\n      </UnderlineNav.Item>\n    </UnderlineNav>\n  )\n}"
        },
        {
          "id": "components-underlinenav-features--overflow-template",
          "code": "({ initialSelectedIndex = 1 }: { initialSelectedIndex?: number }) => {\n  const [selectedIndex, setSelectedIndex] = React.useState<number | null>(\n    initialSelectedIndex,\n  )\n  return (\n    <UnderlineNav\n      aria-label=\"Repository\"\n      // @ts-ignore UnderlineNav does not take selectionVariant prop, but we need to pass it to the underlying ActionList so it doesn't show Selections.\n      selectionVariant={undefined}\n    >\n      {items.map((item, index) => (\n        <UnderlineNav.Item\n          key={item.navigation}\n          leadingVisual={item.icon}\n          aria-current={index === selectedIndex ? 'page' : undefined}\n          // Set so that navigation in interaction tests does not cause the\n          // page to load the storybook iframe URL and instead keeps the test in\n          // the local preview\n          target=\"_self\"\n          onSelect={(event) => {\n            event.preventDefault()\n            setSelectedIndex(index)\n          }}\n          counter={item.counter}\n          href={item.href}\n        >\n          {item.navigation}\n        </UnderlineNav.Item>\n      ))}\n    </UnderlineNav>\n  )\n}"
        },
        {
          "id": "components-underlinenav-features--overflow-on-narrow-screen",
          "code": "() => {\n  return <OverflowTemplate initialSelectedIndex={1} />\n}"
        },
        {
          "id": "components-underlinenav-features--counters-loading-state",
          "code": "() => {\n  const [selectedIndex, setSelectedIndex] = React.useState<number | null>(1)\n  return (\n    <UnderlineNav\n      aria-label=\"Repository with loading counters\"\n      loadingCounters={true}\n    >\n      {items.map((item, index) => (\n        <UnderlineNav.Item\n          key={item.navigation}\n          leadingVisual={item.icon}\n          aria-current={index === selectedIndex ? 'page' : undefined}\n          onSelect={() => setSelectedIndex(index)}\n          counter={item.counter}\n        >\n          {item.navigation}\n        </UnderlineNav.Item>\n      ))}\n    </UnderlineNav>\n  )\n}"
        },
        {
          "id": "components-underlinenav-features--variant-flush",
          "code": "() => {\n  return (\n    <UnderlineNav aria-label=\"Repository\" variant=\"flush\">\n      <UnderlineNav.Item aria-current=\"page\">Code</UnderlineNav.Item>\n      <UnderlineNav.Item>Issues</UnderlineNav.Item>\n      <UnderlineNav.Item>Pull Requests</UnderlineNav.Item>\n    </UnderlineNav>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "A unique name for the rendered nav landmark. It will also be used to label the arrow\nbuttons that control the scroll behaviour on coarse pointer devices. (I.e.\n'Scroll _aria-label_ left/right')\n"
        },
        {
          "name": "children",
          "type": "UnderlineNav.Item[]",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "loadingCounters",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the navigation items are in loading state. Component waits for all the counters to finish loading to prevent multiple layout shifts."
        },
        {
          "name": "variant",
          "type": "'inset' | 'flush'",
          "defaultValue": "'inset'",
          "description": "`inset` children are offset horizontally from container edges. `flush` children are flush horizontally with container edges"
        }
      ],
      "subcomponents": [
        {
          "name": "UnderlineNav.Item",
          "props": [
            {
              "name": "aria-current",
              "type": "| 'page' | 'step' | 'location' | 'date' | 'time' | true | false",
              "defaultValue": "false",
              "description": "Set `aria-current` to `\"page\"` to indicate that the item represents the current page. Set `aria-current` to `\"location\"` to indicate that the item represents the current location on a page. For more information about `aria-current`, see [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)."
            },
            {
              "name": "counter",
              "type": "number | string",
              "defaultValue": "",
              "description": "The number to display in the counter label."
            },
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "description": "The URL that the item navigates to. `href` is passed to the underlying `<a>` element. If 'as' is specified, the component may need different props and 'href' is ignored. (Required prop for the react router is 'to' for example)"
            },
            {
              "name": "icon",
              "type": "Component",
              "defaultValue": "",
              "description": "The leading icon comes before item label",
              "deprecated": true
            },
            {
              "name": "leadingVisual",
              "type": "React.ReactElement",
              "defaultValue": "",
              "description": "The leading visual comes before item label"
            },
            {
              "name": "onSelect",
              "type": "(event) => void",
              "defaultValue": "",
              "description": "The handler that gets called when a nav link is selected. For example, a manual route binding can be done here(I.e. 'navigate(href)' for the react router.)"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes"
          }
        }
      ]
    },
    "dialog": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/deprecated/DialogV1",
      "id": "dialog",
      "docsId": "dialog",
      "name": "Dialog",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-dialog--default",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const returnFocusRef = useRef(null)\n  return (\n    <div>\n      <div\n        style={{\n          marginBottom: 'var(--stack-gap-normal)',\n        }}\n      >\n        <Banner\n          title=\"This component is deprecated\"\n          description=\"We recommend using Dialog instead.\"\n          variant=\"warning\"\n        />\n      </div>\n      <Button\n        data-testid=\"trigger-button\"\n        ref={returnFocusRef}\n        onClick={() => setIsOpen(true)}\n      >\n        Show Dialog\n      </Button>\n      <Dialog\n        returnFocusRef={returnFocusRef}\n        isOpen={isOpen}\n        onDismiss={() => setIsOpen(false)}\n        aria-labelledby=\"header\"\n      >\n        <div data-testid=\"inner\">\n          <Dialog.Header id=\"header\">Title</Dialog.Header>\n          <div\n            style={{\n              padding: 'var(--stack-gap-normal)',\n            }}\n          >\n            <Text>Some content</Text>\n          </div>\n        </div>\n      </Dialog>\n    </div>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "isOpen",
          "type": "boolean",
          "description": "Whether or not the dialog is open"
        },
        {
          "name": "onDismiss",
          "type": "() => void",
          "description": "Function that will be called when the dialog is closed"
        },
        {
          "name": "returnFocusRef",
          "type": " React.RefObject<HTMLElement>",
          "description": "The element to restore focus back to after the `Dialog` is closed"
        },
        {
          "name": "initialFocusRef",
          "type": " React.RefObject<HTMLElement>",
          "description": "Element inside of the `Dialog` you'd like to be focused when the Dialog is opened. If nothing is passed to `initialFocusRef` the close button is focused."
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "description": "Pass an id to use for the aria-label. Use either a `aria-label` or an `aria-labelledby` but not both."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Pass a label to be used to describe the Dialog. Use either a `aria-label` or an `aria-labelledby` but not both."
        },
        {
          "name": "narrow",
          "type": "boolean"
        },
        {
          "name": "wide",
          "type": "boolean"
        }
      ],
      "subcomponents": [
        {
          "name": "Dialog.Header",
          "props": []
        }
      ]
    },
    "filtered_search": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/deprecated/FilteredSearch",
      "id": "filtered_search",
      "name": "FilteredSearch",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-filteredsearch--default",
          "code": "() => (\n  <FilteredSearch>\n    <ActionMenu>\n      <ActionMenu.Button as=\"summary\">Filter</ActionMenu.Button>\n      <ActionMenu.Overlay>\n        <ActionList>\n          <ActionList.Item>Item 1</ActionList.Item>\n          <ActionList.Item>Item 2</ActionList.Item>\n          <ActionList.Item>Item 3</ActionList.Item>\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n    <TextInput aria-label=\"Filtered search\" leadingVisual={SearchIcon} />\n  </FilteredSearch>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "description": "FilteredSearch is expected to contain an `ActionMenu` followed by a `TextInput`."
        }
      ],
      "subcomponents": []
    },
    "legacy_underline_nav": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/deprecated/UnderlineNav",
      "id": "legacy_underline_nav",
      "name": "UnderlineNav",
      "status": "deprecated",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "deprecated-components-underlinenav--default",
          "code": "() => (\n  <UnderlineNav aria-label=\"Main\">\n    <UnderlineNav.Link href=\"#home\" selected>\n      Home\n    </UnderlineNav.Link>\n    <UnderlineNav.Link href=\"#documentation\">Documentation</UnderlineNav.Link>\n    <UnderlineNav.Link href=\"#support\">Support</UnderlineNav.Link>\n  </UnderlineNav>\n)"
        },
        {
          "id": "deprecated-components-underlinenav-features--actions",
          "code": "() => (\n  <UnderlineNav aria-label=\"Main\" actions={<Button>Click me</Button>}>\n    <UnderlineNav.Link href=\"#home\" selected>\n      Home\n    </UnderlineNav.Link>\n    <UnderlineNav.Link href=\"#documentation\">Documentation</UnderlineNav.Link>\n    <UnderlineNav.Link href=\"#support\">Support</UnderlineNav.Link>\n  </UnderlineNav>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "actions",
          "type": "React.ReactNode",
          "description": "Place another element, such as a button, to the opposite side of the navigation items."
        },
        {
          "name": "align",
          "type": "'right'",
          "description": "Use `right` to have navigation items aligned right."
        },
        {
          "name": "full",
          "type": "boolean",
          "description": "Used to make navigation fill the width of the container."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element."
        }
      ],
      "subcomponents": [
        {
          "name": "UnderlineNav.Link",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "'a'"
            },
            {
              "name": "href",
              "type": "string"
            },
            {
              "name": "selected",
              "type": "boolean"
            }
          ]
        }
      ]
    },
    "issue_label": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/IssueLabel",
      "id": "issue_label",
      "name": "IssueLabel",
      "status": "alpha",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "experimental-components-issuelabel--default",
          "code": "() => <IssueLabel>Issue label</IssueLabel>"
        },
        {
          "id": "experimental-components-issuelabel-features--group-of-labels",
          "code": "() => (\n  <Stack direction=\"horizontal\" gap=\"condensed\" wrap=\"wrap\">\n    <IssueLabel variant=\"blue\">Issue label</IssueLabel>\n    <IssueLabel variant=\"purple\">Another label</IssueLabel>\n    <IssueLabel variant=\"green\">A third label</IssueLabel>\n    <IssueLabel variant=\"orange\">Issue label</IssueLabel>\n    <IssueLabel variant=\"yellow\">Another label</IssueLabel>\n    <IssueLabel variant=\"brown\">A third label</IssueLabel>\n  </Stack>\n)"
        },
        {
          "id": "experimental-components-issuelabel-features--hex-color",
          "code": "(args: { fillColor: `#${string}` }) => {\n  return <IssueLabel fillColor={args.fillColor}>Issue label</IssueLabel>\n}"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "as",
          "type": "React.ElementType",
          "description": "The HTML element or React component to render as the root element"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling"
        },
        {
          "name": "fillColor",
          "type": "string",
          "description": "The hex code for a custom background color"
        },
        {
          "name": "variant",
          "type": "'pink'\n| 'plum'\n| 'purple'\n| 'indigo'\n| 'blue'\n| 'cyan'\n| 'teal'\n| 'pine'\n| 'green'\n| 'lime'\n| 'olive'\n| 'lemon'\n| 'yellow'\n| 'orange'\n| 'red'\n| 'coral'\n| 'gray'\n| 'brown'\n| 'auburn'",
          "defaultValue": "'gray'",
          "description": "Color variant for the background and text color"
        }
      ],
      "subcomponents": []
    },
    "select_panel_v2": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/SelectPanel2",
      "id": "select_panel_v2",
      "docsId": "select_panel",
      "name": "SelectPanel",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-selectpanel--default",
          "code": "() => {\n  const initialSelectedLabels = data.issue.labelIds // mock initial state: has selected labels\n  const [selectedLabelIds, setSelectedLabelIds] = React.useState<string[]>(\n    initialSelectedLabels,\n  )\n\n  /* Selection */\n  const onLabelSelect = (labelId: string) => {\n    if (!selectedLabelIds.includes(labelId))\n      setSelectedLabelIds([...selectedLabelIds, labelId])\n    else setSelectedLabelIds(selectedLabelIds.filter((id) => id !== labelId))\n  }\n  const onClearSelection = () => {\n    setSelectedLabelIds([])\n  }\n  const onSubmit = () => {\n    data.issue.labelIds = selectedLabelIds // pretending to persist changes\n  }\n  const onCancel = () => {\n    setSelectedLabelIds(initialSelectedLabels)\n  }\n\n  /* Filtering */\n  const [filteredLabels, setFilteredLabels] = React.useState(data.labels)\n  const [query, setQuery] = React.useState('')\n  const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n    event,\n  ) => {\n    const query = event.currentTarget.value\n    setQuery(query)\n    if (query === '') setFilteredLabels(data.labels)\n    else {\n      setFilteredLabels(\n        data.labels\n          .map((label) => {\n            if (label.name.toLowerCase().startsWith(query))\n              return {\n                priority: 1,\n                label,\n              }\n            else if (label.name.toLowerCase().includes(query))\n              return {\n                priority: 2,\n                label,\n              }\n            else if (label.description?.toLowerCase().includes(query))\n              return {\n                priority: 3,\n                label,\n              }\n            else\n              return {\n                priority: -1,\n                label,\n              }\n          })\n          .filter((result) => result.priority > 0)\n          .map((result) => result.label),\n      )\n    }\n  }\n  const sortingFn = (\n    itemA: {\n      id: string\n    },\n    itemB: {\n      id: string\n    },\n  ) => {\n    const initialSelectedIds = data.issue.labelIds\n    if (\n      initialSelectedIds.includes(itemA.id) &&\n      initialSelectedIds.includes(itemB.id)\n    )\n      return 1\n    else if (initialSelectedIds.includes(itemA.id)) return -1\n    else if (initialSelectedIds.includes(itemB.id)) return 1\n    else return 1\n  }\n  const itemsToShow = query ? filteredLabels : data.labels.sort(sortingFn)\n  return (\n    <>\n      <SelectPanel\n        title=\"Select labels\"\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n        onClearSelection={onClearSelection}\n      >\n        <SelectPanel.Button>Assign label</SelectPanel.Button>\n\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput\n            aria-label=\"Search\"\n            onChange={onSearchInputChange}\n          />\n        </SelectPanel.Header>\n\n        {itemsToShow.length === 0 ? (\n          <SelectPanel.Message\n            variant=\"empty\"\n            title={`No labels found for \"${query}\"`}\n          >\n            Try a different search term\n          </SelectPanel.Message>\n        ) : (\n          <ActionList>\n            {itemsToShow.map((label) => (\n              <ActionList.Item\n                key={label.id}\n                onSelect={() => onLabelSelect(label.id)}\n                selected={selectedLabelIds.includes(label.id)}\n              >\n                <ActionList.LeadingVisual>\n                  <div\n                    className={sharedClasses.Circle}\n                    style={{\n                      backgroundColor: `#${label.color}`,\n                    }}\n                  />\n                </ActionList.LeadingVisual>\n                {label.name}\n                <ActionList.Description variant=\"block\">\n                  {label.description}\n                </ActionList.Description>\n              </ActionList.Item>\n            ))}\n          </ActionList>\n        )}\n\n        <SelectPanel.Footer>\n          <SelectPanel.SecondaryAction variant=\"button\">\n            Edit labels\n          </SelectPanel.SecondaryAction>\n        </SelectPanel.Footer>\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-examples--minimal",
          "code": "() => {\n  const initialSelectedLabels = data.issue.labelIds // mock initial state: has selected labels\n  const [selectedLabelIds, setSelectedLabelIds] = React.useState<string[]>(\n    initialSelectedLabels,\n  )\n\n  /* Selection */\n  const onLabelSelect = (labelId: string) => {\n    if (!selectedLabelIds.includes(labelId))\n      setSelectedLabelIds([...selectedLabelIds, labelId])\n    else setSelectedLabelIds(selectedLabelIds.filter((id) => id !== labelId))\n  }\n  const onSubmit = () => {\n    data.issue.labelIds = selectedLabelIds // pretending to persist changes\n\n    // eslint-disable-next-line no-console\n    console.log('form submitted')\n  }\n  const onCancel = () => {\n    setSelectedLabelIds(initialSelectedLabels)\n  }\n  const sortingFn = (\n    itemA: {\n      id: string\n    },\n    itemB: {\n      id: string\n    },\n  ) => {\n    const initialSelectedIds = data.issue.labelIds\n    if (\n      initialSelectedIds.includes(itemA.id) &&\n      initialSelectedIds.includes(itemB.id)\n    )\n      return 1\n    else if (initialSelectedIds.includes(itemA.id)) return -1\n    else if (initialSelectedIds.includes(itemB.id)) return 1\n    else return 1\n  }\n  const itemsToShow = data.labels.sort(sortingFn)\n  return (\n    <>\n      <h1>Minimal SelectPanel</h1>\n\n      <SelectPanel\n        title=\"Select labels\"\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n      >\n        <SelectPanel.Button>Assign label</SelectPanel.Button>\n\n        <ActionList>\n          {itemsToShow.map((label) => (\n            <ActionList.Item\n              key={label.id}\n              onSelect={() => onLabelSelect(label.id)}\n              selected={selectedLabelIds.includes(label.id)}\n            >\n              <ActionList.LeadingVisual>\n                {getCircle(label.color)}\n              </ActionList.LeadingVisual>\n              {label.name}\n              <ActionList.Description variant=\"block\">\n                {label.description}\n              </ActionList.Description>\n            </ActionList.Item>\n          ))}\n        </ActionList>\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-examples--short-select-panel",
          "code": "() => {\n  const initialChannels = {\n    GitHub: false,\n    Email: false,\n  }\n  const [channels, setChannels] = React.useState(initialChannels)\n  const [onlyFailures, setOnlyFailures] = React.useState(false)\n  const onSubmit = () => {\n    // eslint-disable-next-line no-console\n    console.log('form submitted')\n  }\n  const onCancel = () => {\n    setChannels(initialChannels)\n  }\n  const toggleChannel = (channel: keyof typeof channels) => {\n    setChannels({\n      ...channels,\n      [channel]: !channels[channel],\n    })\n  }\n  const channelsEnabled = channels.GitHub || channels.Email\n  return (\n    <>\n      <h1>Short SelectPanel</h1>\n      <p>\n        Use <code>height=fit-content</code> to match height of contents\n      </p>\n      <SelectPanel\n        title=\"Select notification channels\"\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n      >\n        <SelectPanel.Button>\n          <Text className={classes.TextMuted}>Notify me:</Text>{' '}\n          {Object.keys(channels)\n            .filter((channel) => channels[channel as keyof typeof channels])\n            .join(', ') || 'Never'}\n          {onlyFailures && channelsEnabled && ' (Failed workflows only)'}\n        </SelectPanel.Button>\n\n        <ActionList>\n          <ActionList.Item\n            selected={channels.GitHub}\n            onSelect={() => toggleChannel('GitHub')}\n          >\n            On GitHub\n          </ActionList.Item>\n          <ActionList.Item\n            selected={channels.Email}\n            onSelect={() => toggleChannel('Email')}\n          >\n            Email\n          </ActionList.Item>\n          <div\n            role=\"none\"\n            className={`${classes.TransitionBox} ${channelsEnabled ? classes.TransitionBoxVisible : classes.TransitionBoxHidden}`}\n          >\n            <ActionList.Divider />\n            <ActionList.Item\n              selected={onlyFailures}\n              onSelect={() => setOnlyFailures(!onlyFailures)}\n            >\n              Only notify for failed workflows\n            </ActionList.Item>\n          </div>\n        </ActionList>\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-features--instant-selection-variant",
          "code": "() => {\n  const [selectedTag, setSelectedTag] = React.useState<string>()\n  const onSubmit = () => {\n    if (!selectedTag) return\n    data.ref = selectedTag // pretending to persist changes\n  }\n  const itemsToShow = data.tags\n  return (\n    <>\n      <h1>Instant selection variant</h1>\n\n      <SelectPanel\n        title=\"Choose a tag\"\n        selectionVariant=\"instant\"\n        onSubmit={onSubmit}\n      >\n        <SelectPanel.Button leadingVisual={TagIcon}>\n          {selectedTag || 'Choose a tag'}\n        </SelectPanel.Button>\n\n        <ActionList>\n          {itemsToShow.map((tag) => (\n            <ActionList.Item\n              key={tag.id}\n              onSelect={() => setSelectedTag(tag.id)}\n              selected={selectedTag === tag.id}\n            >\n              {tag.name}\n            </ActionList.Item>\n          ))}\n        </ActionList>\n        <SelectPanel.Footer>\n          <SelectPanel.SecondaryAction variant=\"button\">\n            Edit tags\n          </SelectPanel.SecondaryAction>\n        </SelectPanel.Footer>\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-features--with-warning",
          "code": "() => {\n  /* Selection */\n\n  const initialAssigneeIds = data.issue.assigneeIds // mock initial state\n  const [selectedAssigneeIds, setSelectedAssigneeIds] =\n    React.useState<string[]>(initialAssigneeIds)\n  const MAX_LIMIT = 3\n  const onCollaboratorSelect = (colloratorId: string) => {\n    if (!selectedAssigneeIds.includes(colloratorId))\n      setSelectedAssigneeIds([...selectedAssigneeIds, colloratorId])\n    else\n      setSelectedAssigneeIds(\n        selectedAssigneeIds.filter((id) => id !== colloratorId),\n      )\n  }\n  const onClearSelection = () => setSelectedAssigneeIds([])\n  const onSubmit = () => {\n    data.issue.assigneeIds = selectedAssigneeIds // pretending to persist changes\n  }\n  const onCancel = () => {\n    setSelectedAssigneeIds(initialAssigneeIds)\n  }\n\n  /* Filtering */\n  const [filteredUsers, setFilteredUsers] = React.useState(data.collaborators)\n  const [query, setQuery] = React.useState('')\n  const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n    event,\n  ) => {\n    const query = event.currentTarget.value\n    setQuery(query)\n    if (query === '') setFilteredUsers(data.collaborators)\n    else {\n      setFilteredUsers(\n        data.collaborators\n          .map((collaborator) => {\n            if (collaborator.login.toLowerCase().startsWith(query))\n              return {\n                priority: 1,\n                collaborator,\n              }\n            else if (collaborator.name.startsWith(query))\n              return {\n                priority: 2,\n                collaborator,\n              }\n            else if (collaborator.login.toLowerCase().includes(query))\n              return {\n                priority: 3,\n                collaborator,\n              }\n            else if (collaborator.name.toLowerCase().includes(query))\n              return {\n                priority: 4,\n                collaborator,\n              }\n            else\n              return {\n                priority: -1,\n                collaborator,\n              }\n          })\n          .filter((result) => result.priority > 0)\n          .map((result) => result.collaborator),\n      )\n    }\n  }\n  const sortingFn = (\n    itemA: {\n      id: string\n    },\n    itemB: {\n      id: string\n    },\n  ) => {\n    const initialSelectedIds = data.issue.assigneeIds\n    if (\n      initialSelectedIds.includes(itemA.id) &&\n      initialSelectedIds.includes(itemB.id)\n    )\n      return 1\n    else if (initialSelectedIds.includes(itemA.id)) return -1\n    else if (initialSelectedIds.includes(itemB.id)) return 1\n    else return 1\n  }\n  const itemsToShow = query ? filteredUsers : data.collaborators.sort(sortingFn)\n  return (\n    <>\n      <h1>SelectPanel with warning</h1>\n\n      <SelectPanel\n        title=\"Set assignees\"\n        description={`Select up to ${MAX_LIMIT} people`}\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n        onClearSelection={onClearSelection}\n      >\n        <SelectPanel.Button\n          variant=\"invisible\"\n          trailingAction={GearIcon}\n          className={classes.ButtonCustom}\n        >\n          Assignees\n        </SelectPanel.Button>\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput\n            onChange={onSearchInputChange}\n            aria-label=\"Search\"\n          />\n        </SelectPanel.Header>\n\n        {selectedAssigneeIds.length >= MAX_LIMIT ? (\n          <SelectPanel.Message variant=\"warning\" size=\"inline\">\n            You have reached the limit of {MAX_LIMIT} assignees on your free\n            account. <Link href=\"/upgrade\">Upgrade your account.</Link>\n          </SelectPanel.Message>\n        ) : null}\n\n        {itemsToShow.length === 0 ? (\n          <SelectPanel.Message\n            variant=\"empty\"\n            title={`No labels found for \"${query}\"`}\n          >\n            Try a different search term\n          </SelectPanel.Message>\n        ) : (\n          <ActionList>\n            {itemsToShow.map((collaborator) => (\n              <ActionList.Item\n                key={collaborator.id}\n                onSelect={() => onCollaboratorSelect(collaborator.id)}\n                selected={selectedAssigneeIds.includes(collaborator.id)}\n                disabled={\n                  selectedAssigneeIds.length >= MAX_LIMIT &&\n                  !selectedAssigneeIds.includes(collaborator.id)\n                }\n              >\n                <ActionList.LeadingVisual>\n                  <Avatar\n                    src={`https://github.com/${collaborator.login}.png`}\n                  />\n                </ActionList.LeadingVisual>\n                {collaborator.login}\n                <ActionList.Description>\n                  {collaborator.login}\n                </ActionList.Description>\n              </ActionList.Item>\n            ))}\n          </ActionList>\n        )}\n\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-examples--open-from-menu",
          "code": "() => {\n  /* Open state */\n  const [menuOpen, setMenuOpen] = React.useState(false)\n  const [selectPanelOpen, setSelectPanelOpen] = React.useState(false)\n\n  /* Selection */\n  const [selectedSetting, setSelectedSetting] =\n    React.useState<string>('All activity')\n  const initialCustomEvents: string[] = []\n  const [selectedCustomEvents, setSelectedCustomEvents] =\n    React.useState<string[]>(initialCustomEvents)\n  const onEventSelect = (event: string) => {\n    if (!selectedCustomEvents.includes(event))\n      setSelectedCustomEvents([...selectedCustomEvents, event])\n    else\n      setSelectedCustomEvents(\n        selectedCustomEvents.filter((name) => name !== event),\n      )\n  }\n  const itemsToShow = [\n    'Issues',\n    'Pull requests',\n    'Releases',\n    'Discussions',\n    'Security alerts',\n  ]\n  return (\n    <>\n      <h1>Open in modal from ActionMenu</h1>\n\n      <ActionMenu open={menuOpen} onOpenChange={(value) => setMenuOpen(value)}>\n        <ActionMenu.Button leadingVisual={EyeIcon}>\n          {selectedSetting === 'Ignore' ? 'Watch' : 'Unwatch'}\n        </ActionMenu.Button>\n        <ActionMenu.Overlay width=\"medium\">\n          <ActionList selectionVariant=\"single\">\n            <ActionList.Item\n              selected={selectedSetting === 'Participating and @mentions'}\n              onSelect={() => setSelectedSetting('Participating and @mentions')}\n            >\n              Participating and @mentions\n              <ActionList.Description variant=\"block\">\n                Only receive notifications from this repository when\n                participating or @mentioned.\n              </ActionList.Description>\n            </ActionList.Item>\n            <ActionList.Item\n              selected={selectedSetting === 'All activity'}\n              onSelect={() => setSelectedSetting('All activity')}\n            >\n              All activity\n              <ActionList.Description variant=\"block\">\n                Notified of all notifications on this repository.\n              </ActionList.Description>\n            </ActionList.Item>\n            <ActionList.Item\n              selected={selectedSetting === 'Ignore'}\n              onSelect={() => setSelectedSetting('Ignore')}\n            >\n              Ignore\n              <ActionList.Description variant=\"block\">\n                Never be notified.\n              </ActionList.Description>\n            </ActionList.Item>\n            <ActionList.Item\n              selected={selectedSetting === 'Custom'}\n              onSelect={() => {\n                setMenuOpen(false)\n                setSelectPanelOpen(true)\n              }}\n            >\n              Custom\n              <ActionList.TrailingVisual>\n                <ArrowRightIcon />\n              </ActionList.TrailingVisual>\n              <ActionList.Description variant=\"block\">\n                Select events you want to be notified of in addition to\n                participating and @mentions.\n              </ActionList.Description>\n            </ActionList.Item>\n          </ActionList>\n        </ActionMenu.Overlay>\n      </ActionMenu>\n      <SelectPanel\n        variant=\"modal\"\n        title=\"Custom\"\n        open={selectPanelOpen}\n        onSubmit={() => {\n          setSelectedSetting('Custom')\n          setSelectPanelOpen(false)\n          setMenuOpen(false)\n        }}\n        onCancel={() => {\n          setSelectedCustomEvents(initialCustomEvents)\n          setSelectPanelOpen(false)\n          setMenuOpen(true)\n        }}\n      >\n        <ActionList>\n          {itemsToShow.map((item) => (\n            <ActionList.Item\n              key={item}\n              onSelect={() => onEventSelect(item)}\n              selected={selectedCustomEvents.includes(item)}\n            >\n              {item}\n            </ActionList.Item>\n          ))}\n        </ActionList>\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-examples--with-groups",
          "code": "() => {\n  /* Selection */\n  const initialAssigneeIds = data.issue.assigneeIds // mock initial state\n  const [selectedAssigneeIds, setSelectedAssigneeIds] =\n    React.useState<string[]>(initialAssigneeIds)\n  const onCollaboratorSelect = (collaboratorId: string) => {\n    if (!selectedAssigneeIds.includes(collaboratorId))\n      setSelectedAssigneeIds([...selectedAssigneeIds, collaboratorId])\n    else\n      setSelectedAssigneeIds(\n        selectedAssigneeIds.filter((id) => id !== collaboratorId),\n      )\n  }\n  const onClearSelection = () => setSelectedAssigneeIds([])\n  const onSubmit = () => {\n    data.issue.assigneeIds = selectedAssigneeIds // pretending to persist changes\n  }\n  const onCancel = () => {\n    setSelectedAssigneeIds(initialAssigneeIds)\n  }\n\n  /* Filtering */\n  const [filteredUsers, setFilteredUsers] = React.useState(data.collaborators)\n  const [query, setQuery] = React.useState('')\n  const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n    event,\n  ) => {\n    const query = event.currentTarget.value\n    setQuery(query)\n    if (query === '') setFilteredUsers(data.collaborators)\n    else {\n      setFilteredUsers(\n        data.collaborators\n          .map((collaborator) => {\n            if (collaborator.login.toLowerCase().startsWith(query))\n              return {\n                priority: 1,\n                collaborator,\n              }\n            else if (collaborator.name.startsWith(query))\n              return {\n                priority: 2,\n                collaborator,\n              }\n            else if (collaborator.login.toLowerCase().includes(query))\n              return {\n                priority: 3,\n                collaborator,\n              }\n            else if (collaborator.name.toLowerCase().includes(query))\n              return {\n                priority: 4,\n                collaborator,\n              }\n            else\n              return {\n                priority: -1,\n                collaborator,\n              }\n          })\n          .filter((result) => result.priority > 0)\n          .map((result) => result.collaborator),\n      )\n    }\n  }\n  const sortingFn = (\n    itemA: {\n      id: string\n    },\n    itemB: {\n      id: string\n    },\n  ) => {\n    const initialSelectedIds = data.issue.assigneeIds\n    if (\n      initialSelectedIds.includes(itemA.id) &&\n      initialSelectedIds.includes(itemB.id)\n    )\n      return 1\n    else if (initialSelectedIds.includes(itemA.id)) return -1\n    else if (initialSelectedIds.includes(itemB.id)) return 1\n    else return 1\n  }\n  const itemsToShow = query ? filteredUsers : data.collaborators.sort(sortingFn)\n  return (\n    <>\n      <h1>SelectPanel with groups</h1>\n\n      <SelectPanel\n        title=\"Request up to 100 reviewers\"\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n        onClearSelection={onClearSelection}\n      >\n        <SelectPanel.Button\n          variant=\"invisible\"\n          trailingAction={GearIcon}\n          style={{\n            width: '200px',\n          }}\n          className={classes.ButtonContentStartJustify}\n        >\n          Reviewers\n        </SelectPanel.Button>\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput onChange={onSearchInputChange} />\n        </SelectPanel.Header>\n\n        {itemsToShow.length === 0 ? (\n          <SelectPanel.Message\n            variant=\"empty\"\n            title={`No labels found for \"${query}\"`}\n          >\n            Try a different search term\n          </SelectPanel.Message>\n        ) : (\n          <ActionList>\n            <ActionList.Group>\n              <ActionList.GroupHeading variant=\"filled\">\n                Suggestions\n              </ActionList.GroupHeading>\n              {itemsToShow\n                .filter((collaborator) => collaborator.recommended)\n                .map((collaborator) => (\n                  <ActionList.Item\n                    key={collaborator.id}\n                    onSelect={() => onCollaboratorSelect(collaborator.id)}\n                    selected={selectedAssigneeIds.includes(collaborator.id)}\n                  >\n                    <ActionList.LeadingVisual>\n                      <Avatar\n                        src={`https://github.com/${collaborator.login}.png`}\n                      />\n                    </ActionList.LeadingVisual>\n                    {collaborator.login}\n                    <ActionList.Description>\n                      {collaborator.login}\n                    </ActionList.Description>\n                  </ActionList.Item>\n                ))}\n            </ActionList.Group>\n            <ActionList.Group>\n              <ActionList.GroupHeading variant=\"filled\">\n                Everyone else\n              </ActionList.GroupHeading>\n              {itemsToShow\n                .filter((collaborator) => !collaborator.recommended)\n                .map((collaborator) => (\n                  <ActionList.Item\n                    key={collaborator.id}\n                    onSelect={() => onCollaboratorSelect(collaborator.id)}\n                    selected={selectedAssigneeIds.includes(collaborator.id)}\n                  >\n                    <ActionList.LeadingVisual>\n                      <Avatar\n                        src={`https://github.com/${collaborator.login}.png`}\n                      />\n                    </ActionList.LeadingVisual>\n                    {collaborator.login}\n                    <ActionList.Description>\n                      {collaborator.login}\n                    </ActionList.Description>\n                  </ActionList.Item>\n                ))}\n            </ActionList.Group>\n          </ActionList>\n        )}\n\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-examples--async-search-with-use-transition",
          "code": "() => {\n  const [isPending, startTransition] = React.useTransition()\n  const [query, setQuery] = React.useState('')\n  const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n    event,\n  ) => {\n    const query = event.currentTarget.value\n    startTransition(() => setQuery(query))\n  }\n\n  /* Selection */\n  const initialAssigneeIds: string[] = data.issue.assigneeIds\n  const [selectedUserIds, setSelectedUserIds] =\n    React.useState<string[]>(initialAssigneeIds)\n  const onUserSelect = (userId: string) => {\n    if (!selectedUserIds.includes(userId))\n      setSelectedUserIds([...selectedUserIds, userId])\n    else setSelectedUserIds(selectedUserIds.filter((id) => id !== userId))\n  }\n  const onSubmit = () => {\n    data.issue.assigneeIds = selectedUserIds // pretending to persist changes\n    // eslint-disable-next-line no-console\n    console.log('form submitted')\n  }\n  const onCancel = () => {\n    setSelectedUserIds(initialAssigneeIds)\n  }\n  return (\n    <>\n      <h1>Async: search with useTransition</h1>\n      <p>Fetching items on every keystroke search (like github users)</p>\n\n      <SelectPanel\n        title=\"Select collaborators\"\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n      >\n        <SelectPanel.Button>Select assignees</SelectPanel.Button>\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput\n            loading={isPending}\n            onChange={onSearchInputChange}\n          />\n        </SelectPanel.Header>\n\n        <SearchableUserList\n          query={query}\n          initialAssigneeIds={initialAssigneeIds}\n          selectedUserIds={selectedUserIds}\n          onUserSelect={onUserSelect}\n        />\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-examples--async-with-suspended-list",
          "code": "() => {\n  const [query, setQuery] = React.useState('')\n  const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n    event,\n  ) => {\n    const query = event.currentTarget.value\n    setQuery(query)\n  }\n  return (\n    <>\n      <h1>Async: Suspended list</h1>\n      <p>\n        Fetching items once when the panel is opened (like repo labels)\n        <br />\n        Note: Save and Cancel is not implemented in this demo\n      </p>\n\n      <SelectPanel title=\"Select labels\">\n        <SelectPanel.Button>Assign label</SelectPanel.Button>\n\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput onChange={onSearchInputChange} />\n        </SelectPanel.Header>\n\n        <React.Suspense\n          fallback={\n            <SelectPanel.Loading>Fetching labels...</SelectPanel.Loading>\n          }\n        >\n          <SuspendedActionList query={query} />\n          <SelectPanel.Footer>\n            <SelectPanel.SecondaryAction variant=\"link\" href=\"/settings\">\n              Edit labels\n            </SelectPanel.SecondaryAction>\n          </SelectPanel.Footer>\n        </React.Suspense>\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-selectpanel-examples--with-filter-buttons",
          "code": "() => {\n  const [selectedFilter, setSelectedFilter] = React.useState<\n    'branches' | 'tags'\n  >('branches')\n\n  /* Selection */\n  const [savedInitialRef, setSavedInitialRef] = React.useState(data.ref)\n  const [selectedRef, setSelectedRef] = React.useState(savedInitialRef)\n  const onSubmit = () => {\n    setSavedInitialRef(selectedRef)\n    data.ref = selectedRef // pretending to persist changes\n\n    // eslint-disable-next-line no-console\n    console.log('form submitted')\n  }\n  const onCancel = () => {\n    setSelectedRef(savedInitialRef)\n  }\n\n  /* Filter */\n  const [query, setQuery] = React.useState('')\n  const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n    event,\n  ) => {\n    const query = event.currentTarget.value\n    setQuery(query)\n  }\n  const [filteredRefs, setFilteredRefs] = React.useState(data.branches)\n  const setSearchResults = (\n    query: string,\n    selectedFilter: 'branches' | 'tags',\n  ) => {\n    if (query === '') setFilteredRefs(data[selectedFilter])\n    else {\n      setFilteredRefs(\n        data[selectedFilter]\n          .map((item) => {\n            if (item.name.toLowerCase().startsWith(query))\n              return {\n                priority: 1,\n                item,\n              }\n            else if (item.name.toLowerCase().includes(query))\n              return {\n                priority: 2,\n                item,\n              }\n            else\n              return {\n                priority: -1,\n                item,\n              }\n          })\n          .filter((result) => result.priority > 0)\n          .map((result) => result.item),\n      )\n    }\n  }\n  React.useEffect(\n    function updateSearchResults() {\n      // eslint-disable-next-line react-hooks/set-state-in-effect\n      setSearchResults(query, selectedFilter)\n    },\n    [query, selectedFilter],\n  )\n  const sortingFn = (ref: { id: string }) => {\n    if (ref.id === savedInitialRef) return -1\n    else return 1\n  }\n  const itemsToShow = query\n    ? filteredRefs\n    : data[selectedFilter].sort(sortingFn)\n  return (\n    <>\n      <h1>With Filter Buttons {savedInitialRef}</h1>\n\n      <SelectPanel\n        title=\"Switch branches/tags\"\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n      >\n        <SelectPanel.Button\n          leadingVisual={GitBranchIcon}\n          trailingVisual={TriangleDownIcon}\n        >\n          {savedInitialRef}\n        </SelectPanel.Button>\n\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput onChange={onSearchInputChange} />\n\n          <div id=\"filters\" className={classes.FilterButtons}>\n            <Button\n              variant=\"invisible\"\n              style={{\n                fontWeight:\n                  selectedFilter === 'branches'\n                    ? 'var(--base-text-weight-medium)'\n                    : 'var(--base-text-weight-normal)',\n                color: 'var(--fgColor-default)',\n              }}\n              onClick={() => setSelectedFilter('branches')}\n              count={20}\n            >\n              Branches\n            </Button>\n            <Button\n              variant=\"invisible\"\n              style={{\n                fontWeight:\n                  selectedFilter === 'tags'\n                    ? 'var(--base-text-weight-medium)'\n                    : 'var(--base-text-weight-normal)',\n                color: 'var(--fgColor-default)',\n              }}\n              onClick={() => setSelectedFilter('tags')}\n              count={8}\n            >\n              Tags\n            </Button>\n          </div>\n        </SelectPanel.Header>\n\n        {itemsToShow.length === 0 ? (\n          <SelectPanel.Message\n            variant=\"empty\"\n            title={`No labels found for \"${query}\"`}\n          >\n            Try a different search term\n          </SelectPanel.Message>\n        ) : (\n          <ActionList>\n            {itemsToShow.map((item) => (\n              <ActionList.Item\n                key={item.id}\n                selected={selectedRef === item.id}\n                onSelect={() => setSelectedRef(item.id)}\n              >\n                {item.name}\n                <ActionList.TrailingVisual>\n                  {item.trailingInfo}\n                </ActionList.TrailingVisual>\n              </ActionList.Item>\n            ))}\n          </ActionList>\n        )}\n\n        <SelectPanel.Footer>\n          <SelectPanel.SecondaryAction\n            variant=\"link\"\n            href={`/${selectedFilter}`}\n          >\n            View all {selectedFilter}\n          </SelectPanel.SecondaryAction>\n        </SelectPanel.Footer>\n      </SelectPanel>\n    </>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "title",
          "type": "string",
          "required": true,
          "description": "A descriptive title for the panel"
        },
        {
          "name": "defaultOpen",
          "type": "boolean",
          "description": "",
          "defaultValue": "false"
        },
        {
          "name": "description",
          "type": "string",
          "description": "When provided, a description is displayed below the title"
        },
        {
          "name": "variant",
          "type": "'anchored' | 'modal'",
          "defaultValue": "anchored"
        },
        {
          "name": "selectionVariant",
          "type": "'multiple' | 'single' | 'instant'",
          "defaultValue": "multiple"
        },
        {
          "name": "onSubmit",
          "type": "(event: React.FormEvent) => void",
          "description": "Function that will be called when the panel is closed"
        },
        {
          "name": "onCancel",
          "type": "() => void",
          "description": "Function that will be called when the selection is submitted"
        },
        {
          "name": "onClearSelection",
          "type": "() => void",
          "description": "Function that will be called when the clear selection is selection"
        },
        {
          "name": "anchorRef",
          "type": "React.RefObject<HTMLButtonElement>",
          "description": "Useful for defining an external anchor"
        },
        {
          "name": "open",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If defined, will control the open/closed state of the panel."
        },
        {
          "name": "children",
          "type": "React.ReactNode[]",
          "description": "Recommended: `SelectPanel.Button`, `SelectPanel.Header`, `ActionList`, `SelectPanel.Loading`, `SelectPanel.Message`, `SelectPanel.Footer`"
        },
        {
          "name": "width",
          "type": "| 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | 'auto'",
          "defaultValue": "'medium'",
          "description": "Sets the width of the Dialog, pick from our set list of widths, or pass `auto` to automatically set the width based on the contents. `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `480px`, `xlarge` corresponds to `640px`, `xxlarge` corresponds to `960px`."
        },
        {
          "name": "height",
          "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'fit-content'",
          "defaultValue": "'large'",
          "description": "Sets the height of the `Dialog`, pick from our set list of heights, or pass `fit-content` to set the height based on the contents. `xsmall` corresponds to `192px`, `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `432px`, `xlarge` corresponds to `600px`."
        },
        {
          "name": "maxHeight",
          "type": "'small' | 'large' | 'medium' | 'fit-content' | 'xlarge'",
          "description": "",
          "defaultValue": "'large'"
        }
      ],
      "subcomponents": [
        {
          "name": "SelectPanel.Button",
          "props": [
            {
              "name": "children",
              "type": "React.ReactElement",
              "required": true,
              "defaultValue": ""
            }
          ],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        },
        {
          "name": "SelectPanel.Header",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "description": "Rendered before the list. Recommended: `SelectPanel.SearchInput`"
            },
            {
              "name": "onBack",
              "type": "() => void",
              "description": "",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "SelectPanel.SearchInput",
          "props": [
            {
              "name": "onChange",
              "type": "React.ChangeEventHandler<HTMLInputElement>",
              "description": "Callback when input text changes, use this for search/filter"
            },
            {
              "name": "loading",
              "type": "boolean",
              "description": "Useful for subtle loading states while fetching items asynchronously"
            }
          ],
          "passthrough": {
            "element": "TextInput",
            "url": "/react/TextInput"
          }
        },
        {
          "name": "SelectPanel.Footer",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "description": "Optional: `<SelectPanel.SecondaryButton>`"
            }
          ]
        },
        {
          "name": "SelectPanel.SecondaryAction",
          "props": [
            {
              "name": "variant",
              "type": "'button' | 'link' | 'checkbox'"
            }
          ]
        },
        {
          "name": "SelectPanel.Loading",
          "props": [
            {
              "name": "children",
              "type": "string"
            }
          ]
        },
        {
          "name": "SelectPanel.Message",
          "props": [
            {
              "name": "variant",
              "type": "'warning' | 'error' | 'empty'"
            },
            {
              "name": "size",
              "type": "'inline' | 'full'"
            },
            {
              "name": "title",
              "type": "string",
              "description": "`inline` variant does not accept `title`"
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        }
      ]
    },
    "underline_panels": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/UnderlinePanels",
      "id": "underline_panels",
      "name": "UnderlinePanels",
      "status": "draft",
      "a11yReviewed": "2025-01-08",
      "stories": [
        {
          "id": "experimental-components-underlinepanels--default",
          "code": "() => {\n  const tabs = ['Tab 1', 'Tab 2', 'Tab 3']\n  const panels = ['Panel 1', 'Panel 2', 'Panel 3']\n  return (\n    <UnderlinePanels aria-label=\"Select a tab\">\n      {tabs.map((tab: string, index: number) => (\n        <UnderlinePanels.Tab\n          key={index}\n          aria-selected={index === 0 ? true : undefined}\n        >\n          {tab}\n        </UnderlinePanels.Tab>\n      ))}\n      {panels.map((panel: string, index: number) => (\n        <UnderlinePanels.Panel key={index}>{panel}</UnderlinePanels.Panel>\n      ))}\n    </UnderlinePanels>\n  )\n}"
        },
        {
          "id": "experimental-components-underlinepanels-features--labelled-by-external-element",
          "code": "() => (\n  <>\n    <h2 id=\"my-heading\">UnderlinePanels example</h2>\n    <UnderlinePanels aria-labelledby=\"my-heading\">\n      <UnderlinePanels.Tab>Tab 1</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab>Tab 2</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab>Tab 3</UnderlinePanels.Tab>\n      <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n    </UnderlinePanels>\n  </>\n)"
        },
        {
          "id": "experimental-components-underlinepanels-features--selected-tab",
          "code": "() => (\n  <UnderlinePanels aria-label=\"Select a tab\" id=\"tab-panels\">\n    <UnderlinePanels.Tab>Tab 1</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab aria-selected={true}>Tab 2</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab>Tab 3</UnderlinePanels.Tab>\n    <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n  </UnderlinePanels>\n)"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-counters",
          "code": "() => {\n  return (\n    <UnderlinePanels aria-label=\"Tabs with counters\">\n      <UnderlinePanels.Tab counter=\"11K\">Tab 1</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab counter={12}>Tab 2</UnderlinePanels.Tab>\n      <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    </UnderlinePanels>\n  )\n}"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-counters-in-loading-state",
          "code": "() => {\n  return (\n    <UnderlinePanels aria-label=\"Tabs with counters\" loadingCounters>\n      <UnderlinePanels.Tab counter=\"11K\">Tab 1</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab counter={12}>Tab 2</UnderlinePanels.Tab>\n      <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    </UnderlinePanels>\n  )\n}"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-icons",
          "code": "() => (\n  <UnderlinePanels aria-label=\"Tabs with icons\">\n    <UnderlinePanels.Tab icon={CodeIcon}>Tab 1</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={EyeIcon}>Tab 2</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GitPullRequestIcon}>Tab 3</UnderlinePanels.Tab>\n    <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n  </UnderlinePanels>\n)"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-icons-hidden-on-narrow-screen",
          "code": "() => (\n  <UnderlinePanels aria-label=\"Tabs with icons\">\n    <UnderlinePanels.Tab icon={CodeIcon}>Tab 1</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={EyeIcon}>Tab 2</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GitPullRequestIcon}>Tab 3</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={CommentDiscussionIcon}>\n      Tab 4\n    </UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={PlayIcon}>Tab 5</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={ProjectIcon}>Tab 6</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GraphIcon}>Tab 7</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GearIcon}>Tab 8</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={ShieldLockIcon}>Tab 9</UnderlinePanels.Tab>\n    <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 4</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 5</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 6</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 7</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 8</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 9</UnderlinePanels.Panel>\n  </UnderlinePanels>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Accessible name for the tab list"
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "defaultValue": "",
          "description": "ID of the element containing the name for the tab list"
        },
        {
          "name": "children",
          "type": "Array<UnderlinePanels.Tab | UnderlinePanels.Panel>",
          "defaultValue": "",
          "required": true,
          "description": "Tabs (UnderlinePanels.Tab) and panels (UnderlinePanels.Panel) to render"
        },
        {
          "name": "id",
          "type": "string",
          "defaultValue": "",
          "description": "Custom string to use when generating the IDs of tabs and `aria-labelledby` for the panels"
        },
        {
          "name": "loadingCounters",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Loading state for all counters. It displays loading animation for individual counters until all are resolved. It is needed to prevent multiple layout shift."
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "'div'",
          "description": "The HTML element or React component used to render the outermost element."
        }
      ],
      "subcomponents": [
        {
          "name": "UnderlinePanels.Tab",
          "props": [
            {
              "name": "aria-selected",
              "type": "| boolean | 'true' | 'false'",
              "defaultValue": "false",
              "description": "Whether this is the selected tab. For more information about `aria-selected`, see [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-selected)."
            },
            {
              "name": "onSelect",
              "type": "(event) => void",
              "defaultValue": "",
              "description": "The handler that gets called when the tab is selected"
            },
            {
              "name": "counter",
              "type": "number | string",
              "defaultValue": "",
              "description": "Content of CounterLabel rendered after tab text label"
            },
            {
              "name": "icon",
              "type": "Component",
              "defaultValue": "",
              "description": "Icon rendered before the tab text label"
            }
          ]
        },
        {
          "name": "UnderlinePanels.Panel",
          "props": [],
          "passthrough": {
            "element": "div",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#Attributes"
          }
        }
      ]
    }
  }
}