{
  "schemaVersion": 2,
  "components": {
    "dialog": {
      "id": "dialog",
      "docsId": "dialog",
      "name": "Dialog",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-dialog--default",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const returnFocusRef = useRef(null)\n  return (\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          <Box p={3}>\n            <Text>Some content</Text>\n          </Box>\n        </div>\n      </Dialog>\n    </div>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "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": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Dialog.Header",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "actionbar": {
      "id": "actionbar",
      "name": "ActionBar",
      "status": "alpha",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "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    ></ActionBar.IconButton>\n  </ActionBar>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "required": false,
          "description": "Size of the action bar"
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "When provided, a label is added to the action bar"
        },
        {
          "name": "children",
          "type": "React.ReactElement",
          "required": true
        }
      ],
      "subcomponents": [
        {
          "name": "ActionBar.Icon",
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "ActionBar.Divider",
          "props": []
        }
      ]
    },
    "action_list": {
      "id": "action_list",
      "name": "ActionList",
      "status": "beta",
      "a11yReviewed": false,
      "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\">Filter by</ActionList.Heading>\n    <ActionList.Group>\n      <ActionList.GroupHeading as=\"h4\">Repositories</ActionList.GroupHeading>\n      <ActionList.Item onClick={() => {}}>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        app/assets/modules\n      </ActionList.Item>\n      <ActionList.Item onClick={() => {}}>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        src/react/components\n      </ActionList.Item>\n      <ActionList.Item onClick={() => {}}>\n        <ActionList.LeadingVisual>\n          <FileDirectoryIcon />\n        </ActionList.LeadingVisual>\n        memex/shared-ui/components\n      </ActionList.Item>\n      <ActionList.Item onClick={() => {}}>\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=\"h4\">Advanced</ActionList.GroupHeading>\n      <ActionList.Item onClick={() => {}}>\n        <ActionList.LeadingVisual>\n          <PlusCircleIcon />\n        </ActionList.LeadingVisual>\n        Owner\n      </ActionList.Item>\n      <ActionList.Item onClick={() => {}}>\n        <ActionList.LeadingVisual>\n          <PlusCircleIcon />\n        </ActionList.LeadingVisual>\n        Symbol\n      </ActionList.Item>\n      <ActionList.Item onClick={() => {}}>\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\n      as=\"h1\"\n      id=\"list-heading\"\n      sx={{\n        fontSize: 3,\n        marginX: 3,\n      }}\n    >\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      <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--list-box-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 selectionVariant=\"multiple\" aria-label=\"Project\">\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--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      <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--links",
          "code": "() => (\n  <>\n    <ActionList.Heading\n      as=\"h1\"\n      sx={{\n        fontSize: 1,\n      }}\n    >\n      Details\n    </ActionList.Heading>\n    <ActionList>\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--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  <Box maxWidth=\"300px\">\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>\n          This description gets truncated because it is inline\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  </Box>\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  const SideEffectDescription = () => {\n    const [seconds, setSeconds] = React.useState(0)\n    React.useEffect(() => {\n      const fn = () => setSeconds((s) => s + 1)\n      const interval = window.setInterval(fn, 1000)\n      return () => window.clearInterval(interval)\n    }, [])\n    return <>{seconds} seconds passed</>\n  }\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) => <button {...props}>toggle overlay</button>}\n    >\n      <ActionList>\n        <ActionList.Item>\n          Use your arrow keys\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item>\n          keep going\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item>\n          more more\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Item variant=\"danger\">\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}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "ActionList.Item[] | ActionList.LinkItem[] | ActionList.Group[]",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "variant",
          "type": "'inset' | 'full'",
          "defaultValue": "'inset'",
          "description": "`inset` children are offset (vertically and 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": "showDivider",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Display a divider above each item in this list when it does not follow a header or divider."
        },
        {
          "name": "role",
          "type": "AriaRole",
          "defaultValue": "",
          "description": "ARIA role describing the function of the list. `listbox` and `menu` are a common values."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "ActionList.Item",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode | ActionList.LeadingVisual | ActionList.Description | ActionList.TrailingVisual",
              "defaultValue": "",
              "required": true,
              "description": ""
            },
            {
              "name": "variant",
              "type": "'default' | 'danger'",
              "defaultValue": "'default'",
              "description": "`danger` indicates that the item is destructive."
            },
            {
              "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. \n If there is a trailing visual, it will replace the trailing visual.\n If 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": "role",
              "type": "AriaRole",
              "defaultValue": "",
              "description": "ARIA role describing the function of the item. `option` is a common value."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ],
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "ActionList.TrailingVisual",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Visual positioned after item text."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "action_menu": {
      "id": "action_menu",
      "name": "ActionMenu",
      "status": "beta",
      "a11yReviewed": false,
      "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        <Box\n          sx={{\n            color: 'fg.muted',\n            display: 'inline-block',\n          }}\n        >\n          Options:\n        </Box>{' '}\n        {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--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": "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"
            }
          ],
          "passthrough": {
            "element": "Overlay",
            "url": "/react/Overlay"
          }
        }
      ]
    },
    "anchored_overlay": {
      "id": "anchored_overlay",
      "name": "AnchoredOverlay",
      "status": "alpha",
      "a11yReviewed": false,
      "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    >\n      <Box\n        width=\"100%\"\n        height=\"100%\"\n        backgroundColor=\"thistle\"\n        display=\"flex\"\n        flexDirection=\"column\"\n      >\n        <img src={`//placekitten.com/200/300`} alt=\"kitten\" />\n      </Box>\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                      <Box m={2}>\n                        <Playground\n                          {...{\n                            ...args,\n                            portalContainerName: 'scrollingPortal',\n                          }}\n                        />\n                      </Box>\n                    </td>\n                  ))}\n              </tr>\n            ))}\n        </tbody>\n      </table>\n    </HeaderAndLayout>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "open",
          "type": "boolean",
          "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') => 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."
        }
      ]
    },
    "autocomplete": {
      "id": "autocomplete",
      "name": "Autocomplete",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-autocomplete--default",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, inputArgs, overlayArgs, textInputArgs } =\n    getArgsByChildComponent(args)\n  const isMultiselect = menuArgs.selectionVariant === 'multiple'\n  const [selectedItemIds, setSelectedItemIds] = useState<Array<string>>([])\n  const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n    if (!Array.isArray(newlySelectedItems)) {\n      return\n    }\n    setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n  }\n  const autocompleteInput = {\n    ...inputArgs,\n    ...textInputArgs,\n  }\n  const formValidationId = 'validation-field'\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n      onSubmit={(event) => event.preventDefault()}\n    >\n      <FormControl {...parentArgs}>\n        <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n        <Autocomplete>\n          <Autocomplete.Input\n            aria-describedby={formValidationId}\n            {...autocompleteInput}\n            size={textInputArgs.inputSize}\n            data-testid=\"autocompleteInput\"\n          />\n          <Autocomplete.Overlay {...overlayArgs}>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={isMultiselect ? selectedItemIds : []}\n              onSelectedChange={isMultiselect ? onSelectedChange : undefined}\n              aria-labelledby=\"autocompleteLabel\"\n              {...menuArgs}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n        {captionArgs.children && <FormControl.Caption {...captionArgs} />}\n        {validationArgs.children && validationArgs.variant && (\n          <FormControl.Validation\n            id={formValidationId}\n            {...validationArgs}\n            variant={validationArgs.variant}\n          />\n        )}\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--with-token-input",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputWithTokensArgs } =\n    getArgsByChildComponent(args)\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    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl {...parentArgs}>\n        <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n        <Autocomplete>\n          <Autocomplete.Input\n            as={TextInputTokens}\n            tokens={tokens}\n            onTokenRemove={onTokenRemove}\n            {...textInputWithTokensArgs}\n          />\n          <Autocomplete.Overlay {...menuArgs}>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={selectedItemIds}\n              onSelectedChange={onSelectedChange}\n              selectionVariant=\"multiple\"\n              aria-labelledby=\"autocompleteLabel\"\n              {...overlayArgs}\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    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--add-new-item",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputWithTokensArgs } =\n    getArgsByChildComponent(args)\n  const [localItemsState, setLocalItemsState] = useState<Datum[]>(items)\n  const [filterVal, setFilterVal] = useState<string>('')\n  const [tokens, setTokens] = useState<Datum[]>(mockTokens)\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  const onItemSelect: (item: Datum) => void = (item) => {\n    onSelectedChange([\n      ...selectedItemIds.map(\n        (id) => items.find((selectedItem) => selectedItem.id === id) as Datum,\n      ),\n      item,\n    ])\n    if (!localItemsState.some((localItem) => localItem.id === item.id)) {\n      setLocalItemsState([...localItemsState, item])\n    }\n  }\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n    setFilterVal(e.currentTarget.value)\n  }\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl {...parentArgs}>\n        <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n        <Autocomplete>\n          <Autocomplete.Input\n            as={TextInputTokens}\n            tokens={tokens}\n            onTokenRemove={onTokenRemove}\n            onChange={handleChange}\n            {...textInputWithTokensArgs}\n          />\n          <Autocomplete.Overlay {...overlayArgs}>\n            <Autocomplete.Menu\n              addNewItem={\n                filterVal &&\n                !localItemsState\n                  .map((localItem) => localItem.text)\n                  .includes(filterVal)\n                  ? {\n                      id: filterVal,\n                      text: `Add '${filterVal}'`,\n                      handleAddItem: (item) => {\n                        onItemSelect({\n                          ...item,\n                          text: filterVal,\n                          selected: true,\n                        })\n                        setFilterVal('')\n                      },\n                    }\n                  : undefined\n              }\n              items={localItemsState}\n              selectedItemIds={selectedItemIds}\n              onSelectedChange={onSelectedChange}\n              aria-labelledby=\"autocompleteLabel\"\n              {...menuArgs}\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    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-search-filter-fn",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\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    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl {...parentArgs}>\n        <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n        <Autocomplete>\n          <Autocomplete.Input\n            onChange={handleChange}\n            {...textInputArgs}\n            size={textInputArgs.inputSize}\n          />\n          <Autocomplete.Overlay {...overlayArgs}>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={[]}\n              filterFn={customFilterFn}\n              aria-labelledby=\"autocompleteLabel\"\n              {...menuArgs}\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    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-sort-after-menu-close",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\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    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\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={items}\n              selectedItemIds={selectedItemIds}\n              onSelectedChange={onSelectedChange}\n              sortOnCloseFn={customSortFn}\n              aria-labelledby=\"autocompleteLabel\"\n              {...menuArgs}\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    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--with-callback-when-overlay-open-state-changes",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\n  const [isMenuOpen, setIsMenuOpen] = useState<boolean>(false)\n  const onOpenChange = (isOpen: boolean) => {\n    setIsMenuOpen(isOpen)\n  }\n  return (\n    <Box\n      as=\"form\"\n      display=\"flex\"\n      sx={{\n        gap: '1em',\n        p: 3,\n      }}\n    >\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={items}\n              selectedItemIds={[]}\n              onOpenChange={onOpenChange}\n              aria-labelledby=\"autocompleteLabel\"\n              {...menuArgs}\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      <div>\n        The menu is <strong>{isMenuOpen ? 'opened' : 'closed'}</strong>\n      </div>\n    </Box>\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 = () => {\n    setTimeout(() => {\n      setLoadedItems(items)\n    }, 1500)\n  }\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\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    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--rendering-the-menu-outside-an-overlay",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, textInputArgs } = getArgsByChildComponent(args)\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl {...parentArgs}>\n        <FormControl.Label id=\"autocompleteLabel\" {...labelArgs} />\n        <Autocomplete>\n          <Autocomplete.Input\n            {...textInputArgs}\n            size={textInputArgs.inputSize}\n          />\n          <Autocomplete.Menu\n            items={items}\n            selectedItemIds={[]}\n            aria-labelledby=\"autocompleteLabel\"\n            {...menuArgs}\n          />\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    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-overlay-menu-anchor",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\n  const menuAnchorRef = useRef<HTMLElement>(null)\n  const anchorWrapperStyles = {\n    display: 'flex',\n    alignItems: 'center',\n    flexGrow: 1,\n    flexShrink: 0,\n    flexBasis: '25%',\n    border: '1px solid black',\n    padding: '1em',\n  }\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl {...parentArgs}>\n        <FormControl.Label\n          htmlFor=\"autocompleteInput\"\n          id=\"autocompleteLabel\"\n          {...labelArgs}\n        />\n        <Box\n          {...anchorWrapperStyles}\n          ref={menuAnchorRef as React.RefObject<HTMLDivElement>}\n        >\n          <Autocomplete>\n            <Autocomplete.Input\n              id=\"autocompleteInput\"\n              aria-describedby=\"autocompleteCaption autocompleteValidation\"\n              sx={{\n                border: '0',\n                padding: '0',\n                boxShadow: 'none',\n                ':focus-within': {\n                  border: '0',\n                  boxShadow: 'none',\n                },\n              }}\n              {...textInputArgs}\n              size={textInputArgs.inputSize}\n            />\n            <Autocomplete.Overlay\n              menuAnchorRef={menuAnchorRef}\n              {...overlayArgs}\n            >\n              <Autocomplete.Menu\n                items={items}\n                selectedItemIds={[]}\n                aria-labelledby=\"autocompleteLabel\"\n                {...menuArgs}\n              />\n            </Autocomplete.Overlay>\n          </Autocomplete>\n        </Box>\n        {captionArgs.children && (\n          <FormControl.Caption id=\"autocompleteCaption\" {...captionArgs} />\n        )}\n        {validationArgs.children && validationArgs.variant && (\n          <FormControl.Validation\n            id=\"autocompleteValidation\"\n            {...validationArgs}\n            variant={validationArgs.variant}\n          />\n        )}\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--in-overlay-with-custom-scroll-container-ref",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { menuArgs, textInputArgs } = getArgsByChildComponent(args)\n  const scrollContainerRef = useRef<HTMLElement>(null)\n  const inputRef = useRef<HTMLInputElement>(null)\n  const [isOpen, setIsOpen] = useState(false)\n  const handleOpen = () => {\n    setIsOpen(true)\n    inputRef.current && inputRef.current.focus()\n  }\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <AnchoredOverlay\n        open={isOpen}\n        onOpen={handleOpen}\n        onClose={() => setIsOpen(false)}\n        width=\"large\"\n        height=\"xsmall\"\n        focusTrapSettings={{\n          initialFocusRef: inputRef,\n        }}\n        side=\"inside-top\"\n        renderAnchor={(props) => <Button {...props}>open overlay</Button>}\n      >\n        <Autocomplete>\n          <Box display=\"flex\" flexDirection=\"column\" height=\"100%\">\n            <Box\n              borderWidth={0}\n              borderBottomWidth={1}\n              borderColor=\"border.default\"\n              borderStyle=\"solid\"\n            >\n              <Autocomplete.Input\n                ref={inputRef}\n                sx={{\n                  display: 'flex',\n                  border: '0',\n                  paddingX: 3,\n                  paddingY: 1,\n                  boxShadow: 'none',\n                  ':focus-within': {\n                    border: '0',\n                    boxShadow: 'none',\n                  },\n                }}\n                {...textInputArgs}\n                size={textInputArgs.inputSize}\n                block\n              />\n            </Box>\n            <Box\n              overflow=\"auto\"\n              flexGrow={1}\n              ref={scrollContainerRef as RefObject<HTMLDivElement>}\n            >\n              <Autocomplete.Menu\n                items={items}\n                selectedItemIds={[]}\n                customScrollContainerRef={scrollContainerRef}\n                aria-labelledby=\"autocompleteLabel\"\n                {...menuArgs}\n              />\n            </Box>\n          </Box>\n        </Autocomplete>\n      </AnchoredOverlay>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--in-a-dialog",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { overlayArgs } = getArgsByChildComponent(args)\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        id=\"dialog-with-autocomplete\"\n        isOpen={isDialogOpen}\n        onDismiss={() => setIsDialogOpen(false)}\n      >\n        <div ref={outerContainerRef}>\n          <Box\n            as=\"form\"\n            sx={{\n              p: 3,\n            }}\n          >\n            {mounted ? (\n              <FormControl>\n                <FormControl.Label id=\"autocompleteLabel\" />\n                <Autocomplete>\n                  <Autocomplete.Input data-testid=\"autocompleteInput\" />\n                  <Autocomplete.Overlay\n                    {...overlayArgs}\n                    portalContainerName=\"outerContainer\"\n                  >\n                    <Autocomplete.Menu\n                      items={items}\n                      selectedItemIds={[]}\n                      aria-labelledby=\"autocompleteLabel\"\n                    />\n                  </Autocomplete.Overlay>\n                </Autocomplete>\n              </FormControl>\n            ) : null}\n          </Box>\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"
        }
      ],
      "subcomponents": [
        {
          "name": "Autocomplete.Input",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "TextInput"
            },
            {
              "name": "openOnFocus",
              "type": "boolean",
              "defaultValue": "true",
              "description": "Whether the associated autocomplete menu should open on an input focus event"
            }
          ],
          "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 | number)[]",
              "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": {
      "id": "avatar",
      "name": "Avatar",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-avatar--default",
          "code": "() => <Avatar src=\"https://avatars.githubusercontent.com/u/92997159?v=4\" />"
        },
        {
          "id": "components-avatar-features--square",
          "code": "() => <Avatar square src=\"https://avatars.githubusercontent.com/primer\" />"
        },
        {
          "id": "components-avatar-features--size",
          "code": "() => (\n  <div>\n    <Avatar\n      size={4}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={8}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={12}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={16}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={20}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={24}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={28}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={32}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={40}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={48}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={56}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={64}\n      src=\"https://avatars.githubusercontent.com/u/92997159?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      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 8,\n        regular: 12,\n        wide: 16,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 12,\n        regular: 16,\n        wide: 20,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 16,\n        regular: 20,\n        wide: 24,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 20,\n        regular: 24,\n        wide: 28,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 24,\n        regular: 28,\n        wide: 32,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 28,\n        regular: 32,\n        wide: 40,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 32,\n        regular: 40,\n        wide: 48,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 40,\n        regular: 48,\n        wide: 56,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 48,\n        regular: 56,\n        wide: 64,\n      }}\n      src=\"https://avatars.githubusercontent.com/u/92997159?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": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "avatar_pair": {
      "id": "avatar_pair",
      "name": "AvatarPair",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-avatarpair--default",
          "code": "() => (\n  <AvatarPair>\n    <Avatar src=\"https://avatars.githubusercontent.com/u/92997159?v=4\" />\n    <Avatar src=\"https://avatars.githubusercontent.com/primer\" />\n  </AvatarPair>\n)"
        },
        {
          "id": "components-avatarpair-features--parent-circle",
          "code": "() => (\n  <AvatarPair>\n    <Avatar src=\"https://avatars.githubusercontent.com/u/92997159?v=4\" />\n    <Avatar square src=\"https://avatars.githubusercontent.com/primer\" />\n  </AvatarPair>\n)"
        },
        {
          "id": "components-avatarpair-features--parent-square",
          "code": "() => (\n  <AvatarPair>\n    <Avatar square src=\"https://avatars.githubusercontent.com/primer\" />\n    <Avatar src=\"https://avatars.githubusercontent.com/u/92997159?v=4\" />\n  </AvatarPair>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "Avatar[]",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "avatar_stack": {
      "id": "avatar_stack",
      "name": "AvatarStack",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-avatarstack--default",
          "code": "() => (\n  <AvatarStack>\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/primer\"\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/desktop\"\n    />\n  </AvatarStack>\n)"
        },
        {
          "id": "components-avatarstack-features--align-left",
          "code": "() => (\n  <AvatarStack>\n    <Avatar\n      alt=\"Primer logo\"\n      src=\"https://avatars.githubusercontent.com/primer\"\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/desktop\"\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/primer\"\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/desktop\"\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/primer\"\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/desktop\"\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/primer\"\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/desktop\"\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/primer\"\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/desktop\"\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/primer\"\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/desktop\"\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/primer\"\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/desktop\"\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/primer\"\n    />\n  </AvatarStack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "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": "size",
          "type": "number | { narrow?: number; regular?: number; wide?: number; }",
          "defaultValue": "20",
          "description": "The size of the avatar children in pixels."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "banner": {
      "id": "banner",
      "name": "Banner",
      "status": "alpha",
      "a11yReviewed": false,
      "importPath": "@primer/react/experimental",
      "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 underline 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 underline 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 underline 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 underline 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 underline 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 underline 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 underline 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 underline 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 underline 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 underline 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--with-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline underline 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}"
        }
      ],
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "Provide an optional label to override the default name for the Banner landmark region"
        },
        {
          "name": "description",
          "type": "React.ReactNode",
          "description": "Provide an optional description for the Banner. This should provide supplemental information about the Banner"
        },
        {
          "name": "icon",
          "type": "React.ReactNode",
          "description": "Provide an icon for the banner"
        },
        {
          "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": ""
        }
      ],
      "subcomponents": [
        {
          "name": "Banner.Title",
          "props": [
            {
              "name": "as",
              "type": "'h2' | 'h3' | 'h4' | 'h5' | 'h6'"
            }
          ]
        },
        {
          "name": "Banner.Description",
          "props": []
        },
        {
          "name": "Banner.PrimaryAction",
          "props": []
        },
        {
          "name": "Banner.SecondaryAction",
          "props": []
        }
      ]
    },
    "blankslate": {
      "id": "blankslate",
      "name": "Blankslate",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "drafts-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": "drafts-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": "drafts-components-blankslate-features--with-primary-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.PrimaryAction href=\"#\">Primary action</Blankslate.PrimaryAction>\n  </Blankslate>\n)"
        },
        {
          "id": "drafts-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": "drafts-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": "drafts-components-blankslate-features--narrow",
          "code": "() => (\n  <Blankslate 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": "drafts-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": ""
        },
        {
          "name": "narrow",
          "type": "boolean",
          "description": ""
        },
        {
          "name": "spacious",
          "type": "boolean",
          "description": ""
        }
      ],
      "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"
            }
          ]
        },
        {
          "name": "Blankslate.SecondaryAction",
          "props": [
            {
              "name": "href",
              "type": "string"
            }
          ]
        }
      ]
    },
    "box": {
      "id": "box",
      "name": "Box",
      "status": "beta",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-box--default",
          "code": "() => <Box>Default Box</Box>"
        },
        {
          "id": "components-box-features--border",
          "code": "() => (\n  <Box\n    sx={{\n      borderWidth: 1,\n      borderStyle: 'solid',\n      borderColor: 'border.default',\n      p: 3,\n    }}\n  >\n    Box with border\n  </Box>\n)"
        },
        {
          "id": "components-box-features--border-bottom",
          "code": "() => (\n  <Box\n    sx={{\n      borderBottomWidth: 1,\n      borderBottomStyle: 'solid',\n      borderColor: 'border.default',\n      p: 3,\n    }}\n  >\n    Box with bottom border\n  </Box>\n)"
        },
        {
          "id": "components-box-features--flexbox",
          "code": "() => (\n  <Box\n    sx={{\n      display: 'flex',\n    }}\n  >\n    <Box\n      sx={{\n        p: 3,\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderColor: 'border.default',\n      }}\n    >\n      1\n    </Box>\n    <Box\n      sx={{\n        flexGrow: 1,\n        p: 3,\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderColor: 'border.default',\n      }}\n    >\n      2\n    </Box>\n    <Box\n      sx={{\n        p: 3,\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderColor: 'border.default',\n      }}\n    >\n      3\n    </Box>\n  </Box>\n)"
        },
        {
          "id": "components-box-features--grid",
          "code": "() => (\n  <Box\n    sx={{\n      display: 'grid',\n      gridTemplateColumns: '1fr 1fr',\n      gap: 3,\n    }}\n  >\n    <Box\n      sx={{\n        p: 3,\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderColor: 'border.default',\n      }}\n    >\n      1\n    </Box>\n    <Box\n      sx={{\n        p: 3,\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderColor: 'border.default',\n      }}\n    >\n      2\n    </Box>\n    <Box\n      sx={{\n        p: 3,\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderColor: 'border.default',\n      }}\n    >\n      3\n    </Box>\n  </Box>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"div\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "branch_name": {
      "id": "branch_name",
      "name": "BranchName",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-branchname--default",
          "code": "() => (\n  <Stack align=\"start\">\n    <BranchName href=\"#\">branch_name</BranchName>\n    <BranchName as=\"span\">branch_name as span</BranchName>\n  </Stack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "ref",
          "type": "React.RefObject<HTMLAnchorElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"a\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "breadcrumbs": {
      "id": "breadcrumbs",
      "name": "Breadcrumbs",
      "status": "alpha",
      "a11yReviewed": false,
      "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": "children",
          "type": "Breadcrumbs.Item[]",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Breadcrumbs.Item",
          "props": [
            {
              "name": "selected",
              "type": "boolean",
              "defaultValue": "false",
              "description": ""
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLAnchorElement>"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes"
          }
        }
      ]
    },
    "button": {
      "id": "button",
      "name": "Button",
      "status": "alpha",
      "a11yReviewed": false,
      "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--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-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      <div\n        style={{\n          display: 'flex',\n          flexDirection: 'row',\n          gap: '1rem',\n        }}\n      >\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      </div>\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      flexDirection: 'row',\n      gap: '1rem',\n    }}\n  >\n    <Button inactive>Default</Button>\n    <Button variant=\"primary\" inactive>\n      Primary\n    </Button>\n    <Button variant=\"danger\" inactive>\n      Danger\n    </Button>\n    <Button variant=\"invisible\" inactive>\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>"
        }
      ],
      "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": "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 | string",
          "description": "For counter buttons, the number to display."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "description": "Items that are disabled can not be clicked, selected, or navigated through."
        },
        {
          "name": "inactive",
          "type": "boolean",
          "description": "Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button.\n This is intended to be used when a system error such as an outage prevents the button from performing its usual action.\n Inactive 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.\n If 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": "ref",
          "type": "React.RefObject<HTMLButtonElement>"
        },
        {
          "name": "size",
          "type": "'small'\n| 'medium'\n| 'large'",
          "defaultValue": "'medium'"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        },
        {
          "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": "variant",
          "type": "'default'\n| 'primary'\n| 'danger'\n| 'invisible'",
          "defaultValue": "'default'",
          "description": "Change the visual style of the button."
        }
      ],
      "passthrough": {
        "element": "button",
        "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attributes"
      }
    },
    "icon_button": {
      "id": "icon_button",
      "name": "IconButton",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-iconbutton--default",
          "code": "() => (\n  <IconButton\n    icon={HeartIcon}\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--primary",
          "code": "() => (\n  <IconButton\n    icon={HeartIcon}\n    variant=\"primary\"\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--danger",
          "code": "() => (\n  <IconButton\n    icon={HeartIcon}\n    variant=\"danger\"\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--invisible",
          "code": "() => (\n  <IconButton\n    icon={HeartIcon}\n    variant=\"invisible\"\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--disabled",
          "code": "() => (\n  <IconButton\n    disabled\n    icon={HeartIcon}\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--small",
          "code": "() => (\n  <IconButton\n    size=\"small\"\n    icon={HeartIcon}\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--medium",
          "code": "() => (\n  <IconButton\n    size=\"medium\"\n    icon={HeartIcon}\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--large",
          "code": "() => (\n  <IconButton\n    size=\"large\"\n    icon={HeartIcon}\n    aria-label=\"Favorite\"\n    unsafeDisableTooltip={false}\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--with-description",
          "code": "() => (\n  <IconButton\n    icon={InboxIcon}\n    aria-label=\"Notifications\"\n    description=\"You have no unread notifications.\"\n    unsafeDisableTooltip={false}\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--external-tooltip-version1",
          "code": "() => (\n  <TooltipV1\n    text=\"this is a supportive description for icon button\"\n    direction=\"se\"\n  >\n    <IconButton icon={HeartIcon} aria-label=\"HeartIcon\" />\n  </TooltipV1>\n)"
        },
        {
          "id": "components-iconbutton-features--as-a-menu-anchor",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Anchor>\n      <IconButton\n        icon={ChevronDownIcon}\n        aria-label=\"Something\"\n        unsafeDisableTooltip={false}\n      />\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)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "defaultValue": "",
          "required": true,
          "description": "This will be the Button description."
        },
        {
          "name": "variant",
          "type": "'default' | 'primary' | 'danger' | 'outline' | 'invisible'",
          "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": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "button_group": {
      "id": "button_group",
      "name": "ButtonGroup",
      "status": "alpha",
      "a11yReviewed": false,
      "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    <IconButton icon={PlusIcon} aria-label=\"Add\" />\n    <IconButton icon={DashIcon} aria-label=\"Subtract\" />\n  </ButtonGroup>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        }
      ],
      "subcomponents": []
    },
    "checkbox": {
      "id": "checkbox",
      "name": "Checkbox",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-checkbox--default",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <Checkbox value=\"default\" />\n      <FormControl.Label>Default label</FormControl.Label>\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-checkbox-features--with-leading-visual",
          "code": "() => {\n  return (\n    <Box as=\"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    </Box>\n  )\n}"
        },
        {
          "id": "components-checkbox-features--disabled",
          "code": "() => {\n  return (\n    <Box as=\"form\">\n      <FormControl disabled>\n        <Checkbox value=\"default\" />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-checkbox-features--with-caption",
          "code": "() => {\n  return (\n    <Box as=\"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    </Box>\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.<br /> Individual checkboxes do not have validation styles."
        },
        {
          "name": "value",
          "type": "string",
          "defaultValue": "",
          "description": "A unique value that is never shown to the user.<br /> Used during form submission and to identify which checkbox inputs are selected."
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLInputElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"input\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "checkbox_group": {
      "id": "checkbox_group",
      "name": "CheckboxGroup",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-checkboxgroup--default",
          "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>\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    <Box\n      id=\"choiceHeading\"\n      borderBottomWidth=\"1px\"\n      borderBottomStyle=\"solid\"\n      borderBottomColor=\"border.default\"\n      pb={2}\n      mb={3}\n      fontSize={3}\n    >\n      External label\n    </Box>\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": "<span> The unique identifier for this input group. Used to associate the label, validation text, and caption text. <br /> You may want a custom ID to make it easier to select elements in integration tests. </span>"
        },
        {
          "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"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "CheckboxGroup.Label",
          "props": [
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "defaultValue": "false",
              "description": "If true, the fieldset legend will be visually hidden"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "CheckboxGroup.Caption",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The caption content"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "circle_badge": {
      "id": "circle_badge",
      "name": "CircleBadge",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-circlebadge--default",
          "code": "() => (\n  <CircleBadge>\n    <CircleBadge.Icon icon={ZapIcon} />\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\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "CircleBadge.Icon",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "Octicon"
            }
          ],
          "passthrough": {
            "element": "Octicon",
            "url": "/Octicon"
          }
        }
      ]
    },
    "circle_octicon": {
      "id": "circle_octicon",
      "name": "CircleOcticon",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-circleocticon--default",
          "code": "() => (\n  <CircleOcticon\n    icon={CheckIcon}\n    size={32}\n    sx={{\n      backgroundColor: 'success.fg',\n      color: 'fg.onEmphasis',\n    }}\n  />\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "icon",
          "type": "Octicon"
        },
        {
          "name": "size",
          "defaultValue": "32",
          "type": "number",
          "description": "Set the width and height of the icon in pixels."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "counter_label": {
      "id": "counter_label",
      "name": "CounterLabel",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-counterlabel--default",
          "code": "() => <CounterLabel>12</CounterLabel>"
        },
        {
          "id": "components-counterlabel-features--primary-theme",
          "code": "() => <CounterLabel scheme=\"primary\">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"
        }
      ],
      "subcomponents": []
    },
    "data_table": {
      "id": "data_table",
      "name": "DataTable",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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": "drafts-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"
        }
      ],
      "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.Body",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Row",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Header",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Cell",
          "props": [
            {
              "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.Container",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Title",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "id",
              "type": "string",
              "required": true
            }
          ]
        },
        {
          "name": "Table.Subtitle",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "id",
              "type": "string",
              "required": true
            }
          ]
        },
        {
          "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"
            },
            {
              "name": "columns",
              "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"
            }
          ]
        },
        {
          "name": "Table.Pagination",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "required": true
            },
            {
              "name": "defaultPageIndex",
              "type": "string"
            },
            {
              "name": "id",
              "type": "string"
            },
            {
              "name": "onChange",
              "type": "({ pageIndex }: { pageIndex: number }) => void"
            },
            {
              "name": "pageSize",
              "type": "number"
            },
            {
              "name": "totalCount",
              "type": "number",
              "required": true
            }
          ]
        },
        {
          "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": "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` \n Alternatively, 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 - '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": {
      "id": "details",
      "name": "Details",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-details--default",
          "code": "() => {\n  const { getDetailsProps } = useDetails({\n    closeOnOutsideClick: true,\n  })\n  return (\n    <Details {...getDetailsProps()}>\n      <Button as=\"summary\">See Details</Button>\n      This is some content\n    </Details>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "dialog_v2": {
      "id": "dialog_v2",
      "docsId": "dialog",
      "name": "Dialog",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "drafts-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              autoFocus: true,\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": "drafts-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": "drafts-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(10).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              autoFocus: true,\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": "drafts-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 renderFooterConditionally = () => {\n    if (step === 1) return null\n    return (\n      <Dialog.Footer>\n        <Button variant=\"primary\">Submit</Button>\n      </Dialog.Footer>\n    )\n  }\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        >\n          {step === 1 ? (\n            <Box\n              sx={{\n                display: 'flex',\n                flexDirection: 'column',\n                gap: 4,\n              }}\n            >\n              <Box\n                sx={{\n                  display: 'flex',\n                  justifyContent: 'space-between',\n                }}\n              >\n                Bug Report <Button onClick={() => setStep(2)}>Choose</Button>\n              </Box>\n              <Box\n                sx={{\n                  display: 'flex',\n                  justifyContent: 'space-between',\n                }}\n              >\n                Feature request{' '}\n                <Button onClick={() => setStep(2)}>Choose</Button>\n              </Box>\n            </Box>\n          ) : (\n            <p>\n              <Box\n                sx={{\n                  display: 'flex',\n                  flexDirection: 'column',\n                  gap: 1,\n                }}\n              >\n                <label htmlFor=\"description\">Description</label>\n                <TextInput\n                  id=\"description\"\n                  placeholder=\"Write the description here\"\n                />\n              </Box>\n            </p>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "drafts-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": "drafts-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": "drafts-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": "drafts-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}"
        }
      ],
      "importPath": "@primer/react/experimental",
      "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."
        },
        {
          "name": "width",
          "type": "'small' | 'medium' | 'large' | 'xlarge'"
        },
        {
          "name": "height",
          "type": "'small' | 'large' | 'auto'"
        },
        {
          "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"
        }
      ],
      "subcomponents": []
    },
    "flash": {
      "id": "flash",
      "name": "Flash",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-flash--default",
          "code": "() => <Flash>Default</Flash>"
        },
        {
          "id": "components-flash-features--success",
          "code": "() => <Flash variant=\"success\">Success</Flash>"
        },
        {
          "id": "components-flash-features--danger",
          "code": "() => <Flash variant=\"danger\">Danger</Flash>"
        },
        {
          "id": "components-flash-features--warning",
          "code": "() => <Flash variant=\"warning\">Warning</Flash>"
        },
        {
          "id": "components-flash-features--full",
          "code": "() => <Flash full>Full</Flash>"
        },
        {
          "id": "components-flash-features--with-icon-and-action",
          "code": "() => (\n  <Flash\n    sx={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateRows: 'min-content',\n      gridTemplateAreas: `'visual message actions'`,\n      '@media screen and (max-width: 543.98px)': {\n        gridTemplateColumns: 'min-content 1fr',\n        gridTemplateRows: 'min-content min-content',\n        gridTemplateAreas: `\n        'visual message'\n        '.      actions'\n      `,\n      },\n    }}\n  >\n    <Box\n      sx={{\n        display: 'grid',\n        paddingBlock: 'var(--base-size-8)',\n        alignSelf: 'start',\n        gridArea: 'visual',\n      }}\n    >\n      <Octicon icon={InfoIcon} />\n    </Box>\n    <Box\n      sx={{\n        fontSize: 1,\n        lineHeight: '1.5',\n        padding: '0.375rem var(--base-size-8)',\n        alignSelf: 'center',\n        gridArea: 'message',\n      }}\n    >\n      This is a flash message with an icon and an action.\n      <Link href=\"/\"> Learn more.</Link>\n    </Box>\n    <Box\n      sx={{\n        gridArea: 'actions',\n        '@media screen and (max-width: 543.98px)': {\n          alignSelf: 'start',\n          margin: 'var(--base-size-8) 0 0 var(--base-size-8)',\n        },\n      }}\n    >\n      <Button>Join waitlist</Button>\n    </Box>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--with-icon-action-dismiss",
          "code": "() => (\n  <Flash\n    sx={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateRows: 'min-content',\n      gridTemplateAreas: `'visual message actions close'`,\n      '@media screen and (max-width: 543.98px)': {\n        gridTemplateColumns: 'min-content 1fr',\n        gridTemplateRows: 'min-content min-content',\n        gridTemplateAreas: `\n        'visual message close'\n        '.      actions actions'\n      `,\n      },\n    }}\n  >\n    <Box\n      sx={{\n        display: 'grid',\n        paddingBlock: 'var(--base-size-8)',\n        alignSelf: 'start',\n        gridArea: 'visual',\n      }}\n    >\n      <Octicon icon={InfoIcon} />\n    </Box>\n    <Box\n      sx={{\n        fontSize: 1,\n        lineHeight: '1.5',\n        padding: '0.375rem var(--base-size-8)',\n        alignSelf: 'center',\n        gridArea: 'message',\n      }}\n    >\n      This is a flash message with an icon and an action.\n      <Link href=\"/\"> Learn more.</Link>\n    </Box>\n    <Box\n      sx={{\n        gridArea: 'actions',\n        '@media screen and (max-width: 543.98px)': {\n          alignSelf: 'start',\n          margin: 'var(--base-size-8) 0 0 var(--base-size-8)',\n        },\n      }}\n    >\n      <Button>Join waitlist</Button>\n    </Box>\n    <Box\n      sx={{\n        gridArea: 'close',\n        marginLeft: 'var(--controlStack-medium-gap-condensed)',\n      }}\n    >\n      <IconButton\n        variant=\"invisible\"\n        icon={XIcon}\n        aria-label=\"Dismiss\"\n        sx={{\n          svg: {\n            margin: '0',\n            color: 'fg.muted',\n          },\n        }}\n      />\n    </Box>\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\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "form_control": {
      "id": "form_control",
      "name": "FormControl",
      "status": "alpha",
      "a11yReviewed": false,
      "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    <Box display=\"grid\">\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>Autocomplete</FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input block />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              aria-labelledby=\"form-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    </Box>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--form-control-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      setValidationResult('noSpaces')\n    } else if (value) {\n      setValidationResult('validName')\n    }\n  }, [value])\n  return (\n    <Box display=\"grid\">\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-caption custom-input-validation\"\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 id=\"custom-checkbox-one\" value=\"checkOne\" />\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 id=\"custom-checkbox-two\" value=\"checkTwo\" />\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    </Box>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--with-checkbox-and-radio-inputs",
          "code": "() => {\n  return (\n    <Box\n      display=\"grid\"\n      sx={{\n        gap: 3,\n      }}\n    >\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    </Box>\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      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-leading-visual",
          "code": "() => (\n  <Box>\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  </Box>\n)"
        },
        {
          "id": "components-formcontrol-features--disabled-inputs",
          "code": "() => (\n  <Box\n    sx={{\n      display: 'flex',\n      flexDirection: 'column',\n      gap: '1rem',\n    }}\n  >\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  </Box>\n)"
        },
        {
          "id": "components-formcontrol-features--custom-required",
          "code": "() => (\n  <Box\n    sx={{\n      display: 'flex',\n      flexDirection: 'column',\n      gap: '1rem',\n    }}\n  >\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\n      sx={{\n        fontSize: 1,\n      }}\n    >\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  </Box>\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": "sx",
          "type": "SystemStyleObject"
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "FormControl.Caption",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The content (usually just text) that is rendered to give contextual info about the field"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "FormControl.LeadingVisual",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The visual to render before the choice input's label"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "header": {
      "id": "header",
      "name": "Header",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-header--default",
          "code": "() => (\n  <Header>\n    <Header.Item>\n      <Header.Link\n        href=\"#\"\n        sx={{\n          fontSize: 2,\n        }}\n      >\n        <Octicon\n          icon={MarkGithubIcon}\n          size={32}\n          sx={{\n            mr: 2,\n          }}\n        />\n        <span>GitHub</span>\n      </Header.Link>\n    </Header.Item>\n    <Header.Item full>Menu</Header.Item>\n    <Header.Item\n      sx={{\n        mr: 0,\n      }}\n    >\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\n      sx={{\n        mr: 0,\n      }}\n    >\n      Item 3\n    </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)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Header.Item",
          "props": [
            {
              "name": "full",
              "type": "string",
              "defaultValue": "",
              "description": "Stretches item to fill the available space"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "Header.Link",
          "props": [
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "description": "URL to be used for the Link"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attributes"
          }
        }
      ]
    },
    "heading": {
      "id": "heading",
      "name": "Heading",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-heading--default",
          "code": "() => <Heading>Default H2 Heading</Heading>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"h2\""
        }
      ]
    },
    "drafts_hidden": {
      "id": "drafts_hidden",
      "name": "Hidden",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "drafts-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": "drafts-components-hidden-features--hide-content",
          "code": "() => (\n  <Box>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-hidden-features--render-content-responsively",
          "code": "() => (\n  <Box>\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  </Box>\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": {
      "id": "inline_message",
      "name": "InlineMessage",
      "status": "alpha",
      "a11yReviewed": false,
      "importPath": "@primer/react/experimental",
      "stories": [
        {
          "id": "components-inlinemessage--default",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"unavailable\">\n      An example inline message\n    </InlineMessage>\n  )\n}"
        },
        {
          "id": "drafts-components-inlinemessage-features--critical",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"critical\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "drafts-components-inlinemessage-features--success",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"success\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "drafts-components-inlinemessage-features--unavailable",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"unavailable\">\n      An example inline message\n    </InlineMessage>\n  )\n}"
        },
        {
          "id": "drafts-components-inlinemessage-features--warning",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"warning\">An example inline message</InlineMessage>\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
        }
      ]
    },
    "label": {
      "id": "label",
      "name": "Label",
      "status": "alpha",
      "a11yReviewed": false,
      "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": {
      "id": "label_group",
      "name": "LabelGroup",
      "status": "alpha",
      "a11yReviewed": false,
      "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"
        }
      ],
      "subcomponents": []
    },
    "link": {
      "id": "link",
      "name": "Link",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-link--default",
          "code": "() => <Link href=\"#\">Link</Link>"
        },
        {
          "id": "components-link-features--muted",
          "code": "() => (\n  <Link href=\"#\" muted>\n    Link\n  </Link>\n)"
        },
        {
          "id": "components-link-features--underline",
          "code": "() => (\n  <Link href=\"#\" underline>\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\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "nav_list": {
      "id": "nav_list",
      "name": "NavList",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [],
      "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\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "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": "ref",
              "type": "React.RefObject<HTMLAnchorElement>"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes"
          }
        },
        {
          "name": "NavList.LeadingVisual",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.TrailingVisual",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.SubNav",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.Group",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.Divider",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        }
      ]
    },
    "octicon": {
      "id": "octicon",
      "name": "Octicon",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-octicon--default",
          "code": "() => <Octicon icon={HeartFillIcon} size={32} />"
        }
      ],
      "importPath": "@primer/react",
      "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"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "overlay": {
      "id": "overlay",
      "name": "Overlay",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-overlay-features--dropdown-overlay",
          "code": "({ anchorSide }: OverlayProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  return (\n    <>\n      <Button\n        ref={buttonRef}\n        sx={{\n          position: 'relative',\n        }}\n        onClick={() => setIsOpen(!isOpen)}\n      >\n        open overlay\n      </Button>\n      {isOpen ? (\n        <Overlay\n          returnFocusRef={buttonRef}\n          height=\"auto\"\n          width=\"small\"\n          ignoreClickRefs={[buttonRef]}\n          onEscape={() => setIsOpen(false)}\n          onClickOutside={() => setIsOpen(false)}\n          anchorSide={anchorSide}\n        >\n          <ActionList>\n            <ActionList.Item>Copy link</ActionList.Item>\n            <ActionList.Item>Quote reply</ActionList.Item>\n            <ActionList.Item>Reference in new issue</ActionList.Item>\n            <ActionList.Item>Edit</ActionList.Item>\n            <ActionList.Divider />\n            <ActionList.Item variant=\"danger\">Delete</ActionList.Item>\n          </ActionList>\n        </Overlay>\n      ) : null}\n    </>\n  )\n}"
        },
        {
          "id": "components-overlay-features--dialog-overlay",
          "code": "({ anchorSide }: OverlayProps) => {\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  return (\n    <Box ref={anchorRef}>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        open overlay\n      </Button>\n      {isOpen ? (\n        <Overlay\n          initialFocusRef={confirmButtonRef}\n          returnFocusRef={buttonRef}\n          ignoreClickRefs={[buttonRef]}\n          onEscape={closeOverlay}\n          onClickOutside={closeOverlay}\n          width=\"small\"\n          anchorSide={anchorSide}\n        >\n          <Box display=\"flex\" flexDirection=\"column\" p={2}>\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          </Box>\n        </Overlay>\n      ) : null}\n    </Box>\n  )\n}"
        },
        {
          "id": "components-overlay-features--overlay-on-top-of-overlay",
          "code": "({ anchorSide }: OverlayProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [isSecondaryOpen, setIsSecondaryOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const secondaryButtonRef = useRef<HTMLButtonElement>(null)\n  const confirmButtonRef = useRef<HTMLButtonElement>(null)\n  const anchorRef = useRef<HTMLDivElement>(null)\n  const closeOverlay = () => setIsOpen(false) // intentionally not memoized\n  const closeSecondaryOverlay = useCallback(\n    () => setIsSecondaryOpen(false),\n    [setIsSecondaryOpen],\n  )\n  const items = ['🔵 Cyan', '🔴 Magenta', '🟡 Yellow']\n  const [selectedItem, setSelectedItem] = React.useState(items[0])\n  return (\n    <Box\n      position=\"absolute\"\n      top={0}\n      left={0}\n      bottom={0}\n      right={0}\n      ref={anchorRef}\n    >\n      <input placeholder=\"Input for focus testing\" />\n      <br />\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        open overlay\n      </Button>\n      {isOpen ? (\n        <Overlay\n          initialFocusRef={confirmButtonRef}\n          returnFocusRef={buttonRef}\n          onEscape={closeOverlay}\n          onClickOutside={closeOverlay}\n          width=\"small\"\n          anchorSide={anchorSide}\n        >\n          <Button\n            ref={secondaryButtonRef}\n            onClick={() => setIsSecondaryOpen(!isSecondaryOpen)}\n          >\n            open overlay\n          </Button>\n          {isSecondaryOpen ? (\n            <Overlay\n              initialFocusRef={confirmButtonRef}\n              returnFocusRef={secondaryButtonRef}\n              onEscape={closeSecondaryOverlay}\n              onClickOutside={closeSecondaryOverlay}\n              width=\"small\"\n              sx={{\n                top: '40px',\n              }}\n              anchorSide={anchorSide}\n            >\n              <Box display=\"flex\" flexDirection=\"column\" p={2}>\n                <Text>Select an option!</Text>\n                <ActionMenu>\n                  <ActionMenu.Button\n                    sx={{\n                      width: 200,\n                    }}\n                  >\n                    {selectedItem}\n                  </ActionMenu.Button>\n                  <ActionMenu.Overlay>\n                    <ActionList selectionVariant=\"single\">\n                      {items.map((item) => (\n                        <ActionList.Item\n                          key={item}\n                          selected={item === selectedItem}\n                          onSelect={() => setSelectedItem(item)}\n                        >\n                          {item}\n                        </ActionList.Item>\n                      ))}\n                    </ActionList>\n                  </ActionMenu.Overlay>\n                </ActionMenu>\n              </Box>\n            </Overlay>\n          ) : null}\n        </Overlay>\n      ) : null}\n    </Box>\n  )\n}"
        },
        {
          "id": "components-overlay-features--memex-nested-overlays",
          "code": "() => {\n  const [overlayOpen, setOverlayOpen] = React.useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const durations = ['days', 'weeks']\n  const [duration, setDuration] = React.useState(durations[0])\n  return (\n    <div>\n      <ButtonGroup>\n        <Button>Add iteration</Button>\n        <IconButton\n          aria-label=\"Add custom iteration\"\n          ref={buttonRef}\n          onClick={() => setOverlayOpen(!overlayOpen)}\n          icon={TriangleDownIcon}\n        />\n      </ButtonGroup>\n      {overlayOpen && (\n        <Overlay\n          width=\"medium\"\n          onEscape={() => setOverlayOpen(false)}\n          onClickOutside={() => setOverlayOpen(false)}\n          returnFocusRef={buttonRef}\n          ignoreClickRefs={[buttonRef]}\n          top={60}\n          left={16}\n        >\n          <Box\n            as=\"form\"\n            onSubmit={() => setOverlayOpen(false)}\n            sx={{\n              display: 'flex',\n              flexDirection: 'column',\n              py: 2,\n            }}\n          >\n            <Box\n              sx={{\n                paddingX: 3,\n                display: 'flex',\n                alignItems: 'center',\n                gap: 1,\n              }}\n            >\n              <Text\n                color=\"fg.muted\"\n                sx={{\n                  fontSize: 1,\n                }}\n              >\n                Duration:\n              </Text>\n              <TextInput defaultValue={2} />\n              <ActionMenu>\n                <ActionMenu.Button\n                  sx={{\n                    width: 200,\n                  }}\n                  aria-label=\"Change duration unit\"\n                >\n                  {duration}\n                </ActionMenu.Button>\n                <ActionMenu.Overlay>\n                  <ActionList selectionVariant=\"single\">\n                    {durations.map((item) => (\n                      <ActionList.Item\n                        key={item}\n                        selected={item === duration}\n                        onSelect={() => setDuration(item)}\n                      >\n                        {item}\n                      </ActionList.Item>\n                    ))}\n                  </ActionList>\n                </ActionMenu.Overlay>\n              </ActionMenu>\n            </Box>\n            <ActionList.Divider />\n            <Box\n              sx={{\n                display: 'flex',\n                justifyContent: 'flex-end',\n                px: 2,\n                gap: 1,\n              }}\n            >\n              <Button>Cancel</Button>\n              <Button variant=\"primary\">Add</Button>\n            </Box>\n          </Box>\n        </Overlay>\n      )}\n    </div>\n  )\n}"
        },
        {
          "id": "components-overlay-features--nested-overlays",
          "code": "() => {\n  const [listOverlayOpen, setListOverlayOpen] = React.useState(false)\n  const [createListOverlayOpen, setCreateListOverlayOpen] =\n    React.useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const secondaryButtonRef = useRef<HTMLButtonElement>(null)\n  React.useEffect(() => {\n    // eslint-disable-next-line no-console\n    const handler = (event: KeyboardEvent) =>\n      console.log('global handler:', event.key)\n    document.addEventListener('keydown', handler)\n    return () => document.removeEventListener('keydown', handler)\n  }, [])\n  return (\n    <div>\n      <TextInput placeholder=\"Input for focus testing\" />\n      <div>\n        primary overlay open: {String(listOverlayOpen)}, secondary overlay open:{' '}\n        {String(createListOverlayOpen)}\n      </div>\n      <ButtonGroup>\n        <Button>Star</Button>\n        <IconButton\n          aria-label=\"Add this repository to a list\"\n          ref={buttonRef}\n          onClick={() => setListOverlayOpen(!listOverlayOpen)}\n          icon={TriangleDownIcon}\n        />\n      </ButtonGroup>\n      {listOverlayOpen && (\n        <Overlay\n          width=\"medium\"\n          onEscape={() => setListOverlayOpen(false)}\n          onClickOutside={() => setListOverlayOpen(false)}\n          returnFocusRef={buttonRef}\n          ignoreClickRefs={[buttonRef]}\n          top={100}\n          left={16}\n        >\n          <Box\n            sx={{\n              display: 'flex',\n              flexDirection: 'column',\n              py: 2,\n            }}\n          >\n            <Box\n              sx={{\n                paddingX: 3,\n                paddingY: 2,\n              }}\n            >\n              <CheckboxGroup>\n                <CheckboxGroup.Label>Add to list</CheckboxGroup.Label>\n                <FormControl>\n                  <FormControl.Label>My stack</FormControl.Label>\n                  <FormControl.Caption id=\"custom-checkbox-one-caption\">\n                    Personal repositories\n                  </FormControl.Caption>\n                  <Checkbox value=\"my-stack\" />\n                </FormControl>\n                <FormControl>\n                  <FormControl.Label>Want to try</FormControl.Label>\n                  <FormControl.Caption id=\"custom-checkbox-one-caption\">\n                    Testing new libraries\n                  </FormControl.Caption>\n                  <Checkbox value=\"wanna-try\" />\n                </FormControl>\n              </CheckboxGroup>\n            </Box>\n            <ActionList.Divider />\n            <Tooltip text=\"Allows you to add more lists\">\n              <Button\n                variant=\"invisible\"\n                ref={secondaryButtonRef}\n                sx={{\n                  px: 2,\n                  mx: 2,\n                  display: 'flex',\n                }}\n                leadingVisual={PlusIcon}\n                onClick={() => setCreateListOverlayOpen(!createListOverlayOpen)}\n              >\n                Create list\n              </Button>\n            </Tooltip>\n          </Box>\n          {createListOverlayOpen && (\n            <Overlay\n              width=\"medium\"\n              onEscape={() => setCreateListOverlayOpen(false)}\n              onClickOutside={() => setCreateListOverlayOpen(false)}\n              returnFocusRef={secondaryButtonRef}\n              ignoreClickRefs={[secondaryButtonRef]}\n              top={120}\n              left={64}\n            >\n              <Box\n                as=\"form\"\n                sx={{\n                  display: 'flex',\n                  flexDirection: 'column',\n                  p: 3,\n                }}\n              >\n                <Text\n                  color=\"fg.muted\"\n                  sx={{\n                    fontSize: 1,\n                    mb: 3,\n                  }}\n                >\n                  Create a list to organize your starred repositories.\n                </Text>\n                <TextInput\n                  placeholder=\"Name this list\"\n                  sx={{\n                    mb: 2,\n                  }}\n                />\n                <TextInput\n                  as=\"textarea\"\n                  placeholder=\"Write a description\"\n                  rows={3}\n                  sx={{\n                    mb: 2,\n                    textarea: {\n                      p: 2,\n                    },\n                  }}\n                />\n\n                <Button\n                  variant=\"primary\"\n                  onClick={() =>\n                    setCreateListOverlayOpen(!createListOverlayOpen)\n                  }\n                >\n                  Create\n                </Button>\n              </Box>\n            </Overlay>\n          )}\n        </Overlay>\n      )}\n    </div>\n  )\n}"
        },
        {
          "id": "components-overlay-features--memex-issue-overlay",
          "code": "() => {\n  const [overlayOpen, setOverlayOpen] = React.useState(false)\n  const linkRef = useRef<HTMLAnchorElement>(null)\n  const inputRef = useRef<HTMLInputElement>(null)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const [title, setTitle] = React.useState('Implement draft issue editor')\n  const [editing, setEditing] = React.useState(false)\n  React.useEffect(() => {\n    // If we just started editing, focus the newly rendered input\n    if (editing) inputRef.current?.focus()\n  }, [editing])\n  return (\n    <>\n      <Link\n        href=\"#\"\n        muted\n        ref={linkRef}\n        onClick={(event) => {\n          event.preventDefault()\n          setOverlayOpen(true)\n        }}\n        sx={{\n          display: 'block',\n          border: '1px solid',\n          borderColor: 'border.default',\n          p: 2,\n          ':hover': {\n            backgroundColor: 'canvas.subtle',\n          },\n        }}\n      >\n        <IssueDraftIcon /> {title}\n      </Link>\n      {overlayOpen && (\n        <Overlay\n          height=\"auto\"\n          width=\"large\"\n          onEscape={() => setOverlayOpen(false)}\n          onClickOutside={() => setOverlayOpen(false)}\n          returnFocusRef={linkRef}\n          top={0}\n          left=\"calc(100vw - 480px)\"\n        >\n          <Box\n            sx={{\n              p: 4,\n              height: '100vh',\n            }}\n          >\n            <Box\n              sx={{\n                display: 'flex',\n                alignItems: 'center',\n                gap: 1,\n                mb: 2,\n              }}\n            >\n              <Label size=\"large\">\n                <IssueDraftIcon /> Draft\n              </Label>\n              <Text\n                sx={{\n                  fontSize: 1,\n                }}\n              >\n                opened 2 days ago,\n              </Text>\n              <Text\n                sx={{\n                  fontSize: 1,\n                }}\n              >\n                showing {editing ? 'input' : 'button'}\n              </Text>\n            </Box>\n            {editing ? (\n              <TextInput\n                defaultValue={title}\n                onBlur={(event: React.FocusEvent<HTMLInputElement>) => {\n                  setEditing(false)\n                  setTitle(event.target.value)\n                }}\n                onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {\n                  if (event.key === 'Enter') {\n                    setEditing(false)\n                    setTitle((event.target as HTMLInputElement).value)\n                  } else if (event.key === 'Escape') {\n                    setEditing(false)\n                    setTitle(title)\n                    event.preventDefault() // prevent Overlay from closing, this is what we recommend\n                    // event.stopPropagation() // this also works and feels nicer to use\n                  }\n                }}\n                ref={inputRef}\n                sx={{\n                  width: '100%',\n                  py: '2px',\n                  px: '7px',\n                  textAlign: 'left',\n                  color: 'fg.default',\n                  input: {\n                    fontWeight: 'bold',\n                    fontSize: 4,\n                    px: 0,\n                  },\n                }}\n              />\n            ) : (\n              <Button\n                variant=\"invisible\"\n                ref={buttonRef}\n                onClick={() => setEditing(true)}\n                aria-label=\"Change issue title\"\n                sx={{\n                  width: '100%',\n                  fontSize: 4,\n                  color: 'fg.default',\n                  p: 2,\n                  textAlign: 'left',\n                  borderRadius: '2',\n                }}\n              >\n                {title}\n              </Button>\n            )}\n          </Box>\n        </Overlay>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-overlay-features--positioned-overlays",
          "code": "({ right }: { right?: boolean }) => {\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  return (\n    <Box 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        sx={{\n          mt: 2,\n        }}\n      >\n        Open right overlay\n      </Button>\n      {isOpen ? (\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          >\n            <Box\n              sx={{\n                height: '100vh',\n                width: '500px',\n                display: 'flex',\n                justifyContent: 'center',\n                alignItems: 'center',\n              }}\n            >\n              <Text>Look! left aligned</Text>\n            </Box>\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          >\n            <Box\n              sx={{\n                height: '100vh',\n                width: '500px',\n                display: 'flex',\n                justifyContent: 'center',\n                alignItems: 'center',\n              }}\n            >\n              <Text>Look! right aligned</Text>\n            </Box>\n          </Overlay>\n        )\n      ) : null}\n    </Box>\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": "",
          "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": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "drafts_page_header": {
      "id": "drafts_page_header",
      "name": "PageHeader",
      "status": "draft",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "drafts-components-pageheader--default",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--has-title-only",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--has-large-title",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\n      <PageHeader.TitleArea variant=\"large\">\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-leading-and-trailing-visuals",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-leading-visual-hidden-on-regular-viewport",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-actions",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-description-slot",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\n      <PageHeader.TitleArea>\n        <PageHeader.Title>add-pageheader-docs</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Description>\n        <Text\n          sx={{\n            fontSize: 1,\n            color: 'fg.muted',\n          }}\n        >\n          <Link\n            href=\"https://github.com/broccolinisoup\"\n            sx={{\n              fontWeight: 'bold',\n            }}\n          >\n            broccolinisoup\n          </Link>{' '}\n          created this branch 5 days ago · 14 commits · updated today\n        </Text>\n      </PageHeader.Description>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-navigation-slot",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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={CommitIcon}>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-custom-navigation",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Pull request title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Navigation as=\"nav\" aria-label=\"Item list\">\n        <Box\n          as=\"ul\"\n          sx={{\n            display: 'flex',\n            gap: '8px',\n            listStyle: 'none',\n            paddingY: 0,\n            paddingX: 3,\n          }}\n          role=\"list\"\n        >\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        </Box>\n      </PageHeader.Navigation>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-leading-and-trailing-actions",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-parent-link-and-actions-of-context-area",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-context-bar-and-actions-of-context-area",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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  </Box>\n)"
        },
        {
          "id": "drafts-components-pageheader-features--with-actions-that-have-responsive-content",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader>\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  </Box>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "aria-label",
          "type": "string | undefined",
          "defaultValue": "",
          "description": "A unique label for the rendered main 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."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"div\""
        }
      ],
      "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "PageHeader.ParentLink",
          "props": [
            {
              "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            },
            {
              "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "page_layout": {
      "id": "page_layout",
      "name": "PageLayout",
      "status": "alpha",
      "a11yReviewed": true,
      "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    sx={args.sx}\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      <Box\n        sx={{\n          display: 'flex',\n          flexDirection: 'column',\n          gap: 3,\n        }}\n      >\n        <Box>\n          <Heading\n            as=\"h1\"\n            sx={{\n              fontWeight: 'normal',\n            }}\n          >\n            Input validation styles{' '}\n            <Text\n              sx={{\n                color: 'fg.muted',\n                fontWeight: 'light',\n              }}\n            >\n              #1831\n            </Text>\n          </Heading>\n          <Box\n            sx={{\n              display: 'flex',\n              gap: 2,\n              alignItems: 'center',\n            }}\n          >\n            <StateLabel status=\"pullOpened\">Open</StateLabel>\n            <Text\n              sx={{\n                fontSize: 1,\n                color: 'fg.muted',\n              }}\n            >\n              <Link\n                href=\"#\"\n                muted\n                sx={{\n                  fontWeight: 'bold',\n                }}\n              >\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          </Box>\n        </Box>\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      </Box>\n    </PageLayout.Header>\n    <PageLayout.Content>\n      <Box\n        sx={{\n          border: '1px solid',\n          borderRadius: 2,\n          borderColor: 'border.default',\n          height: 200,\n        }}\n      ></Box>\n      <Box\n        sx={{\n          maxWidth: '100%',\n          overflowX: 'auto',\n          border: '1px solid',\n          whiteSpace: 'nowrap',\n          borderColor: 'border.default',\n          mt: 3,\n          p: 3,\n          borderRadius: 2,\n        }}\n        tabIndex={0}\n      >\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      </Box>\n    </PageLayout.Content>\n    <PageLayout.Pane>\n      <Box\n        sx={{\n          display: 'flex',\n          flexDirection: 'column',\n          gap: 3,\n        }}\n      >\n        <Box>\n          <Text\n            sx={{\n              fontSize: 0,\n              fontWeight: 'bold',\n              display: 'block',\n              color: 'fg.muted',\n            }}\n          >\n            Assignees\n          </Text>\n          <Text\n            sx={{\n              fontSize: 0,\n              color: 'fg.muted',\n              lineHeight: 'condensed',\n            }}\n          >\n            No one –{' '}\n            <Link href=\"#\" muted>\n              assign yourself\n            </Link>\n          </Text>\n        </Box>\n        <Box\n          role=\"separator\"\n          sx={{\n            width: '100%',\n            height: 1,\n            backgroundColor: 'border.default',\n          }}\n        ></Box>\n        <Box>\n          <Text\n            sx={{\n              fontSize: 0,\n              fontWeight: 'bold',\n              display: 'block',\n              color: 'fg.muted',\n            }}\n          >\n            Labels\n          </Text>\n          <Text\n            sx={{\n              fontSize: 0,\n              color: 'fg.muted',\n              lineHeight: 'condensed',\n            }}\n          >\n            None yet\n          </Text>\n        </Box>\n      </Box>\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      <Box\n        sx={{\n          display: 'grid',\n          gap: 3,\n        }}\n      >\n        {Array.from({\n          length: args.numParagraphsInContent,\n        }).map((_, i) => {\n          const testId = `content${i}`\n          return (\n            <Box\n              key={i}\n              as=\"p\"\n              sx={{\n                margin: 0,\n              }}\n            >\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            </Box>\n          )\n        })}\n      </Box>\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      <Box\n        sx={{\n          display: 'grid',\n          gap: 3,\n        }}\n      >\n        {Array.from({\n          length: args.numParagraphsInPane,\n        }).map((_, i) => {\n          const testId = `paragraph${i}`\n          return (\n            <Box\n              key={i}\n              as=\"p\"\n              sx={{\n                margin: 0,\n              }}\n            >\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            </Box>\n          )\n        })}\n        <Box as=\"p\">\n          Donec sit amet massa purus. <a href=\"#foo\">Plura de lorem Ispum.</a>\n        </Box>\n      </Box>\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  <Box\n    sx={{\n      display: 'grid',\n      gridTemplateRows: 'auto 1fr auto',\n      height: '100vh',\n    }}\n  >\n    <Placeholder label=\"Above scroll container\" height={120} />\n    <Box\n      sx={{\n        overflow: 'auto',\n      }}\n    >\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          <Box\n            sx={{\n              display: 'grid',\n              gap: 3,\n            }}\n          >\n            {Array.from({\n              length: args.numParagraphsInContent,\n            }).map((_, i) => (\n              <Box\n                key={i}\n                as=\"p\"\n                sx={{\n                  margin: 0,\n                }}\n              >\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              </Box>\n            ))}\n          </Box>\n        </PageLayout.Content>\n        <PageLayout.Pane\n          position=\"start\"\n          padding=\"normal\"\n          divider=\"line\"\n          sticky\n          aria-label=\"Side pane\"\n        >\n          <Box\n            sx={{\n              display: 'grid',\n              gap: 3,\n            }}\n          >\n            {Array.from({\n              length: args.numParagraphsInPane,\n            }).map((_, i) => (\n              <Box\n                key={i}\n                as=\"p\"\n                sx={{\n                  margin: 0,\n                }}\n              >\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              </Box>\n            ))}\n          </Box>\n        </PageLayout.Pane>\n        <PageLayout.Footer padding=\"normal\" divider=\"line\">\n          <Placeholder label=\"Footer\" height={64} />\n        </PageLayout.Footer>\n      </PageLayout>\n    </Box>\n    <Placeholder label=\"Below scroll container\" height={120} />\n  </Box>\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  <Box data-testid=\"story-window\">\n    <Box\n      as=\"header\"\n      data-testid=\"sticky-header\"\n      sx={{\n        position: 'sticky',\n        top: 0,\n        height: args.offsetHeader,\n        display: 'grid',\n        placeItems: 'center',\n        backgroundColor: 'canvas.subtle',\n        borderBottom: '1px solid',\n        borderColor: 'border.default',\n        zIndex: 100,\n      }}\n    >\n      Custom sticky header\n    </Box>\n    <PageLayout\n      rowGap=\"none\"\n      columnGap=\"none\"\n      padding=\"none\"\n      containerWidth=\"full\"\n    >\n      <PageLayout.Content padding=\"normal\" width=\"large\">\n        <Box\n          sx={{\n            display: 'grid',\n            gap: 3,\n          }}\n          data-testid=\"scrollContainer\"\n        >\n          {Array.from({\n            length: args.numParagraphsInContent,\n          }).map((_, i) => {\n            const testId = `content${i}`\n            return (\n              <Box\n                key={i}\n                as=\"p\"\n                sx={{\n                  margin: 0,\n                }}\n              >\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              </Box>\n            )\n          })}\n        </Box>\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        <Box\n          sx={{\n            display: 'grid',\n            gap: 3,\n          }}\n        >\n          {Array.from({\n            length: args.numParagraphsInPane,\n          }).map((_, i) => {\n            const testId = `paragraph${i}`\n            return (\n              <Box\n                key={i}\n                as=\"p\"\n                sx={{\n                  margin: 0,\n                }}\n              >\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              </Box>\n            )\n          })}\n        </Box>\n      </PageLayout.Pane>\n      <PageLayout.Footer padding=\"normal\" divider=\"line\">\n        <Placeholder label=\"Footer\" height={64} />\n      </PageLayout.Footer>\n    </PageLayout>\n  </Box>\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\">\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  <Box\n    sx={{\n      display: 'grid',\n      gridTemplateRows: 'auto 1fr auto',\n      height: '100vh',\n    }}\n  >\n    <Box\n      sx={{\n        overflow: 'auto',\n      }}\n    >\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          <Box\n            sx={{\n              overflow: 'auto',\n            }}\n          >\n            <PageLayout.Pane padding=\"normal\">\n              <Placeholder label=\"Inner scroll container\" height={800} />\n            </PageLayout.Pane>\n          </Box>\n        </PageLayout.Pane>\n        <PageLayout.Content padding=\"normal\" width=\"large\">\n          <Box\n            sx={{\n              display: 'grid',\n            }}\n          >\n            <Placeholder label=\"Page content\" height={1600} />\n          </Box>\n        </PageLayout.Content>\n      </PageLayout>\n      <Placeholder label=\"Beneath inner scroll container\" height={120} />\n    </Box>\n  </Box>\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    >\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\">\n      <Heading\n        as=\"h2\"\n        sx={{\n          fontSize: 3,\n        }}\n        id=\"pane-heading\"\n      >\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)"
        }
      ],
      "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": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "PageLayout.Content",
          "props": [
            {
              "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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."
            },
            {
              "name": "widthStorageKey",
              "type": "string",
              "defaultValue": "'paneWidth'",
              "description": "Provide a key used by localStorage to persist the size of the pane on the client."
            },
            {
              "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": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLDivElement>"
            }
          ]
        },
        {
          "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."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "pagehead": {
      "id": "pagehead",
      "name": "Pagehead",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-pagehead--default",
          "code": "() => <Pagehead>Pagehead</Pagehead>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "as",
          "type": "string",
          "defaultValue": "div",
          "description": "Sets the underlying HTML tag for the component"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "pagination": {
      "id": "pagination",
      "name": "Pagination",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-pagination--default",
          "code": "() => (\n  <Pagination\n    pageCount={15}\n    currentPage={2}\n    onPageChange={(e) => e.preventDefault()}\n    showPages={{\n      narrow: false,\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": "no-op",
          "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": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "pointer_box": {
      "id": "pointer_box",
      "name": "PointerBox",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-pointerbox--default",
          "code": "() => <PointerBox>Pointer box content</PointerBox>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "caret",
          "type": "| 'top' | 'top-left' | 'top-right' | 'right' | 'right-top' | 'right-bottom' | 'bottom' | 'bottom-left' | 'bottom-right' | 'left' | 'left-top' | 'left-bottom'",
          "defaultValue": "'bottom'",
          "description": "Sets the location of the caret. The format is [edge]-[position on edge]. For example, right-top will position the caret on the top of the right edge of the box. Use top"
        }
      ],
      "subcomponents": []
    },
    "popover": {
      "id": "popover",
      "name": "Popover",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-popover--default",
          "code": "() => (\n  <Popover relative open={true} caret=\"top\">\n    <Popover.Content\n      sx={{\n        marginTop: 2,\n      }}\n    >\n      <Heading\n        sx={{\n          fontSize: 2,\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. "
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Popover.Content",
          "props": [
            {
              "name": "as",
              "type": "string",
              "defaultValue": "div",
              "description": "Sets the underlying HTML tag for the component"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "portal": {
      "id": "portal",
      "name": "Portal",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-portal--default",
          "code": "() => (\n  <>\n    Root position\n    <Box bg=\"red.2\" p={3}>\n      Outer container\n      <Box bg=\"green.2\" p={3}>\n        Inner container\n        <Portal>\n          Portaled content rendered at <code>&lt;BaseStyles&gt;</code> root.\n        </Portal>\n      </Box>\n    </Box>\n  </>\n)"
        },
        {
          "id": "components-portal-features--custom-portal-root-by-id",
          "code": "() => (\n  <>\n    Root position\n    <Box bg=\"red.2\" p={3} id=\"__primerPortalRoot__\">\n      Outer container\n      <Box bg=\"green.2\" p={3}>\n        Inner container\n        <Portal>Portaled content rendered at the outer container.</Portal>\n      </Box>\n    </Box>\n  </>\n)"
        },
        {
          "id": "components-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      <Box bg=\"red.2\" p={3} ref={outerContainerRef}>\n        {mounted ? (\n          <>\n            Outer container\n            <Box bg=\"green.2\" p={3}>\n              Inner container\n              <Portal>Portaled content rendered at the outer container.</Portal>\n            </Box>\n          </>\n        ) : null}\n      </Box>\n    </>\n  )\n}"
        },
        {
          "id": "components-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      <Box bg=\"red.2\" p={3} ref={outerContainerRef}>\n        Outer container\n        <Box bg=\"green.2\" p={3} ref={innerContainerRef}>\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        </Box>\n      </Box>\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": {
      "id": "progress_bar",
      "name": "ProgressBar",
      "status": "alpha",
      "a11yReviewed": false,
      "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    sx={{\n      width: '100px',\n    }}\n    aria-label=\"Upload test.png\"\n  />\n)"
        },
        {
          "id": "components-progressbar-features--color",
          "code": "() => (\n  <ProgressBar progress=\"66\" bg=\"done.emphasis\" aria-label=\"Upload test.png\" />\n)"
        },
        {
          "id": "components-progressbar-features--multiple-items",
          "code": "() => (\n  <ProgressBar aria-valuenow={70} aria-label=\"Upload test.png\">\n    <ProgressBar.Item progress={33} />\n    <ProgressBar.Item\n      progress={23}\n      sx={{\n        backgroundColor: 'danger.emphasis',\n      }}\n    />\n    <ProgressBar.Item\n      progress={14}\n      sx={{\n        backgroundColor: 'severe.emphasis',\n      }}\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"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "radio": {
      "id": "radio",
      "name": "Radio",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-radio--default",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <Radio name=\"default-radio-name\" value=\"default\" />\n      <FormControl.Label>Label</FormControl.Label>\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-radio-features--with-leading-visual",
          "code": "() => {\n  return (\n    <Box as=\"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    </Box>\n  )\n}"
        },
        {
          "id": "components-radio-features--disabled",
          "code": "() => {\n  return (\n    <Box as=\"form\">\n      <FormControl disabled>\n        <Radio value=\"default\" name=\"default-radio-name\" />\n        <FormControl.Label>Default label</FormControl.Label>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-radio-features--with-caption",
          "code": "() => {\n  return (\n    <Box as=\"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    </Box>\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>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"input\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "radio_group": {
      "id": "radio_group",
      "name": "RadioGroup",
      "status": "alpha",
      "a11yReviewed": false,
      "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    <Box\n      id=\"choiceHeading\"\n      borderBottomWidth=\"1px\"\n      borderBottomStyle=\"solid\"\n      borderBottomColor=\"border.default\"\n      pb={2}\n      mb={3}\n      fontSize={3}\n    >\n      External label\n    </Box>\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": "<span> The unique identifier for this input group. Used to associate the label, validation text, and caption text. <br /> You may want a custom ID to make it easier to select elements in integration tests. </span>"
        },
        {
          "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"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "RadioGroup.Label",
          "props": [
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "defaultValue": "false",
              "description": "If true, the fieldset legend will be visually hidden"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "RadioGroup.Description",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The caption content"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "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"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "relative_time": {
      "id": "relative_time",
      "name": "RelativeTime",
      "status": "alpha",
      "a11yReviewed": false,
      "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 <RelativeTime {...rest} date={new Date(date)} format=\"micro\" />\n}"
        },
        {
          "id": "components-relativetime-features--recent-time",
          "code": "(args) => {\n  const { ...rest } = args\n  return <RelativeTime {...rest} date={new Date()} />\n}"
        },
        {
          "id": "components-relativetime-features--count-down-timer",
          "code": "(args) => {\n  const { ...rest } = args\n  return <RelativeTime {...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": "as",
          "type": "React.ElementType",
          "defaultValue": "\"relative-time\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "segmented_control": {
      "id": "segmented_control",
      "name": "SegmentedControl",
      "status": "alpha",
      "a11yReviewed": false,
      "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      leadingIcon={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingIcon={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingIcon={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      leadingIcon={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingIcon={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingIcon={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      leadingIcon={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingIcon={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingIcon={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      leadingIcon={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingIcon={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingIcon={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      leadingIcon={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingIcon={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingIcon={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      leadingIcon={EyeIcon}\n    >\n      Preview\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Raw'} leadingIcon={FileCodeIcon}>\n      Raw\n    </SegmentedControl.Button>\n    <SegmentedControl.Button aria-label={'Blame'} leadingIcon={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  <Box\n    display=\"flex\"\n    sx={(theme) => ({\n      flexDirection: 'column',\n      gap: theme.space[1],\n      [`@media screen and (min-width: ${theme.breakpoints[1]})`]: {\n        flexDirection: 'row',\n      },\n    })}\n  >\n    <Box flexGrow={1}>\n      <Text fontSize={2} fontWeight=\"bold\" id=\"scLabel-vert\" display=\"block\">\n        File view\n      </Text>\n      <Text color=\"fg.subtle\" fontSize={1} id=\"scCaption-vert\" display=\"block\">\n        Change the way the file is viewed\n      </Text>\n    </Box>\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  </Box>\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": "sx",
          "type": "SystemStyleObject"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        }
      ],
      "subcomponents": [
        {
          "name": "SegmentedControl.Button",
          "props": [
            {
              "name": "leadingIcon",
              "type": "Component",
              "defaultValue": "",
              "description": "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": "sx",
              "type": "SystemStyleObject"
            },
            {
              "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": "selected",
              "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": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>"
            }
          ]
        }
      ]
    },
    "select": {
      "id": "select",
      "name": "Select",
      "status": "alpha",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "components-select--default",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--with-option-groups",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--disabled",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--with-caption",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--visually-hidden-label",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label visuallyHidden>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  </Box>\n)"
        },
        {
          "id": "components-select-features--error",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--success",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--block",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--small",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--large",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-select-features--with-custom-styling",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select\n        sx={{\n          borderRadius: '12px',\n          border: '1px dashed #000000',\n        }}\n      >\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  </Box>\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. <br /> This 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": {
      "id": "select_panel",
      "docsId": "select_panel",
      "name": "SelectPanel",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-selectpanel--default",
          "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    <>\n      <h1>Multi Select Panel</h1>\n      <SelectPanel\n        title=\"Select labels\"\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children ?? 'Select Labels'}\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        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'xsmall',\n        }}\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--single-select-story",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput | undefined>(\n    items[0],\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    <>\n      <h1>Single Select Panel</h1>\n      <div>Please select a label that describe your issue:</div>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\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        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'xsmall',\n        }}\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--external-anchor-story",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput | undefined>(\n    items[0],\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  const buttonRef = useRef<HTMLButtonElement>(null)\n  return (\n    <>\n      <h1>Select Panel With External Anchor</h1>\n      <Button\n        trailingAction={TriangleDownIcon}\n        ref={buttonRef}\n        onClick={() => setOpen(!open)}\n      >\n        Custom: {selected?.text || 'Click Me'}\n      </Button>\n      <SelectPanel\n        renderAnchor={null}\n        anchorRef={buttonRef}\n        placeholderText=\"Filter Labels\"\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'xsmall',\n        }}\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-footer-story",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput | undefined>(\n    items[0],\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  const buttonRef = useRef<HTMLButtonElement>(null)\n  return (\n    <>\n      <h1>Select Panel With Footer</h1>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\n          </Button>\n        )}\n        anchorRef={buttonRef}\n        placeholderText=\"Filter Labels\"\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'medium',\n        }}\n        footer={\n          <Button size=\"small\" block>\n            Edit labels\n          </Button>\n        }\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--multi-select-with-footer-story",
          "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  const buttonRef = useRef<HTMLButtonElement>(null)\n  return (\n    <>\n      <h1>Multi Select Panel With Footer</h1>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\n          </Button>\n        )}\n        anchorRef={buttonRef}\n        placeholderText=\"Filter Labels\"\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'medium',\n        }}\n        footer={\n          <Button size=\"small\" block>\n            Edit labels\n          </Button>\n        }\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--select-panel-height-initial-with-overflowing-items-story",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput | undefined>(\n    items[0],\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    <>\n      <h1>Single Select Panel</h1>\n      <div>Please select a label that describe your issue:</div>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\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        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'initial',\n          maxHeight: 'xsmall',\n        }}\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--select-panel-height-initial-with-underflowing-items-story",
          "code": "() => {\n  const underflowingItems = [items[0], items[1]]\n  const [selected, setSelected] = React.useState<ItemInput | undefined>(\n    underflowingItems[0],\n  )\n  const [filter, setFilter] = React.useState('')\n  const filteredItems = underflowingItems.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <>\n      <h1>Single Select Panel</h1>\n      <div>Please select a label that describe your issue:</div>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\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        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'initial',\n          maxHeight: 'xsmall',\n        }}\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--select-panel-height-initial-with-underflowing-items-after-fetch",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput | undefined>(\n    items[0],\n  )\n  const [filter, setFilter] = React.useState('')\n  const [fetchedItems, setFetchedItems] = useState<typeof items>([])\n  const filteredItems = React.useMemo(\n    () =>\n      fetchedItems.filter((item) =>\n        item.text.toLowerCase().startsWith(filter.toLowerCase()),\n      ),\n    [fetchedItems, filter],\n  )\n  const [open, setOpen] = useState(false)\n  const [height, setHeight] = useState<OverlayProps['height']>('auto')\n  const onOpenChange = () => {\n    setOpen(!open)\n    setTimeout(() => {\n      setFetchedItems([items[0], items[1]])\n      setHeight('initial')\n    }, 1500)\n  }\n  return (\n    <>\n      <h1>Single Select Panel</h1>\n      <div>Please select a label that describe your issue:</div>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\n          </Button>\n        )}\n        placeholderText=\"Filter Labels\"\n        open={open}\n        onOpenChange={onOpenChange}\n        loading={filteredItems.length === 0}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height,\n          maxHeight: 'xsmall',\n        }}\n      />\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--select-panel-above-tall-body",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput | undefined>(\n    items[0],\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    <>\n      <h1>Single Select Panel</h1>\n      <div>Please select a label that describe your issue:</div>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\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        showItemDividers={true}\n        overlayProps={{\n          width: 'small',\n          height: 'xsmall',\n        }}\n      />\n      <div\n        style={{\n          backgroundColor: 'cornflowerblue',\n          height: '100vh',\n        }}\n      >\n        This element makes the body really tall. This is to test that we do not\n        have layout/focus issues if the Portal is far down the page\n      </div>\n    </>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--select-panel-height-and-scroll",
          "code": "() => {\n  const longItems = [\n    ...items,\n    ...items,\n    ...items,\n    ...items,\n    ...items,\n    ...items,\n    ...items,\n    ...items,\n  ]\n  const [selectedA, setSelectedA] = React.useState<ItemInput | undefined>(\n    longItems[0],\n  )\n  const [selectedB, setSelectedB] = React.useState<ItemInput | undefined>(\n    longItems[0],\n  )\n  const [filter, setFilter] = React.useState('')\n  const filteredItems = longItems.filter((item) =>\n    item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [openA, setOpenA] = useState(false)\n  const [openB, setOpenB] = useState(false)\n  return (\n    <>\n      <h2>With height:medium</h2>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\n          </Button>\n        )}\n        placeholderText=\"Filter Labels\"\n        open={openA}\n        onOpenChange={setOpenA}\n        items={filteredItems}\n        selected={selectedA}\n        onSelectedChange={setSelectedA}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n        overlayProps={{\n          height: 'medium',\n        }}\n      />\n      <h2>With height:auto, maxheight:medium</h2>\n      <SelectPanel\n        renderAnchor={({\n          children,\n          'aria-labelledby': ariaLabelledBy,\n          ...anchorProps\n        }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={` ${ariaLabelledBy}`}\n            {...anchorProps}\n          >\n            {children ?? 'Select Labels'}\n          </Button>\n        )}\n        placeholderText=\"Filter Labels\"\n        open={openB}\n        onOpenChange={setOpenB}\n        items={filteredItems}\n        selected={selectedB}\n        onSelectedChange={setSelectedB}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n        overlayProps={{\n          height: 'auto',\n          maxHeight: 'medium',\n        }}\n      />\n    </>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "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' ) => 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": "selected",
          "type": "ItemInput | ItemInput[] | undefined",
          "defaultValue": "",
          "description": "Specify the selected item(s)"
        },
        {
          "name": "onSelectedChange",
          "type": "(selected: ItemInput | ItemInput[]) => void",
          "defaultValue": "",
          "description": "Provide a callback called when the selected item(s) change"
        },
        {
          "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": "footer",
          "type": "string | React.ReactElement",
          "defaultValue": "null",
          "description": "Footer rendered at the end of the panel"
        }
      ],
      "subcomponents": []
    },
    "spinner": {
      "id": "spinner",
      "name": "Spinner",
      "status": "alpha",
      "a11yReviewed": false,
      "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\" />"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "description": "Sets the width and height of the spinner."
        }
      ],
      "subcomponents": []
    },
    "split_page_layout": {
      "id": "split_page_layout",
      "name": "SplitPageLayout",
      "status": "alpha",
      "a11yReviewed": true,
      "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\">\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\">\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\n        as=\"h2\"\n        sx={{\n          fontSize: 4,\n          fontWeight: 'normal',\n          color: 'danger.fg',\n          mb: 2,\n        }}\n      >\n        Danger zone\n      </Heading>\n      <Box\n        sx={{\n          border: '1px solid',\n          borderColor: 'danger.emphasis',\n          borderRadius: 2,\n          p: 3,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'space-between',\n          gap: 3,\n        }}\n      >\n        <Box\n          sx={{\n            display: 'grid',\n            gap: 1,\n          }}\n        >\n          <Text\n            sx={{\n              fontSize: 1,\n              fontWeight: 'bold',\n              color: 'danger.fg',\n            }}\n          >\n            Delete account\n          </Text>\n          <Text\n            sx={{\n              fontSize: 1,\n              color: 'fg.muted',\n            }}\n          >\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          </Text>\n        </Box>\n        <Button variant=\"danger\">Delete account</Button>\n      </Box>\n    </SplitPageLayout.Content>\n  </SplitPageLayout>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "SplitPageLayout.Header",
          "props": [
            {
              "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "SplitPageLayout.Content",
          "props": [
            {
              "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "SplitPageLayout.Pane",
          "props": [
            {
              "name": "width",
              "type": "| 'small' | 'medium' | 'large'",
              "defaultValue": "'medium'",
              "description": "The width of the pane."
            },
            {
              "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."
            },
            {
              "name": "widthStorageKey",
              "type": "string",
              "defaultValue": "'paneWidth'",
              "description": "Provide a key used by localStorage to persist the size of the pane on the client."
            },
            {
              "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": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "SplitPageLayout.Footer",
          "props": [
            {
              "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."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "stack": {
      "id": "stack",
      "name": "Stack",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "gap",
          "type": "'none' | 'condensed' | 'normal' | 'spacious' | ResponsiveValue<'none' | 'condensed' | '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' | 'condensed' | 'normal' | 'spacious' | ResponsiveValue<'none' | 'condensed' | 'normal' | 'spacious'>",
          "description": "Specify the padding of the stack container."
        }
      ],
      "subcomponents": [
        {
          "name": "Stack.Item",
          "props": [
            {
              "name": "grow",
              "type": "boolean | ResponsiveValue<boolean>",
              "description": "Allow item to keep size or expand to fill the available space."
            }
          ]
        }
      ]
    },
    "state_label": {
      "id": "state_label",
      "name": "StateLabel",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-statelabel--default",
          "code": "() => <StateLabel status=\"issueOpened\">Open</StateLabel>"
        },
        {
          "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--small",
          "code": "() => (\n  <StateLabel status=\"issueOpened\" variant=\"small\">\n    Open\n  </StateLabel>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "variant",
          "type": "'small' | 'normal'",
          "defaultValue": "'normal'"
        },
        {
          "name": "status",
          "type": "'issueOpened' | 'issueClosed' | 'issueClosedNotPlanned' | 'pullOpened' | 'pullClosed' | 'pullMerged' | 'draft' | 'issueDraft' | 'unavailable'",
          "required": true
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "sub_nav": {
      "id": "sub_nav",
      "name": "SubNav",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-subnav--default",
          "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)"
        },
        {
          "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": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "SubNav.Link",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "default": "'a'"
            },
            {
              "name": "href",
              "type": "string"
            },
            {
              "name": "selected",
              "type": "boolean"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "SubNav.Links",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "tab_nav": {
      "id": "tab_nav",
      "name": "TabNav",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "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": "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",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "TabNav.Link",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "'a'"
            },
            {
              "name": "href",
              "type": "string"
            },
            {
              "name": "selected",
              "type": "boolean"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "text": {
      "id": "text",
      "name": "Text",
      "status": "alpha",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "components-text--default",
          "code": "() => <Text>Default Text</Text>"
        },
        {
          "id": "components-text-features--polymorphism",
          "code": "() => (\n  <Box\n    sx={{\n      display: 'flex',\n      flexDirection: 'column',\n    }}\n  >\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  </Box>\n)"
        },
        {
          "id": "components-text-features--styled-text",
          "code": "() => (\n  <Text\n    as=\"p\"\n    sx={{\n      color: 'fg.onEmphasis',\n      bg: 'neutral.emphasis',\n      p: 2,\n    }}\n  >\n    Stylized text\n  </Text>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "as",
          "defaultValue": "'span'",
          "type": "React.ElementType"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "text_input": {
      "id": "text_input",
      "name": "TextInput",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-textinput--default",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--disabled",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput disabled />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--with-caption",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <FormControl.Caption>This is a caption</FormControl.Caption>\n      <TextInput />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--visually-hidden-label",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label visuallyHidden>Default label</FormControl.Label>\n      <TextInput />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--error",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-textinput-features--success",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-textinput-features--block",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput block />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--small",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput size=\"small\" />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--large",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput size=\"large\" />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--required",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl required>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput size=\"large\" />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--with-leading-visual",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput leadingVisual={CheckIcon} />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Enter monies</FormControl.Label>\n      <TextInput leadingVisual=\"$\" />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--with-trailing-icon",
          "code": "() => (\n  <Box>\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <TextInput trailingVisual={CheckIcon} />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Enter monies</FormControl.Label>\n      <TextInput trailingVisual=\"minutes\" placeholder=\"200\" />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textinput-features--with-trailing-action",
          "code": "() => {\n  const [value, setValue] = useState('')\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(event.target.value)\n  }\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput\n          trailingAction={\n            <TextInput.Action\n              onClick={() => {\n                setValue('')\n              }}\n              icon={XCircleFillIcon}\n              aria-label=\"Clear input\"\n              sx={{\n                color: 'fg.subtle',\n              }}\n            />\n          }\n          value={value}\n          onChange={handleChange}\n        />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-tooltip-direction",
          "code": "() => {\n  const [value, setValue] = useState('')\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(event.target.value)\n  }\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput\n          trailingAction={\n            <TextInput.Action\n              onClick={() => {\n                setValue('')\n              }}\n              icon={XCircleFillIcon}\n              aria-label=\"Clear input\"\n              tooltipDirection=\"nw\"\n              sx={{\n                color: 'fg.subtle',\n              }}\n            />\n          }\n          value={value}\n          onChange={handleChange}\n        />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-loading-indicator",
          "code": "(args: FormControlArgs<TextInputProps>) => {\n  return (\n    <Box as=\"form\">\n      <h3>No visual</h3>\n\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput value=\"auto\" {...args} />\n        </FormControl>\n      </Box>\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput value=\"leading\" {...args} loaderPosition=\"leading\" />\n        </FormControl>\n      </Box>\n      <Box mb={5}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput value=\"trailing\" {...args} loaderPosition=\"trailing\" />\n        </FormControl>\n      </Box>\n\n      <h3>Leading visual</h3>\n\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput leadingVisual={CalendarIcon} {...args} value=\"auto\" />\n        </FormControl>\n      </Box>\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={CalendarIcon}\n            {...args}\n            loaderPosition=\"leading\"\n            value=\"leading\"\n          />\n        </FormControl>\n      </Box>\n      <Box mb={5}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={CalendarIcon}\n            {...args}\n            loaderPosition=\"trailing\"\n            value=\"trailing\"\n          />\n        </FormControl>\n      </Box>\n\n      <h3>Trailing visual</h3>\n      <FormControl>\n        <Box mb={2}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput trailingVisual={CalendarIcon} {...args} value=\"auto\" />\n          </FormControl>\n        </Box>\n        <Box mb={2}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput\n              trailingVisual={CalendarIcon}\n              {...args}\n              loaderPosition=\"leading\"\n              value=\"leading\"\n            />\n          </FormControl>\n        </Box>\n        <Box mb={5}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput\n              trailingVisual={CalendarIcon}\n              {...args}\n              loaderPosition=\"trailing\"\n              value=\"trailing\"\n            />\n          </FormControl>\n        </Box>\n      </FormControl>\n\n      <h3>Both visuals</h3>\n\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            size=\"small\"\n            leadingVisual={CalendarIcon}\n            trailingVisual={CalendarIcon}\n            {...args}\n            value=\"auto\"\n          />\n        </FormControl>\n      </Box>\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={CalendarIcon}\n            trailingVisual={CalendarIcon}\n            {...args}\n            loaderPosition=\"leading\"\n            value=\"leading\"\n          />\n        </FormControl>\n      </Box>\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            size=\"large\"\n            leadingVisual={CalendarIcon}\n            trailingVisual={CalendarIcon}\n            {...args}\n            loaderPosition=\"trailing\"\n            value=\"trailing\"\n          />\n        </FormControl>\n      </Box>\n    </Box>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Allows input to be accessible."
        },
        {
          "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": "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": "<div>Which position to render the loading indicator</div> <ul> <li> 'auto' (default): at the end of the input, unless a `leadingVisual` is passed. Then, it will render at the beginning </li> <li>'leading': at the beginning of the input</li> <li>'trailing': at the end of the input</li> </ul>"
        },
        {
          "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 | Array<string | number>",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use sx prop) Set the width of the input"
        },
        {
          "name": "maxWidth",
          "type": "string | number | Array<string | number>",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use sx prop) Set the maximum width of the input"
        },
        {
          "name": "minWidth",
          "type": "string | number | Array<string | number>",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use sx prop) 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": "sx",
          "type": "SystemStyleObject"
        },
        {
          "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\""
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ],
          "passthrough": {
            "element": "button",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attributes"
          }
        }
      ]
    },
    "text_input_with_tokens": {
      "id": "text_input_with_tokens",
      "name": "TextInputWithTokens",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "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": "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": "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": "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    <Box\n      display=\"grid\"\n      sx={{\n        gap: 3,\n      }}\n      as=\"form\"\n    >\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    </Box>\n  )\n}"
        },
        {
          "id": "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    <Box as=\"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    </Box>\n  )\n}"
        },
        {
          "id": "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    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label visuallyHidden>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          sx={{\n            border: '0',\n            padding: '0',\n            boxShadow: 'none',\n            ':focus-within': {\n              border: '0',\n              boxShadow: 'none',\n            },\n          }}\n        />\n      </FormControl>\n    </Box>\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"
        }
      ],
      "subcomponents": []
    },
    "textarea": {
      "id": "textarea",
      "name": "Textarea",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-textarea--default",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textarea-features--disabled",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea disabled />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textarea-features--with-caption",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <FormControl.Caption>This is a caption</FormControl.Caption>\n      <Textarea />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textarea-features--visually-hidden-label",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label visuallyHidden>Default label</FormControl.Label>\n      <Textarea />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textarea-features--error",
          "code": "() => (\n  <Box as=\"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  </Box>\n)"
        },
        {
          "id": "components-textarea-features--success",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea />\n      <FormControl.Validation variant=\"success\">Success</FormControl.Validation>\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textarea-features--block",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea block />\n    </FormControl>\n  </Box>\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": "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": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "timeline": {
      "id": "timeline",
      "name": "Timeline",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-timeline--default",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} />\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} />\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} />\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} />\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} />\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} />\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\n        sx={{\n          bg: 'done.emphasis',\n        }}\n      >\n        <Octicon icon={GitMergeIcon} color=\"fg.onEmphasis\" />\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} />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</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} />\n      </Timeline.Badge>\n      <Timeline.Body>\n        <Link\n          href=\"#\"\n          sx={{\n            fontWeight: 'bold',\n            color: 'fg.default',\n            mr: 1,\n          }}\n          muted\n        >\n          Monalisa\n        </Link>\n        enabled auto-merge (squash)\n      </Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "clipSidebar",
          "type": "boolean",
          "description": "Hides the sidebar above the first Timeline.Item and below the last Timeline.Item."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Timeline.Item",
          "props": [
            {
              "name": "condensed",
              "type": "boolean",
              "description": "Reduces vertical padding and removes background from an item's badge."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "Timeline.Badge",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "Timeline.Body",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "Timeline.Break",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "toggle_switch": {
      "id": "toggle_switch",
      "name": "ToggleSwitch",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-toggleswitch--default",
          "code": "() => (\n  <>\n    <Text id=\"toggle\" fontWeight=\"bold\" fontSize={1}>\n      Toggle label\n    </Text>\n    <ToggleSwitch aria-labelledby=\"toggle\" />\n  </>\n)"
        },
        {
          "id": "components-toggleswitch-features--small",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n      Toggle label\n    </Text>\n    <ToggleSwitch size=\"small\" aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--with-caption",
          "code": "() => (\n  <Box display=\"flex\" alignItems={'start'}>\n    <Box flexGrow={1}>\n      <Text fontSize={2} fontWeight=\"bold\" id=\"switchLabel\" display=\"block\">\n        Notifications\n      </Text>\n      <Text color=\"fg.subtle\" fontSize={1} id=\"switchCaption\" display=\"block\">\n        Notifications will be delivered via email and the GitHub notification\n        center\n      </Text>\n    </Box>\n    <ToggleSwitch\n      aria-labelledby=\"switchLabel\"\n      aria-describedby=\"switchCaption\"\n    />\n  </Box>\n)"
        },
        {
          "id": "components-toggleswitch-features--disabled",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n      Toggle label\n    </Text>\n    <ToggleSwitch disabled aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--checked",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n      Toggle label\n    </Text>\n    <ToggleSwitch checked aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--checked-disabled",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n      Toggle label\n    </Text>\n    <ToggleSwitch checked disabled aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--loading",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n      Toggle label\n    </Text>\n    <ToggleSwitch loading aria-labelledby=\"toggle\" />\n  </ToggleSwitchStoryWrapper>\n)"
        },
        {
          "id": "components-toggleswitch-features--label-end",
          "code": "() => (\n  <ToggleSwitchStoryWrapper>\n    <Text id=\"toggle\" fontWeight={'bold'} fontSize={1}>\n      Toggle label\n    </Text>\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      <Box display=\"flex\" maxWidth=\"300px\">\n        <Box flexGrow={1} fontSize={2} fontWeight=\"bold\" id=\"switchLabel\">\n          Notifications\n        </Box>\n        <ToggleSwitch\n          onClick={onClick}\n          onChange={handleSwitchChange}\n          checked={isOn}\n          aria-labelledby=\"switchLabel\"\n        />\n      </Box>\n      <p>The switch is {isOn ? 'on' : 'off'}</p>\n    </>\n  )\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": "<div>Whether the \"on\" and \"off\" labels should appear before or after the switch.</div> <div> <Text fontWeight=\"bold\">This should only be changed when the switch's alignment needs to be adjusted.</Text> For example: It needs to be left-aligned because the label appears above it and the caption appears below it. </div>"
        }
      ],
      "subcomponents": []
    },
    "token": {
      "id": "token",
      "name": "Token",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-token--default",
          "code": "() => <Token text=\"token\" />"
        },
        {
          "id": "components-token-features--interactive-token",
          "code": "() => {\n  return (\n    <Box\n      display=\"flex\"\n      sx={{\n        alignItems: 'start',\n        gap: get('space.2'),\n      }}\n    >\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      <Token\n        as=\"span\"\n        tabIndex={0}\n        onFocus={action('focused')}\n        text=\"Focusable Span\"\n      />\n    </Box>\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": "() => {\n  return (\n    <Box\n      display=\"flex\"\n      sx={{\n        alignItems: 'start',\n        gap: get('space.2'),\n      }}\n    >\n      <Token text=\"token\" onRemove={action('remove me')} />\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      />\n      <Token\n        as=\"button\"\n        onClick={action('clicked')}\n        onRemove={action('remove me')}\n        text=\"Button\"\n      />\n      <Token\n        as=\"span\"\n        tabIndex={0}\n        onFocus={action('focused')}\n        onRemove={action('remove me')}\n        text=\"Focusable Span\"\n      />\n    </Box>\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    <Box\n      display=\"flex\"\n      sx={{\n        alignItems: 'start',\n        gap: get('space.2'),\n      }}\n    >\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      <IssueLabelToken\n        as=\"span\"\n        tabIndex={0}\n        onFocus={action('focused')}\n        text=\"Focusable Span\"\n      />\n    </Box>\n  )\n}"
        },
        {
          "id": "components-token-features--issue-label-token-with-on-remove-fn",
          "code": "() => {\n  return (\n    <Box\n      display=\"flex\"\n      sx={{\n        alignItems: 'start',\n        gap: get('space.2'),\n      }}\n    >\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      <IssueLabelToken\n        as=\"span\"\n        tabIndex={0}\n        onFocus={action('focused')}\n        onRemove={action('remove me')}\n        text=\"Focusable Span\"\n      />\n    </Box>\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    <Box\n      display=\"flex\"\n      sx={{\n        flexDirection: 'column',\n        alignItems: 'start',\n        gap: get('space.2'),\n      }}\n    >\n      <Box\n        display=\"flex\"\n        sx={{\n          alignItems: 'start',\n          gap: get('space.2'),\n        }}\n      >\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        <IssueLabelToken\n          as=\"span\"\n          tabIndex={0}\n          onFocus={action('focused')}\n          text=\"Focusable Span\"\n          fillColor=\"coral\"\n        />\n      </Box>\n      <h3>Color examples</h3>\n      <Box\n        display=\"flex\"\n        flexWrap=\"wrap\"\n        sx={{\n          alignItems: 'start',\n          gap: get('space.2'),\n        }}\n      >\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      </Box>\n    </Box>\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"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "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"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "AvatarToken",
          "props": [
            {
              "name": "avatarSrc",
              "type": "string"
            },
            {
              "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"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "tooltip": {
      "id": "tooltip",
      "name": "Tooltip",
      "docsId": "tooltip",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-tooltip--default",
          "code": "() => (\n  <Box\n    sx={{\n      p: 5,\n    }}\n  >\n    <Tooltip aria-label=\"Hello, Tooltip!\">\n      <Button>Hover me</Button>\n    </Tooltip>\n  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--all-directions",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 5,\n      display: 'flex',\n      gap: '8px',\n    }}\n  >\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  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--icon-button-tooltip",
          "code": "() => (\n  <Box\n    sx={{\n      p: 5,\n    }}\n  >\n    <Tooltip aria-label=\"Search\">\n      <IconButton icon={SearchIcon} aria-label=\"Search\" />\n    </Tooltip>\n  </Box>\n)"
        }
      ],
      "importPath": "@primer/react",
      "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."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "tooltip_v2": {
      "id": "tooltip_v2",
      "name": "Tooltip",
      "docsId": "tooltip",
      "status": "beta",
      "a11yReviewed": true,
      "importPath": "@primer/react/next",
      "stories": [
        {
          "id": "components-tooltipv2--default",
          "code": "() => (\n  <Box\n    sx={{\n      p: 6,\n    }}\n  >\n    <Tooltip text=\"This change can't be undone.\">\n      <Button>Delete</Button>\n    </Tooltip>\n  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--anchor-has-margin",
          "code": "() => (\n  <Box\n    sx={{\n      p: 5,\n    }}\n  >\n    <Tooltip text=\"Tooltip is still centered\">\n      <Button\n        sx={{\n          marginLeft: 3,\n        }}\n      >\n        Button has 16px margin Left\n      </Button>\n    </Tooltip>\n  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--label-type",
          "code": "() => (\n  <Box>\n    <Tooltip text=\"Contribution Documentation for 'Primer React'\" type=\"label\">\n      <Link\n        href=\"https://github.com/primer/react/contributor-docs/CONTRIBUTING.md\"\n        sx={{\n          ml: 1,\n          color: 'fg.muted',\n        }}\n      >\n        <Octicon\n          icon={BookIcon}\n          sx={{\n            color: 'fg.muted',\n          }}\n        />\n      </Link>\n    </Tooltip>\n  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--description-type",
          "code": "() => (\n  <Box\n    sx={{\n      p: 5,\n    }}\n  >\n    <Tooltip text=\"Supplementary text\" direction=\"n\">\n      <Button>Save</Button>\n    </Tooltip>\n  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--icon-button-with-description",
          "code": "() => (\n  <Box\n    sx={{\n      p: 5,\n    }}\n  >\n    <Tooltip text=\"Supplementary text for icon button\" direction=\"e\">\n      <IconButton icon={SearchIcon} aria-label=\"Search\" />\n    </Tooltip>\n  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--all-directions",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 5,\n      display: 'flex',\n      gap: '8px',\n    }}\n  >\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  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--multiline-text",
          "code": "() => (\n  <Box>\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  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--calculated-direction",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 5,\n      display: 'flex',\n      gap: '8px',\n    }}\n  >\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  </Box>\n)"
        },
        {
          "id": "components-tooltip-features--on-action-menu-anchor",
          "code": "() => (\n  <Box\n    sx={{\n      display: 'flex',\n      padding: 5,\n      gap: 2,\n    }}\n  >\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  </Box>\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 suplementary information to the element that triggers the tooltip."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "tree_view": {
      "id": "tree_view",
      "name": "TreeView",
      "status": "beta",
      "a11yReviewed": true,
      "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} color=\"success.fg\" />\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 icon={DiffModifiedIcon} color=\"attention.fg\" />\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} color=\"attention.fg\" />\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\">\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\">\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} color=\"success.fg\" />\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 icon={DiffModifiedIcon} color=\"attention.fg\" />\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 icon={DiffModifiedIcon} color=\"attention.fg\" />\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 icon={DiffModifiedIcon} color=\"attention.fg\" />\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 icon={DiffRemovedIcon} color=\"danger.fg\" />\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[]>(intialTree)\n  return (\n    <Box\n      sx={{\n        display: 'grid',\n        gap: 3,\n      }}\n    >\n      <Box\n        sx={{\n          display: 'flex',\n          gap: 2,\n        }}\n      >\n        <Button onClick={() => setTree(collapseAll)}>Collapse all</Button>\n        <Button onClick={() => setTree(expandAll)}>Expand all</Button>\n      </Box>\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    </Box>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "required": true
        },
        {
          "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."
        }
      ],
      "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": "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": "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": "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.LeadingAction",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "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 occured 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": "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": {
      "id": "truncate",
      "name": "Truncate",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-truncate--default",
          "code": "() => <Truncate title=\"Some example text\">Some example text</Truncate>"
        }
      ],
      "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'"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "underline_nav": {
      "id": "underline_nav",
      "name": "UnderlineNav",
      "status": "beta",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "components-underlinenav--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--default",
          "code": "() => {\n  return (\n    <UnderlineNav aria-label=\"Repository\">\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}"
        },
        {
          "id": "components-underlinenav-features--with-icons",
          "code": "() => {\n  return (\n    <UnderlineNav aria-label=\"Repository with icons\">\n      <UnderlineNav.Item icon={CodeIcon}>Code</UnderlineNav.Item>\n      <UnderlineNav.Item icon={EyeIcon} counter={6}>\n        Issues\n      </UnderlineNav.Item>\n      <UnderlineNav.Item aria-current=\"page\" icon={GitPullRequestIcon}>\n        Pull Requests\n      </UnderlineNav.Item>\n      <UnderlineNav.Item icon={CommentDiscussionIcon} counter={7}>\n        Discussions\n      </UnderlineNav.Item>\n      <UnderlineNav.Item icon={ProjectIcon}>Projects</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 aria-current=\"page\" icon={CodeIcon} counter=\"11K\">\n        Code\n      </UnderlineNav.Item>\n      <UnderlineNav.Item icon={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          icon={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          icon={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}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "afterSelect",
          "type": "(event) => void",
          "defaultValue": "",
          "description": "The handler that gets called when a nav link child is selected"
        },
        {
          "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": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "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",
              "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"
            },
            {
              "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\""
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ],
          "passthrough": {
            "element": "a",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes"
          }
        }
      ]
    },
    "filter_list": {
      "id": "filter_list",
      "name": "FilterList",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-filterlist--default",
          "code": "() => {\n  const [selectedIndex, setSelectedIndex] = useState(0)\n  return (\n    <FilterList>\n      <FilterList.Item\n        selected={selectedIndex === 0}\n        onClick={() => setSelectedIndex(0)}\n        count={32}\n      >\n        First Filter\n      </FilterList.Item>\n      <FilterList.Item\n        selected={selectedIndex === 1}\n        onClick={() => setSelectedIndex(1)}\n        count={16}\n      >\n        Second Filter\n      </FilterList.Item>\n      <FilterList.Item\n        selected={selectedIndex === 2}\n        onClick={() => setSelectedIndex(2)}\n      >\n        Third Filter\n      </FilterList.Item>\n    </FilterList>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "FilterList.Item",
          "props": [
            {
              "name": "count",
              "type": "number",
              "description": "Number to be displayed in the list item"
            },
            {
              "name": "selected",
              "type": "boolean",
              "description": "Whether the list item is selected or not"
            },
            {
              "name": "small",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the list item is small or not"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "'a'"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "filtered_search": {
      "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`."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "legacy_underline_nav": {
      "id": "legacy_underline_nav",
      "name": "UnderlineNav",
      "status": "deprecated",
      "a11yReviewed": false,
      "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."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "UnderlineNav.Link",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "'a'"
            },
            {
              "name": "href",
              "type": "string"
            },
            {
              "name": "selected",
              "type": "boolean"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "drafts_inline_autocomplete": {
      "id": "drafts_inline_autocomplete",
      "name": "InlineAutocomplete",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-inlineautocomplete--default",
          "code": "({ loading, tabInserts }: ArgProps) => {\n  const [suggestions, setSuggestions] = useState<Suggestions | null>(null)\n  const onShowSuggestions = (event: ShowSuggestionsEvent) => {\n    if (loading) {\n      setSuggestions('loading')\n      return\n    }\n    setSuggestions(filteredUsers(event.query).map((user) => user.login))\n  }\n  return (\n    <FormControl>\n      <FormControl.Label>Inline Autocomplete Demo</FormControl.Label>\n      <FormControl.Caption>\n        Try typing &apos;@&apos; to show user suggestions.\n      </FormControl.Caption>\n      <InlineAutocomplete\n        triggers={[\n          {\n            triggerChar: '@',\n          },\n        ]}\n        suggestions={suggestions}\n        onShowSuggestions={onShowSuggestions}\n        onHideSuggestions={() => setSuggestions(null)}\n        tabInsertsSuggestions={tabInserts}\n      >\n        <Textarea />\n      </InlineAutocomplete>\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-inlineautocomplete-features--single-line",
          "code": "({ loading, tabInserts }: ArgProps) => {\n  const [suggestions, setSuggestions] = useState<Suggestions | null>(null)\n  const onShowSuggestions = (event: ShowSuggestionsEvent) => {\n    if (loading) {\n      setSuggestions('loading')\n      return\n    }\n    setSuggestions(filteredUsers(event.query).map((user) => user.login))\n  }\n  return (\n    <FormControl>\n      <FormControl.Label>Inline Autocomplete Demo</FormControl.Label>\n      <FormControl.Caption>\n        Try typing &apos;@&apos; to show user suggestions.\n      </FormControl.Caption>\n      <InlineAutocomplete\n        triggers={[\n          {\n            triggerChar: '@',\n          },\n        ]}\n        suggestions={suggestions}\n        onShowSuggestions={onShowSuggestions}\n        onHideSuggestions={() => setSuggestions(null)}\n        tabInsertsSuggestions={tabInserts}\n      >\n        <TextInput\n          sx={{\n            lineHeight: 1.2,\n          }}\n        />\n      </InlineAutocomplete>\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-inlineautocomplete-features--on-select-suggestion",
          "code": "({ loading, tabInserts }: ArgProps) => {\n  const [suggestions, setSuggestions] = useState<Suggestions | null>(null)\n  const onShowSuggestions = (event: ShowSuggestionsEvent) => {\n    if (loading) {\n      setSuggestions('loading')\n      return\n    }\n    setSuggestions(filteredUsers(event.query).map((user) => user.login))\n  }\n  return (\n    <FormControl>\n      <FormControl.Label>Inline Autocomplete Demo</FormControl.Label>\n      <FormControl.Caption>\n        Try typing &apos;@&apos; to show user suggestions.\n      </FormControl.Caption>\n      <InlineAutocomplete\n        triggers={[\n          {\n            triggerChar: '@',\n          },\n        ]}\n        onSelectSuggestion={(suggestion) =>\n          window.alert(`Selected ${suggestion}`)\n        }\n        suggestions={suggestions}\n        onShowSuggestions={onShowSuggestions}\n        onHideSuggestions={() => setSuggestions(null)}\n        tabInsertsSuggestions={tabInserts}\n      >\n        <TextInput\n          sx={{\n            lineHeight: 1.2,\n          }}\n        />\n      </InlineAutocomplete>\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-inlineautocomplete-features--custom-rendering",
          "code": "({ loading, tabInserts }: ArgProps) => {\n  const [suggestions, setSuggestions] = useState<Suggestions | null>(null)\n  const onShowSuggestions = (event: ShowSuggestionsEvent) => {\n    if (loading) {\n      setSuggestions('loading')\n      return\n    }\n    setSuggestions(\n      filteredUsers(event.query).map((user) => ({\n        value: user.login,\n        render: (props) => <UserSuggestion user={user} {...props} />,\n      })),\n    )\n  }\n  const onHideSuggestions = () => setSuggestions(null)\n  return (\n    <FormControl>\n      <FormControl.Label>Inline Autocomplete Demo</FormControl.Label>\n      <FormControl.Caption>\n        Try typing &apos;@&apos; to show user suggestions.\n      </FormControl.Caption>\n      <InlineAutocomplete\n        triggers={[\n          {\n            triggerChar: '@',\n          },\n        ]}\n        suggestions={suggestions}\n        onShowSuggestions={onShowSuggestions}\n        onHideSuggestions={onHideSuggestions}\n        tabInsertsSuggestions={tabInserts}\n      >\n        <Textarea />\n      </InlineAutocomplete>\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-inlineautocomplete-features--above-positioning",
          "code": "() => {\n  const [suggestions, setSuggestions] = useState<Suggestions | null>(null)\n  const onShowSuggestions = (event: ShowSuggestionsEvent) => {\n    setSuggestions(\n      filteredUsers(event.query).map((user) => ({\n        value: user.login,\n        render: (props) => <UserSuggestion user={user} {...props} />,\n      })),\n    )\n  }\n  const onHideSuggestions = () => setSuggestions(null)\n  return (\n    <FormControl\n      sx={{\n        position: 'absolute',\n        bottom: '15px',\n      }}\n    >\n      <FormControl.Label>Inline Autocomplete Demo</FormControl.Label>\n      <FormControl.Caption>\n        Try typing &apos;@&apos; to show user suggestions.\n      </FormControl.Caption>\n      <InlineAutocomplete\n        triggers={[\n          {\n            triggerChar: '@',\n          },\n        ]}\n        suggestions={suggestions}\n        onShowSuggestions={onShowSuggestions}\n        onHideSuggestions={onHideSuggestions}\n        suggestionsPlacement=\"above\"\n      >\n        <Textarea\n          sx={{\n            height: '70px',\n          }}\n        />\n      </InlineAutocomplete>\n    </FormControl>\n  )\n}"
        },
        {
          "id": "deprecated-components-inlineautocomplete-features--auto-positioning",
          "code": "() => {\n  const [suggestions, setSuggestions] = useState<Suggestions | null>(null)\n  const onShowSuggestions = (event: ShowSuggestionsEvent) => {\n    setSuggestions(\n      filteredUsers(event.query).map((user) => ({\n        value: user.login,\n        render: (props) => <UserSuggestion user={user} {...props} />,\n      })),\n    )\n  }\n  const onHideSuggestions = () => setSuggestions(null)\n  return (\n    <FormControl\n      sx={{\n        position: 'absolute',\n        bottom: '15px',\n      }}\n    >\n      <FormControl.Label>Inline Autocomplete Demo</FormControl.Label>\n      <FormControl.Caption>\n        Try typing &apos;@&apos; to show user suggestions.\n      </FormControl.Caption>\n      <InlineAutocomplete\n        triggers={[\n          {\n            triggerChar: '@',\n          },\n        ]}\n        suggestions={suggestions}\n        onShowSuggestions={onShowSuggestions}\n        onHideSuggestions={onHideSuggestions}\n      >\n        <Textarea\n          sx={{\n            height: '70px',\n          }}\n        />\n      </InlineAutocomplete>\n    </FormControl>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "defaultValue": "",
          "required": true,
          "description": "An `input` or `textarea` compatible component to extend. A compatible component is any component that forwards a ref and props to an underlying `input` or `textarea` element, including but not limited to `Input`, `TextArea`, `input`, `textarea`, `styled.input`, and `styled.textarea`. If the child is not compatible, a runtime `TypeError` will be thrown."
        },
        {
          "name": "triggers",
          "type": "Array<Trigger>",
          "defaultValue": "",
          "required": true,
          "description": "Register the triggers that can cause suggestions to appear."
        },
        {
          "name": "onSelectSuggestion",
          "type": "(event: SelectSuggestionsEvent) => void",
          "defaultValue": "",
          "description": "Called when a suggestion is selected. This should be used only for performing side effects, not for modifying\nthe inserted text. Do not call `setState` in this handler or the user's cursor\nposition / undo history could be lost."
        },
        {
          "name": "onShowSuggestions",
          "type": "(event: ShowSuggestionsEvent) => void",
          "defaultValue": "",
          "required": true,
          "description": "Called when a valid suggestion query is updated. This should be handled by setting the `suggestions` prop accordingly."
        },
        {
          "name": "onShowSuggestions",
          "type": "() => void",
          "defaultValue": "",
          "required": true,
          "description": "Called when suggestions should be hidden. Set `suggestions` to `null` or an empty array in this case."
        },
        {
          "name": "suggestions",
          "type": "Suggestion[] | null | 'loading'",
          "defaultValue": "",
          "required": true,
          "description": "The currently visible list of suggestions. If `loading`, a loading indicator will be shown. If `null` or empty, the list will be hidden. Suggestion sort will be preserved. Typically, this should not contain more than five or so suggestions."
        },
        {
          "name": "tabInsertsSuggestions",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If `true`, suggestions will be applied with both `Tab` and `Enter`, instead of just `Enter`. This may be expected behavior for users used to IDEs, but use caution when hijacking browser tabbing capability."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "drafts_markdown_editor": {
      "id": "drafts_markdown_editor",
      "name": "MarkdownEditor",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-markdowneditor--default",
          "code": "() => {\n  const [value, setValue] = useState('')\n  return (\n    <>\n      <MarkdownEditor\n        value={value}\n        onChange={setValue}\n        placeholder=\"Enter some Markdown...\"\n        onRenderPreview={renderPreview}\n        emojiSuggestions={emojis}\n      >\n        <MarkdownEditor.Label>Markdown Editor Example</MarkdownEditor.Label>\n      </MarkdownEditor>\n      <p>\n        Note: for demo purposes, files starting with &quot;A&quot; will be\n        rejected.\n      </p>\n    </>\n  )\n}"
        },
        {
          "id": "deprecated-components-markdowneditor-features--custom-toolbar",
          "code": "({\n  disabled,\n  fullHeight,\n  monospace,\n  minHeightLines,\n  maxHeightLines,\n  hideLabel,\n  required,\n  fileUploadsEnabled,\n  onSubmit,\n  onDiffClick,\n  savedRepliesEnabled,\n  pasteUrlsAsPlainText,\n}: ArgProps) => {\n  const [value, setValue] = useState('')\n  return (\n    <Box\n      sx={{\n        maxWidth: 800,\n      }}\n    >\n      <MarkdownEditor\n        value={value}\n        onChange={setValue}\n        onPrimaryAction={onSubmit}\n        disabled={disabled}\n        fullHeight={fullHeight}\n        monospace={monospace}\n        minHeightLines={minHeightLines}\n        maxHeightLines={maxHeightLines}\n        placeholder=\"Enter some Markdown...\"\n        onRenderPreview={renderPreview}\n        onUploadFile={fileUploadsEnabled ? onUploadFile : undefined}\n        emojiSuggestions={emojis}\n        mentionSuggestions={mentionables}\n        referenceSuggestions={references}\n        required={required}\n        savedReplies={savedRepliesEnabled ? savedReplies : undefined}\n        pasteUrlsAsPlainText={pasteUrlsAsPlainText}\n      >\n        <MarkdownEditor.Label visuallyHidden={hideLabel}>\n          Markdown Editor Example\n        </MarkdownEditor.Label>\n\n        <MarkdownEditor.Toolbar>\n          <MarkdownEditor.ToolbarButton\n            icon={DiffIcon}\n            onClick={onDiffClick}\n            aria-label=\"Custom Button\"\n          />\n          <MarkdownEditor.DefaultToolbarButtons />\n        </MarkdownEditor.Toolbar>\n      </MarkdownEditor>\n      <p>\n        Note: for demo purposes, files starting with &quot;A&quot; will be\n        rejected.\n      </p>\n    </Box>\n  )\n}"
        },
        {
          "id": "deprecated-components-markdowneditor-features--custom-footer",
          "code": "({\n  disabled,\n  fullHeight,\n  monospace,\n  minHeightLines,\n  maxHeightLines,\n  hideLabel,\n  required,\n  fileUploadsEnabled,\n  onSubmit,\n  onFooterClick,\n  savedRepliesEnabled,\n  pasteUrlsAsPlainText,\n}: ArgProps) => {\n  const [value, setValue] = useState('')\n  return (\n    <Box\n      sx={{\n        maxWidth: 800,\n      }}\n    >\n      <MarkdownEditor\n        value={value}\n        onChange={setValue}\n        onPrimaryAction={onSubmit}\n        disabled={disabled}\n        fullHeight={fullHeight}\n        monospace={monospace}\n        minHeightLines={minHeightLines}\n        maxHeightLines={maxHeightLines}\n        placeholder=\"Enter some Markdown...\"\n        onRenderPreview={renderPreview}\n        onUploadFile={fileUploadsEnabled ? onUploadFile : undefined}\n        emojiSuggestions={emojis}\n        mentionSuggestions={mentionables}\n        referenceSuggestions={references}\n        required={required}\n        savedReplies={savedRepliesEnabled ? savedReplies : undefined}\n        pasteUrlsAsPlainText={pasteUrlsAsPlainText}\n      >\n        <MarkdownEditor.Label visuallyHidden={hideLabel}>\n          Markdown Editor Example - Custom Footer\n        </MarkdownEditor.Label>\n\n        <MarkdownEditor.Footer>\n          <MarkdownEditor.FooterButton\n            variant=\"invisible\"\n            onClick={onFooterClick}\n            leadingVisual={PlusIcon}\n            sx={{\n              borderRadius: '14px',\n              color: 'fg.muted',\n              borderColor: 'border.muted',\n            }}\n          >\n            Add Button\n          </MarkdownEditor.FooterButton>\n\n          <MarkdownEditor.Actions>\n            <MarkdownEditor.ActionButton\n              variant=\"danger\"\n              onClick={() => setValue('')}\n            >\n              Reset\n            </MarkdownEditor.ActionButton>\n            <MarkdownEditor.ActionButton variant=\"primary\" onClick={onSubmit}>\n              Submit\n            </MarkdownEditor.ActionButton>\n          </MarkdownEditor.Actions>\n        </MarkdownEditor.Footer>\n      </MarkdownEditor>\n      <p>\n        Note: for demo purposes, files starting with &quot;A&quot; will be\n        rejected.\n      </p>\n    </Box>\n  )\n}"
        },
        {
          "id": "deprecated-components-markdowneditor-features--custom-footer-actions",
          "code": "({\n  disabled,\n  fullHeight,\n  monospace,\n  minHeightLines,\n  maxHeightLines,\n  hideLabel,\n  required,\n  fileUploadsEnabled,\n  onSubmit,\n  savedRepliesEnabled,\n  pasteUrlsAsPlainText,\n}: ArgProps) => {\n  const [value, setValue] = useState('')\n  return (\n    <Box\n      sx={{\n        maxWidth: 800,\n      }}\n    >\n      <MarkdownEditor\n        value={value}\n        onChange={setValue}\n        onPrimaryAction={onSubmit}\n        disabled={disabled}\n        fullHeight={fullHeight}\n        monospace={monospace}\n        minHeightLines={minHeightLines}\n        maxHeightLines={maxHeightLines}\n        placeholder=\"Enter some Markdown...\"\n        onRenderPreview={renderPreview}\n        onUploadFile={fileUploadsEnabled ? onUploadFile : undefined}\n        emojiSuggestions={emojis}\n        mentionSuggestions={mentionables}\n        referenceSuggestions={references}\n        required={required}\n        savedReplies={savedRepliesEnabled ? savedReplies : undefined}\n        pasteUrlsAsPlainText={pasteUrlsAsPlainText}\n      >\n        <MarkdownEditor.Label visuallyHidden={hideLabel}>\n          Markdown Editor Example\n        </MarkdownEditor.Label>\n\n        <MarkdownEditor.Actions>\n          <MarkdownEditor.ActionButton\n            variant=\"danger\"\n            onClick={() => setValue('')}\n          >\n            Reset\n          </MarkdownEditor.ActionButton>\n          <MarkdownEditor.ActionButton variant=\"primary\" onClick={onSubmit}>\n            Submit\n          </MarkdownEditor.ActionButton>\n        </MarkdownEditor.Actions>\n      </MarkdownEditor>\n      <p>\n        Note: for demo purposes, files starting with &quot;A&quot; will be\n        rejected.\n      </p>\n    </Box>\n  )\n}"
        },
        {
          "id": "deprecated-components-markdowneditor-features--lazy-loaded-suggestions",
          "code": "({\n  disabled,\n  fullHeight,\n  monospace,\n  minHeightLines,\n  maxHeightLines,\n  hideLabel,\n  required,\n  fileUploadsEnabled,\n  onSubmit,\n  savedRepliesEnabled,\n  pasteUrlsAsPlainText,\n}: ArgProps) => {\n  const [value, setValue] = useState('')\n  const emojiSuggestions = useLazySuggestions(emojis)\n  const mentionSuggestions = useLazySuggestions(mentionables)\n  const referenceSuggestions = useLazySuggestions(references)\n  return (\n    <Box\n      sx={{\n        maxWidth: 800,\n      }}\n    >\n      <MarkdownEditor\n        value={value}\n        onChange={setValue}\n        onPrimaryAction={onSubmit}\n        disabled={disabled}\n        fullHeight={fullHeight}\n        monospace={monospace}\n        minHeightLines={minHeightLines}\n        maxHeightLines={maxHeightLines}\n        placeholder=\"Enter some Markdown...\"\n        onRenderPreview={renderPreview}\n        onUploadFile={fileUploadsEnabled ? onUploadFile : undefined}\n        emojiSuggestions={emojiSuggestions}\n        mentionSuggestions={mentionSuggestions}\n        referenceSuggestions={referenceSuggestions}\n        savedReplies={savedRepliesEnabled ? savedReplies : undefined}\n        required={required}\n        pasteUrlsAsPlainText={pasteUrlsAsPlainText}\n      >\n        <MarkdownEditor.Label visuallyHidden={hideLabel}>\n          Markdown Editor Example\n        </MarkdownEditor.Label>\n      </MarkdownEditor>\n      <p>\n        Note: for demo purposes, files starting with &quot;A&quot; will be\n        rejected.\n      </p>\n    </Box>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "value",
          "required": true,
          "type": "string",
          "description": "Current value of the editor as a multiline markdown string."
        },
        {
          "name": "onChange",
          "required": true,
          "type": "(newMarkdown: string) => void",
          "description": "Called when the value changes. "
        },
        {
          "name": "onRenderPreview",
          "required": true,
          "type": "(markdown: string) => Promise<string>",
          "description": "Accepts Markdown and returns rendered HTML. To prevent XSS attacks, the HTML should be sanitized and/or come from a trusted source."
        },
        {
          "name": "children",
          "required": true,
          "type": "React.ReactNode"
        },
        {
          "name": "disabled",
          "type": "boolean",
          "description": "Disable the editor and all related buttons. Users can still switch between preview & edit modes."
        },
        {
          "name": "placeholder",
          "type": "string",
          "description": "Placeholder text to show when the editor is empty. By default, no placeholder will be shown."
        },
        {
          "name": "maxLength",
          "type": "number",
          "description": "Maximum number of characters the markdown can hold (includes formatting characters like `*`). "
        },
        {
          "name": "fullHeight",
          "type": "boolean",
          "description": "Force the editor to take up the full height of the container and disallow resizing. Only use when the container height is tall enough that the user will never want to expand the input further, ie when it takes the full height of the viewport."
        },
        {
          "name": "aria-describedby",
          "type": "string"
        },
        {
          "name": "viewMode",
          "type": "'preview' | 'edit'"
        },
        {
          "name": "onChangeViewMode",
          "type": "(newViewMode: 'preview' | 'edit') => void"
        },
        {
          "name": "onPrimaryAction",
          "type": "() => void"
        },
        {
          "name": "minHeightLines",
          "type": "number",
          "defaultValue": "5"
        },
        {
          "name": "maxHeightLines",
          "type": "number",
          "defaultValue": "35"
        },
        {
          "name": "emojiSuggestions",
          "type": "SuggestionOptions<Emoji>"
        },
        {
          "name": "mentionSuggestions",
          "type": "SuggestionOptions<Mentionable>"
        },
        {
          "name": "referenceSuggestions",
          "type": "SuggestionOptions<Reference>"
        },
        {
          "name": "onUploadFile",
          "type": "(file: File) => Promise<FileUploadResult>"
        },
        {
          "name": "acceptedFileTypes",
          "type": "FileType[]"
        },
        {
          "name": "monospace",
          "type": "boolean"
        },
        {
          "name": "required",
          "type": "boolean"
        },
        {
          "name": "name",
          "type": "string"
        },
        {
          "name": "savedReplies",
          "type": "SavedReply[]"
        },
        {
          "name": "pasteUrlsAsPlainText",
          "type": "boolean"
        }
      ],
      "subcomponents": []
    },
    "drafts_markdown_viewer": {
      "id": "drafts_markdown_viewer",
      "name": "MarkdownViewer",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-markdownviewer--default",
          "code": "({ loading, linksInNewTab }: ArgProps) => (\n  <MarkdownViewer\n    loading={loading}\n    openLinksInNewTab={linksInNewTab}\n    dangerousRenderedHTML={htmlObject}\n  />\n)"
        },
        {
          "id": "deprecated-components-markdownviewer-features--link-interception",
          "code": "({ loading }: ArgProps) => (\n  <MarkdownViewer\n    loading={loading}\n    onLinkClick={(event) => {\n      event.preventDefault()\n      alert(\n        `Link clicked: ${\n          event.target instanceof HTMLAnchorElement\n            ? event.target.href\n            : 'unknown'\n        }`,\n      )\n    }}\n    dangerousRenderedHTML={htmlObject}\n  />\n)"
        },
        {
          "id": "deprecated-components-markdownviewer-features--interactive",
          "code": "({ loading, linksInNewTab }: ArgProps) => {\n  const [markdown, setMarkdown] = useState(sampleMarkdownSource)\n  const [disabled, setDisabled] = useState(false)\n\n  // Any state-setting inside a debounced function and/or after an async call should be done safely\n  // to avoid setting state after the component unmounts\n  const safeSetDisabled = useSafeAsyncCallback(setDisabled)\n  const saveChanges = useCallback(async () => {\n    // Disable interaction for the duration of the request to avoid conflicts\n    safeSetDisabled(true)\n    // In production this would make an API request to save the markdown and update the rendered HTML\n    await new Promise((r) => setTimeout(r, 500))\n    safeSetDisabled(false)\n  }, [safeSetDisabled])\n\n  // saveChanges itself must also be called safely to avoid accidentally calling an outdated reference\n  // Important to allow calling after unmount to avoid loss of data if the component unmounts before saving\n  const safeSaveChanges = useSafeAsyncCallback(saveChanges, true)\n\n  // We always want to debounce the request to avoid disabling checkboxes in between every click\n  const debouncedSaveChanges = useMemo(\n    () => debounce(safeSaveChanges, 1000),\n    [safeSaveChanges],\n  )\n  return (\n    <MarkdownViewer\n      loading={loading}\n      openLinksInNewTab={linksInNewTab}\n      onChange={(md) => {\n        setMarkdown(md)\n        debouncedSaveChanges()\n      }}\n      markdownValue={markdown}\n      dangerousRenderedHTML={htmlObject}\n      disabled={disabled}\n    />\n  )\n}"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "markdownValue",
          "type": "string",
          "description": "The markdown the HTML was rendered from. This is not used for viewing, only as a source for change events."
        },
        {
          "name": "dangerousRenderHTML",
          "type": "{ __html: string }",
          "description": "Set the rendered HTML of the viewer. To prevent XSS, ensure that the source of this HTML is trusted!"
        },
        {
          "name": "loading",
          "type": "boolean",
          "description": "Show a loading spinner instead of content."
        },
        {
          "name": "onLinkClick",
          "type": "(event: MouseEvent) => void",
          "description": "Called when the user clicks a link element. This can be used to intercept the click and provide custom routing. Note that this is a native HTML `MouseEvent` and not a `React.ClickEvent`."
        },
        {
          "name": "openLinksInNewTab",
          "type": "boolean"
        },
        {
          "name": "onChange",
          "type": "(markdown: string) => void | Promise<void>",
          "description": "Called when the user interacts and updates the Markdown. The rendered Markdown is updated eagerly - if the request fails, a rejected Promise should be returned by this handler. In that case, the viewer will revert the visual change. If the change is handled by an async API request (as it typically will be in production code), the viewer should be `disabled` while the request is pending to avoid conflicts. To allow users to check multiple boxes rapidly, the API request should be debounced (an ideal debounce duration is about 1 second)."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "description": "Control whether interaction is disabled."
        }
      ],
      "subcomponents": []
    },
    "select_panel_v2": {
      "id": "select_panel_v2",
      "docsId": "select_panel",
      "name": "SelectPanel",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "drafts-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 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            {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                  <Box\n                    sx={{\n                      width: 14,\n                      height: 14,\n                      borderRadius: '100%',\n                    }}\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": "drafts-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": "drafts-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\n            sx={{\n              color: 'fg.muted',\n            }}\n          >\n            Notify me:\n          </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          <Box\n            role=\"none\"\n            sx={{\n              transition: 'max-height 100ms ease-out, opacity 100ms ease-out',\n              opacity: channelsEnabled ? 1 : 0,\n              maxHeight: channelsEnabled ? '100px' : 0,\n              overflow: channelsEnabled ? 'visible' : 'hidden',\n            }}\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          </Box>\n        </ActionList>\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "drafts-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": "drafts-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          sx={{\n            width: '200px',\n            '[data-component=buttonContent]': {\n              justifyContent: 'start',\n            },\n          }}\n        >\n          Assignees\n        </SelectPanel.Button>\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput onChange={onSearchInputChange} />\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": "drafts-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": "drafts-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 = (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 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          sx={{\n            width: '200px',\n            '[data-component=buttonContent]': {\n              justifyContent: 'start',\n            },\n          }}\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": "drafts-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": "drafts-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": "drafts-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      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          <Box\n            id=\"filters\"\n            sx={{\n              display: 'flex',\n              marginTop: 1,\n            }}\n          >\n            <Button\n              variant=\"invisible\"\n              sx={{\n                fontWeight:\n                  selectedFilter === 'branches' ? 'semibold' : 'normal',\n                color: 'fg.default',\n              }}\n              onClick={() => setSelectedFilter('branches')}\n              count={20}\n            >\n              Branches\n            </Button>\n            <Button\n              variant=\"invisible\"\n              sx={{\n                fontWeight: selectedFilter === 'tags' ? 'semibold' : 'normal',\n                color: 'fg.default',\n              }}\n              onClick={() => setSelectedFilter('tags')}\n              count={8}\n            >\n              Tags\n            </Button>\n          </Box>\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": "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`."
        }
      ],
      "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": "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"
            }
          ]
        }
      ]
    },
    "tab_panels": {
      "id": "tab_panels",
      "name": "TabPanels",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "drafts-components-tabpanels--default",
          "code": "() => (\n  <TabPanels aria-label=\"Select a tab\" id=\"tab-panels\" defaultTabIndex={0}>\n    <TabPanels.Tab>Tab 1</TabPanels.Tab>\n    <TabPanels.Tab>Tab 2</TabPanels.Tab>\n    <TabPanels.Tab>Tab 3</TabPanels.Tab>\n    <TabPanels.Panel>Panel 1</TabPanels.Panel>\n    <TabPanels.Panel>Panel 2</TabPanels.Panel>\n    <TabPanels.Panel>Panel 3</TabPanels.Panel>\n  </TabPanels>\n)"
        },
        {
          "id": "drafts-components-tabpanels-features--default-tab",
          "code": "() => (\n  <TabPanels aria-label=\"TabPanels example\" id=\"tab-panels\" defaultTabIndex={1}>\n    <TabPanels.Tab>One</TabPanels.Tab>\n    <TabPanels.Tab>Two</TabPanels.Tab>\n    <TabPanels.Tab>Three</TabPanels.Tab>\n    <TabPanels.Panel>One</TabPanels.Panel>\n    <TabPanels.Panel>Two</TabPanels.Panel>\n    <TabPanels.Panel>Three</TabPanels.Panel>\n  </TabPanels>\n)"
        },
        {
          "id": "drafts-components-tabpanels-features--selected-tab",
          "code": "() => (\n  <TabPanels\n    aria-label=\"TabPanels example\"\n    id=\"tab-panels\"\n    selectedTabIndex={1}\n  >\n    <TabPanels.Tab>One</TabPanels.Tab>\n    <TabPanels.Tab>Two</TabPanels.Tab>\n    <TabPanels.Tab>Three</TabPanels.Tab>\n    <TabPanels.Panel>One</TabPanels.Panel>\n    <TabPanels.Panel>Two</TabPanels.Panel>\n    <TabPanels.Panel>Three</TabPanels.Panel>\n  </TabPanels>\n)"
        },
        {
          "id": "drafts-components-tabpanels-features--labelled-by",
          "code": "() => (\n  <>\n    <h1 id=\"my-heading\">TabPanels example</h1>\n    <TabPanels aria-labelledby=\"my-heading\" id=\"tab-panels\">\n      <TabPanels.Tab>One</TabPanels.Tab>\n      <TabPanels.Tab>Two</TabPanels.Tab>\n      <TabPanels.Tab>Three</TabPanels.Tab>\n      <TabPanels.Panel>One</TabPanels.Panel>\n      <TabPanels.Panel>Two</TabPanels.Panel>\n      <TabPanels.Panel>Three</TabPanels.Panel>\n    </TabPanels>\n  </>\n)"
        },
        {
          "id": "drafts-components-tabpanels-features--additional-content",
          "code": "() => (\n  <TabPanels aria-label=\"TabPanels example\" id=\"tab-panels\">\n    <Button>Non-tab content (before tabs)</Button>\n    <TabPanels.Tab>One</TabPanels.Tab>\n    <TabPanels.Tab>Two</TabPanels.Tab>\n    <TabPanels.Tab>Three</TabPanels.Tab>\n    <Button>Non-tab content (after tabs)</Button>\n    <TabPanels.Panel>One</TabPanels.Panel>\n    <TabPanels.Panel>Two</TabPanels.Panel>\n    <TabPanels.Panel>Three</TabPanels.Panel>\n    <div>Additional content after the panels</div>\n  </TabPanels>\n)"
        },
        {
          "id": "drafts-components-tabpanels-features--many-tabs",
          "code": "() => (\n  <TabPanels\n    aria-label=\"TabPanels example\"\n    id=\"tab-panels\"\n    defaultTabIndex={10}\n  >\n    <TabPanels.Tab>One</TabPanels.Tab>\n    <TabPanels.Tab>Two</TabPanels.Tab>\n    <TabPanels.Tab>Three</TabPanels.Tab>\n    <TabPanels.Tab>Four</TabPanels.Tab>\n    <TabPanels.Tab>Five</TabPanels.Tab>\n    <TabPanels.Tab>Six</TabPanels.Tab>\n    <TabPanels.Tab>Seven</TabPanels.Tab>\n    <TabPanels.Tab>Eight</TabPanels.Tab>\n    <TabPanels.Tab>Nine</TabPanels.Tab>\n    <TabPanels.Tab>Ten</TabPanels.Tab>\n    <TabPanels.Tab>Eleven</TabPanels.Tab>\n    <TabPanels.Panel>One</TabPanels.Panel>\n    <TabPanels.Panel>Two</TabPanels.Panel>\n    <TabPanels.Panel>Three</TabPanels.Panel>\n    <TabPanels.Panel>Four</TabPanels.Panel>\n    <TabPanels.Panel>Five</TabPanels.Panel>\n    <TabPanels.Panel>Six</TabPanels.Panel>\n    <TabPanels.Panel>Seven</TabPanels.Panel>\n    <TabPanels.Panel>Eight</TabPanels.Panel>\n    <TabPanels.Panel>Nine</TabPanels.Panel>\n    <TabPanels.Panel>Ten</TabPanels.Panel>\n    <TabPanels.Panel>Eleven</TabPanels.Panel>\n  </TabPanels>\n)"
        },
        {
          "id": "drafts-components-tabpanels-features--alternative-structure",
          "code": "() => (\n  <TabPanels aria-label=\"TabPanels example\" id=\"tab-panels\">\n    <TabPanels.Tab>One</TabPanels.Tab>\n    <TabPanels.Panel>One</TabPanels.Panel>\n    <TabPanels.Tab>Two</TabPanels.Tab>\n    <TabPanels.Panel>Two</TabPanels.Panel>\n    <TabPanels.Tab>Three</TabPanels.Tab>\n    <TabPanels.Panel>Three</TabPanels.Panel>\n  </TabPanels>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the `role=\"tablist\"` element. Either aria-label or aria-labelledby must be provided."
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "description": "Used to set the `aria-labelledby` on the `role=\"tablist\"` element. Either aria-label or aria-labelledby must be provided."
        },
        {
          "name": "children",
          "type": "React.ReactNode",
          "description": "The content of the component, can contain Tabs, Panels but also content before and after Tabs and after the Panels."
        },
        {
          "name": "id",
          "type": "string",
          "description": "The id of the tab container, used to generate child ids."
        },
        {
          "name": "defaultTabIndex",
          "type": "number",
          "description": "The 0-based index of the tab that is selected by default when the component is loaded."
        },
        {
          "name": "selectedTabIndex",
          "type": "number",
          "description": "The 0-based index of the tab that is selected."
        },
        {
          "name": "onChange",
          "type": "function",
          "description": "Callback fired when the tab container changes (bubbles, cancelable): fired on `<tab-container>` before a new tab is selected and visibility is updated. `event.tab` is the tab that will be focused and `tab.panel` is the panel that will be shown if the event isn't cancelled."
        },
        {
          "name": "onChanged",
          "type": "function",
          "description": "Callback fired when the tab container changes (bubbles): fired on `<tab-container>` after a new tab is selected and visibility is updated. `event.tab` is the tab that is now active (and will be focused right after this event) and `event.panel` is the newly visible tab panel."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "TabPanels.Tab",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "TabPanels.Panel",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "description": "The content of the panel."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    }
  }
}