{
  "schemaVersion": 2,
  "components": {
    "actionbar": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ActionBar",
      "id": "actionbar",
      "name": "ActionBar",
      "status": "alpha",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "experimental-components-actionbar--default",
          "code": "() => (\n  <ActionBar aria-label=\"Toolbar\">\n    <ActionBar.IconButton\n      icon={BoldIcon}\n      aria-label=\"Bold\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={ItalicIcon}\n      aria-label=\"Italic\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={CodeIcon}\n      aria-label=\"Code\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={LinkIcon}\n      aria-label=\"Link\"\n    ></ActionBar.IconButton>\n    <ActionBar.Divider />\n    <ActionBar.IconButton\n      icon={FileAddedIcon}\n      aria-label=\"File Added\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={SearchIcon}\n      aria-label=\"Search\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={QuoteIcon}\n      aria-label=\"Insert Quote\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={ListUnorderedIcon}\n      aria-label=\"Unordered List\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={ListOrderedIcon}\n      aria-label=\"Ordered List\"\n    ></ActionBar.IconButton>\n    <ActionBar.IconButton\n      icon={TasklistIcon}\n      aria-label=\"Task List\"\n    ></ActionBar.IconButton>\n  </ActionBar>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "required": false,
          "description": "When provided, a label is added to the action bar",
          "defaultValue": ""
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "required": false,
          "description": "When provided, uses the element with that ID as the accessible name for the ActionBar",
          "defaultValue": ""
        },
        {
          "name": "children",
          "type": "ReactNode",
          "required": false,
          "description": "Buttons in the action bar",
          "defaultValue": ""
        },
        {
          "name": "size",
          "type": "'small' | 'large' | 'medium'",
          "required": false,
          "description": "Size of the action bar",
          "defaultValue": ""
        },
        {
          "name": "flush",
          "type": "boolean",
          "required": false,
          "description": "Allows ActionBar to be flush with the container",
          "defaultValue": "false"
        },
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Custom className",
          "defaultValue": ""
        }
      ],
      "subcomponents": [
        {
          "name": "ActionBar.IconButton",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "This will be the Button description."
            },
            {
              "name": "icon",
              "type": "Component",
              "defaultValue": "",
              "description": "Provide an octicon. It will be placed in the center of the button"
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "description": "Use an aria label to describe the functionality of the button. Please refer to [our guidance on alt text](https://primer.style/guides/accessibility/alternative-text-for-images) for tips on writing good alternative text."
            }
          ],
          "passthrough": {
            "element": "IconButton",
            "url": "/react/IconButton"
          }
        },
        {
          "name": "ActionBar.Divider",
          "props": []
        }
      ]
    },
    "action_list": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ActionList",
      "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\" size=\"small\">\n      Filter by\n    </ActionList.Heading>\n    <ActionList.Group>\n      <ActionList.GroupHeading as=\"h3\">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=\"h3\">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      {/* menuitem because state is inactive */}\n      <ActionList.Item\n        role=\"menuitem\"\n        selected={false}\n        inactiveText=\"Unavailable due to an outage\"\n      >\n        Inactive item\n      </ActionList.Item>\n      <ActionList.Item\n        role=\"menuitemradio\"\n        selected={selectedIndex === 1}\n        aria-checked={selectedIndex === 1}\n        onSelect={() => setSelectedIndex(1)}\n      >\n        Item 2\n      </ActionList.Item>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--multi-select",
          "code": "() => {\n  const [selectedIndices, setSelectedIndices] = React.useState<number[]>([0])\n  const handleSelect = (index: number) => {\n    if (selectedIndices.includes(index)) {\n      setSelectedIndices(selectedIndices.filter((i) => i !== index))\n    } else {\n      setSelectedIndices([...selectedIndices, index])\n    }\n  }\n  return (\n    <ActionList\n      selectionVariant=\"multiple\"\n      showDividers\n      role=\"menu\"\n      aria-label=\"Project\"\n    >\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          role=\"menuitemcheckbox\"\n          selected={selectedIndices.includes(index)}\n          aria-checked={selectedIndices.includes(index)}\n          onSelect={() => handleSelect(index)}\n          disabled={index === 3 ? true : undefined}\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--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 role=\"menu\" 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--with-dynamic-content",
          "code": "() => {\n  const [isTrue, setIsTrue] = React.useState(false)\n  return (\n    <FeatureFlags\n      flags={{\n        primer_react_action_list_item_as_button: true,\n      }}\n    >\n      <ActionList>\n        <ActionList.Item\n          onSelect={() => {\n            setIsTrue(!isTrue)\n          }}\n        >\n          Activated? {isTrue ? 'Yes' : 'No'}\n        </ActionList.Item>\n      </ActionList>\n    </FeatureFlags>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--disabled-selected-multiselect",
          "code": "() => (\n  <ActionList selectionVariant=\"multiple\" role=\"menu\" aria-label=\"Project\">\n    <ActionList.Item role=\"menuitemcheckbox\" selected aria-checked disabled>\n      Selected disabled item\n    </ActionList.Item>\n    <ActionList.Item\n      role=\"menuitemcheckbox\"\n      selected={false}\n      aria-checked={false}\n    >\n      Item 2\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--disabled-multiselect",
          "code": "() => (\n  <ActionList selectionVariant=\"multiple\" role=\"menu\" aria-label=\"Project\">\n    <ActionList.Item\n      role=\"menuitemcheckbox\"\n      selected={false}\n      aria-checked={false}\n      disabled\n    >\n      Disabled item\n    </ActionList.Item>\n    <ActionList.Item\n      role=\"menuitemcheckbox\"\n      selected={false}\n      aria-checked={false}\n    >\n      Item 2\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--inactive-multiselect",
          "code": "() => {\n  const [selectedIndices, setSelectedIndices] = React.useState<number[]>([0])\n  const handleSelect = (index: number) => {\n    if (selectedIndices.includes(index)) {\n      setSelectedIndices(selectedIndices.filter((i) => i !== index))\n    } else {\n      setSelectedIndices([...selectedIndices, index])\n    }\n  }\n  return (\n    <ActionList selectionVariant=\"multiple\" role=\"menu\" aria-label=\"Project\">\n      {/* menuitem because state is inactive */}\n      <ActionList.Item\n        role=\"menuitem\"\n        selected={false}\n        inactiveText=\"Unavailable due to an outage\"\n      >\n        Inactive item\n      </ActionList.Item>\n      <ActionList.Item\n        role=\"menuitemcheckbox\"\n        selected={selectedIndices.includes(1)}\n        aria-checked={selectedIndices.includes(1)}\n        onSelect={() => handleSelect(1)}\n      >\n        Item 2\n      </ActionList.Item>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--disabled-item",
          "code": "() => {\n  const [selectedIndex, setSelectedIndex] = React.useState(0)\n  return (\n    <ActionList\n      selectionVariant=\"single\"\n      showDividers\n      role=\"menu\"\n      aria-label=\"Project\"\n    >\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          role=\"menuitemradio\"\n          selected={index === selectedIndex}\n          aria-checked={index === selectedIndex}\n          onSelect={() => setSelectedIndex(index)}\n          disabled={index === 1}\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--inactive-item",
          "code": "() => {\n  return (\n    <ActionList aria-label=\"Project\">\n      {projects.map((project, index) => (\n        <ActionList.Item\n          key={index}\n          inactiveText={\n            index === 1 ? 'Unavailable due to an outage' : undefined\n          }\n        >\n          <ActionList.LeadingVisual>\n            <TableIcon />\n          </ActionList.LeadingVisual>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--loading-item",
          "code": "() => {\n  return (\n    <ActionList aria-label=\"Project\">\n      {projects.map((project, index) => (\n        <ActionList.Item key={index} loading={index === 1}>\n          {project.name}\n          <ActionList.Description variant=\"block\">\n            {project.scope}\n          </ActionList.Description>\n        </ActionList.Item>\n      ))}\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--links",
          "code": "() => (\n  <ActionList>\n    <ActionList.Heading\n      as=\"h1\"\n      sx={{\n        fontSize: 1,\n      }}\n    >\n      Details\n    </ActionList.Heading>\n    <ActionList.LinkItem href=\"https://github.com/primer/react#readme\">\n      <ActionList.LeadingVisual>\n        <BookIcon />\n      </ActionList.LeadingVisual>\n      Readme\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/blob/main/LICENSE\">\n      <ActionList.LeadingVisual>\n        <LawIcon />\n      </ActionList.LeadingVisual>\n      MIT License\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/stargazers\">\n      <ActionList.LeadingVisual>\n        <StarIcon />\n      </ActionList.LeadingVisual>\n      <strong>1.5k</strong> stars\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/watchers\">\n      <ActionList.LeadingVisual>\n        <EyeIcon />\n      </ActionList.LeadingVisual>\n      <strong>21</strong> watching\n    </ActionList.LinkItem>\n    <ActionList.LinkItem href=\"https://github.com/primer/react/network/members\">\n      <ActionList.LeadingVisual>\n        <RepoForkedIcon />\n      </ActionList.LeadingVisual>\n      <strong>225</strong> forks\n    </ActionList.LinkItem>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--custom-item-children",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <ArrowRightIcon />\n      </ActionList.LeadingVisual>\n      <Label>Choose this one</Label>\n      <ActionList.TrailingVisual>\n        <ArrowLeftIcon />\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--text-wrap-and-truncation",
          "code": "() => (\n  <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 truncate>\n          This description gets truncated because it is inline with truncation\n        </ActionList.Description>\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        Inline Description\n        <ActionList.Description>\n          This description wraps because it is inline without truncation\n        </ActionList.Description>\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        Really long text without a description should wrap so it wraps\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n      <ActionList.Item>\n        <ActionList.LeadingVisual>\n          <ArrowRightIcon />\n        </ActionList.LeadingVisual>\n        SomethingSomething/SomethingElse.Some.Thing.Lalala.la\n        <ActionList.TrailingVisual>\n          <ArrowLeftIcon />\n        </ActionList.TrailingVisual>\n      </ActionList.Item>\n    </ActionList>\n  </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) => (\n        <button type=\"button\" {...props}>\n          toggle overlay\n        </button>\n      )}\n    >\n      <ActionList role=\"menu\">\n        <ActionList.Item role=\"menuitem\">\n          Use your arrow keys\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item role=\"menuitem\">\n          keep going\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item role=\"menuitem\">\n          more more\n          <ActionList.TrailingVisual>↓</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Item variant=\"danger\" role=\"menuitem\">\n          now go up!\n          <ActionList.TrailingVisual>↑</ActionList.TrailingVisual>\n        </ActionList.Item>\n      </ActionList>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--group-with-subtle-title",
          "code": "() => {\n  const [assignees, setAssignees] = React.useState(users.slice(0, 1))\n  const toggleAssignee = (assignee: (typeof users)[number]) => {\n    const assigneeIndex = assignees.findIndex((a) => a.login === assignee.login)\n    if (assigneeIndex === -1) setAssignees([...assignees, assignee])\n    else setAssignees(assignees.filter((_, index) => index !== assigneeIndex))\n  }\n  return (\n    <ActionList\n      selectionVariant=\"multiple\"\n      role=\"menu\"\n      showDividers\n      aria-label=\"Reviewers\"\n    >\n      <ActionList.Group>\n        <ActionList.GroupHeading>Everyone</ActionList.GroupHeading>\n        {users.slice(2).map((user) => (\n          <ActionList.Item\n            role=\"menuitemcheckbox\"\n            key={user.login}\n            selected={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            aria-checked={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            onSelect={() => toggleAssignee(user)}\n          >\n            <ActionList.LeadingVisual>\n              <Avatar src={`https://github.com/${user.login}.png`} />\n            </ActionList.LeadingVisual>\n            {user.login}\n            <ActionList.Description>{user.name}</ActionList.Description>\n          </ActionList.Item>\n        ))}\n      </ActionList.Group>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--group-with-filled-title",
          "code": "() => {\n  const [assignees, setAssignees] = React.useState(users.slice(0, 1))\n  const toggleAssignee = (assignee: (typeof users)[number]) => {\n    const assigneeIndex = assignees.findIndex((a) => a.login === assignee.login)\n    if (assigneeIndex === -1) setAssignees([...assignees, assignee])\n    else setAssignees(assignees.filter((_, index) => index !== assigneeIndex))\n  }\n  return (\n    <ActionList\n      selectionVariant=\"multiple\"\n      role=\"menu\"\n      showDividers\n      aria-label=\"Reviewers\"\n    >\n      <ActionList.Group>\n        <ActionList.GroupHeading variant=\"filled\">\n          Everyone\n        </ActionList.GroupHeading>\n        {users.slice(2).map((user) => (\n          <ActionList.Item\n            role=\"menuitemcheckbox\"\n            key={user.login}\n            selected={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            aria-checked={Boolean(\n              assignees.find((assignee) => assignee.login === user.login),\n            )}\n            onSelect={() => toggleAssignee(user)}\n          >\n            <ActionList.LeadingVisual>\n              <Avatar src={`https://github.com/${user.login}.png`} />\n            </ActionList.LeadingVisual>\n            {user.login}\n            <ActionList.Description>{user.name}</ActionList.Description>\n          </ActionList.Item>\n        ))}\n      </ActionList.Group>\n    </ActionList>\n  )\n}"
        },
        {
          "id": "components-actionlist-features--with-custom-trailing-visuals",
          "code": "() => (\n  <ActionList>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <IssueOpenedIcon />\n      </ActionList.LeadingVisual>\n      Issues\n      <ActionList.TrailingVisual>\n        <CounterLabel>20</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <GitPullRequestIcon />\n      </ActionList.LeadingVisual>\n      PRs\n      <ActionList.TrailingVisual>\n        <CounterLabel>12</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n    <ActionList.Item>\n      <ActionList.LeadingVisual>\n        <ProjectIcon />\n      </ActionList.LeadingVisual>\n      Projects\n      <ActionList.TrailingVisual>\n        <CounterLabel>2</CounterLabel>\n      </ActionList.TrailingVisual>\n    </ActionList.Item>\n  </ActionList>\n)"
        },
        {
          "id": "components-actionlist-features--full-variant",
          "code": "() => (\n  <ActionList variant=\"full\">\n    <ActionList.Item>Copy link</ActionList.Item>\n    <ActionList.Item>Quote reply</ActionList.Item>\n    <ActionList.Item>Edit comment</ActionList.Item>\n    <ActionList.Divider />\n    <ActionList.Item variant=\"danger\">Delete file</ActionList.Item>\n  </ActionList>\n)"
        }
      ],
      "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": "showDividers",
          "type": "boolean",
          "description": "Display a divider above each `Item` in this `List` when it does not follow a `Header` or `Divider`.",
          "defaultValue": ""
        },
        {
          "name": "role",
          "type": "AriaRole",
          "defaultValue": "",
          "description": "ARIA role describing the function of the list. `listbox` and `menu` are a common values."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "ActionList.Item",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode | ActionList.LeadingVisual | ActionList.Description | ActionList.TrailingVisual",
              "defaultValue": "",
              "required": true,
              "description": "Primary content for an Item"
            },
            {
              "name": "variant",
              "type": "'default' | 'danger'",
              "defaultValue": "'default'",
              "description": "`danger` indicates that the item is destructive."
            },
            {
              "name": "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": "loading",
              "type": "boolean",
              "description": "Whether the item is loading."
            },
            {
              "name": "role",
              "type": "AriaRole",
              "defaultValue": "",
              "description": "ARIA role describing the function of the item. `option` is a common value."
            },
            {
              "name": "id",
              "type": "string",
              "required": false,
              "description": "id to attach to the root element of the Item",
              "defaultValue": ""
            },
            {
              "name": "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": "visuallyHidden",
              "type": "boolean",
              "required": false,
              "description": "",
              "defaultValue": ""
            },
            {
              "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": "inactiveText",
              "type": "string",
              "required": false,
              "description": "Text describing why the item is inactive. This may be used when an item's usual functionality\nis unavailable due to a system error such as a database outage.",
              "defaultValue": ""
            },
            {
              "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.TrailingAction",
          "props": [
            {
              "name": "as",
              "type": "a | button",
              "defaultValue": "button",
              "required": false,
              "description": "HTML element to render as."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Acccessible name for the control."
            },
            {
              "name": "icon",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Octicon to pass into IconButton. When this is not set, TrailingAction renders as a `Button` instead of an `IconButton`."
            },
            {
              "name": "href",
              "type": "string",
              "description": "href when the TrailingAction is rendered as a link."
            }
          ]
        },
        {
          "name": "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": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the inline description should truncate the text on overflow."
            }
          ]
        },
        {
          "name": "ActionList.GroupHeading",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Use to give a heading to the groups"
            },
            {
              "name": "variant",
              "type": "'filled' | 'subtle'",
              "defaultValue": "'subtle'",
              "description": "`filled` style has a background color and top and bottom borders. Subtle style has no background or borders."
            },
            {
              "name": "auxiliaryText",
              "type": "string",
              "required": false,
              "description": "Secondary text which provides additional information about a `Group`.",
              "defaultValue": ""
            },
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "required": false,
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "as",
              "type": "h1 | h2 | h3 | h4 | h5 | h6",
              "defaultValue": "h3",
              "required": false,
              "description": "The level of the heading and it is only required (enforce by runtime warning) for lists. (i.e. not required for ActionMenu or listbox roles)"
            },
            {
              "name": "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"
            }
          ]
        },
        {
          "filePath": "/Users/mperrotti/work-dir/react/packages/react/src/ActionList/Divider.tsx",
          "name": "ActionList.Divider",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "action_menu": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ActionMenu",
      "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--loading-items",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Button>Open menu</ActionMenu.Button>\n    <ActionMenu.Overlay width=\"auto\">\n      <ActionList>\n        <ActionList.Item onSelect={() => alert('Workflows clicked')} loading>\n          Workflows\n          <ActionList.LeadingVisual>\n            <WorkflowIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Item\n          onSelect={() => alert('Archived items clicked')}\n          loading\n        >\n          Archived items\n          <ActionList.LeadingVisual>\n            <ArchiveIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Make a copy clicked')} loading>\n          Make a copy\n          <ActionList.LeadingVisual>\n            <CopyIcon />\n          </ActionList.LeadingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Group>\n          <ActionList.GroupHeading>Github projects</ActionList.GroupHeading>\n          <ActionList.LinkItem href=\"/\">\n            What&apos;s new\n            <ActionList.LeadingVisual>\n              <RocketIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            Give feedback\n            <ActionList.LeadingVisual>\n              <CommentIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n          <ActionList.LinkItem href=\"/\">\n            GitHub Docs\n            <ActionList.LeadingVisual>\n              <BookIcon />\n            </ActionList.LeadingVisual>\n          </ActionList.LinkItem>\n        </ActionList.Group>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        },
        {
          "id": "components-actionmenu-features--submenus",
          "code": "() => (\n  <ActionMenu>\n    <ActionMenu.Button>Edit</ActionMenu.Button>\n    <ActionMenu.Overlay>\n      <ActionList>\n        <ActionList.Item>Cut</ActionList.Item>\n        <ActionList.Item>Copy</ActionList.Item>\n        <ActionList.Item>Paste</ActionList.Item>\n        <ActionMenu>\n          <ActionMenu.Anchor>\n            <ActionList.Item>\n              <ActionList.LeadingVisual>\n                <SparkleFillIcon />\n              </ActionList.LeadingVisual>\n              Paste special\n            </ActionList.Item>\n          </ActionMenu.Anchor>\n          <ActionMenu.Overlay>\n            <ActionList>\n              <ActionList.Item>Paste plain text</ActionList.Item>\n              <ActionList.Item>Paste formulas</ActionList.Item>\n              <ActionList.Item>Paste with formatting</ActionList.Item>\n              <ActionMenu>\n                <ActionMenu.Anchor>\n                  <ActionList.Item>Paste from</ActionList.Item>\n                </ActionMenu.Anchor>\n                <ActionMenu.Overlay>\n                  <ActionList>\n                    <ActionList.Item>Current clipboard</ActionList.Item>\n                    <ActionList.Item>History</ActionList.Item>\n                    <ActionList.Item>Another device</ActionList.Item>\n                  </ActionList>\n                </ActionMenu.Overlay>\n              </ActionMenu>\n            </ActionList>\n          </ActionMenu.Overlay>\n        </ActionMenu>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "React.ReactElement[]",
          "defaultValue": "",
          "required": true,
          "description": "Recommended: `ActionMenu.Button` or `ActionMenu.Anchor` with `ActionMenu.Overlay`"
        },
        {
          "name": "open",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If defined, will control the open/closed state of the overlay. Must be used in conjuction with `onOpenChange`."
        },
        {
          "name": "onOpenChange",
          "type": "(open: boolean) => void",
          "defaultValue": "",
          "description": "If defined, will control the open/closed state of the overlay. Must be used in conjuction with `open`."
        },
        {
          "name": "anchorRef",
          "type": "React.RefObject<HTMLElement>",
          "defaultValue": "",
          "description": "Useful for defining an external anchor"
        }
      ],
      "subcomponents": [
        {
          "name": "ActionMenu.Button",
          "props": [
            {
              "name": "children",
              "type": "React.ReactElement",
              "defaultValue": "",
              "required": true,
              "description": ""
            }
          ],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        },
        {
          "name": "ActionMenu.Anchor",
          "props": [
            {
              "name": "children",
              "type": "React.ReactElement",
              "defaultValue": "",
              "required": true,
              "description": "Accepts a single child element"
            },
            {
              "name": "id",
              "type": "string",
              "description": "",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "ActionMenu.Overlay",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": ""
            },
            {
              "name": "align",
              "type": "start | center | end",
              "defaultValue": "start",
              "description": ""
            },
            {
              "name": "side",
              "type": "| 'inside-top' | 'inside-bottom' | 'inside-left' | 'inside-right' | 'inside-center' | 'outside-top' | 'outside-bottom' | 'outside-left' | 'outside-right'",
              "defaultValue": "'outside-bottom'",
              "description": "Controls which side of the anchor the menu will appear"
            },
            {
              "name": "data-test-id",
              "type": "unknown",
              "required": false,
              "description": "ID to use for React testing utilities.",
              "defaultValue": ""
            }
          ],
          "passthrough": {
            "element": "Overlay",
            "url": "/react/Overlay"
          }
        }
      ]
    },
    "anchored_overlay": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/AnchoredOverlay",
      "id": "anchored_overlay",
      "name": "AnchoredOverlay",
      "status": "alpha",
      "a11yReviewed": 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      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      {hoverCard}\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--portal-inside-scrolling-element",
          "code": "(args: Args) => {\n  const rows = 20\n  const columns = 10\n  return (\n    <HeaderAndLayout>\n      <table>\n        <tbody>\n          {Array(rows)\n            .fill(null)\n            .map((_, i) => (\n              <tr key={i}>\n                {Array(columns)\n                  .fill(null)\n                  .map((_1, j) => (\n                    <td key={`${i}${j}`}>\n                      <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}"
        },
        {
          "id": "components-anchoredoverlay-features--custom-anchor-id",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      anchorId=\"my-custom-anchor-id\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--height",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      height=\"large\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--width",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      width=\"large\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--anchor-alignment",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => (\n        <Button {...props} block>\n          Button\n        </Button>\n      )}\n      align=\"center\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--anchor-side",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      side=\"outside-right\"\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--offset-position-from-anchor",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      anchorOffset={100}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--offset-alignment-from-anchor",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      alignmentOffset={100}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--focus-trap-overrides",
          "code": "() => {\n  const initialFocusRef = useRef<HTMLButtonElement>(null)\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      focusTrapSettings={{\n        initialFocusRef,\n      }}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'Focus Trap Demo Overlay',\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <Button>First button</Button>\n      <Button ref={initialFocusRef}>Initial focus</Button>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--focus-zone-overrides",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      focusZoneSettings={{\n        bindKeys: FocusKeys.JK,\n      }}\n      overlayProps={{\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'Focus Zone Demo Overlay',\n      }}\n      preventOverflow={false}\n    >\n      <p>\n        Use <kbd>J</kbd> and <kbd>K</kbd> keys to move focus.\n      </p>\n      <Button>First</Button>\n      <Button>Second</Button>\n      <Button>Third</Button>\n    </AnchoredOverlay>\n  )\n}"
        },
        {
          "id": "components-anchoredoverlay-features--overlay-props-overrides",
          "code": "() => {\n  const [open, setOpen] = useState(false)\n  return (\n    <AnchoredOverlay\n      open={open}\n      onOpen={() => setOpen(true)}\n      onClose={() => setOpen(false)}\n      renderAnchor={(props) => <Button {...props}>Button</Button>}\n      overlayProps={{\n        overflow: 'auto',\n        maxHeight: 'xsmall',\n        role: 'dialog',\n        'aria-modal': true,\n        'aria-label': 'User Card Overlay',\n        sx: {\n          minWidth: '320px',\n        },\n      }}\n      focusZoneSettings={{\n        disabled: true,\n      }}\n      preventOverflow={false}\n    >\n      <div>Overlay props have been overridden to set: </div>\n      <pre>\n        <li>overflow: `auto`</li>\n        <li>maxHeight: `xsmall`</li>\n      </pre>\n      <Box\n        sx={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n        {hoverCard}\n      </Box>\n    </AnchoredOverlay>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "open",
          "type": "boolean",
          "required": true,
          "defaultValue": "false",
          "description": "Determines whether the overlay portion of the component should be shown or not."
        },
        {
          "name": "onOpen",
          "type": "(gesture: 'anchor-click' | 'anchor-key-press', event?: KeyboardEvent<HTMLElement> | undefined) => unknown",
          "defaultValue": "",
          "description": "A callback that is called whenever the overlay is currently closed and an \"open gesture\" is detected."
        },
        {
          "name": "onClose",
          "type": "(gesture: 'anchor-click' | 'click-outside' | 'escape') => unknown",
          "defaultValue": "",
          "description": "A callback that is called whenever the overlay is currently open and a \"close gesture\" is detected."
        },
        {
          "name": "renderAnchor",
          "type": "<T extends React.HTMLAttributes<HTMLElement>>(props: T) => JSX.Element",
          "defaultValue": "",
          "description": "A custom function component used to render the anchor element. When renderAnchor is null, an anchorRef is required."
        },
        {
          "name": "anchorRef",
          "type": "React.RefObject<HTMLElement>",
          "defaultValue": "",
          "description": "An override to the internal `renderAnchor` ref that will be used to position the overlay. When `renderAnchor` is `null`, this can be used to make an anchor that is detached from ` AnchoredOverlay `."
        },
        {
          "name": "anchorId",
          "type": "string",
          "defaultValue": "",
          "description": "An override to the internal id that will be passed to the anchor."
        },
        {
          "name": "side",
          "type": "| 'inside-top' | 'inside-bottom' | 'inside-left' | 'inside-right' | 'inside-center' | 'outside-top' | 'outside-bottom' | 'outside-left' | 'outside-right'",
          "defaultValue": "'outside-bottom'",
          "description": ""
        },
        {
          "name": "align",
          "type": "'start' | 'center' | 'end'",
          "defaultValue": "'start'",
          "description": ""
        },
        {
          "name": "alignmentOffset",
          "type": "number",
          "defaultValue": "4",
          "description": "An additional offset, in pixels, to move the floating element from the aligning edge. Positive values move the floating element in the direction of center-alignment. Negative values move the floating element away from center-alignment. When align is `'center`, positive offsets move the floating element right (top or bottom anchor side) or down (left or right anchor side). If using outside positioning, or if `align` is set to `'center'`, this defaults to `0` instead of `4`."
        },
        {
          "name": "anchorOffset",
          "type": "number",
          "defaultValue": "4",
          "description": "The number of pixels between the anchor edge and the floating element. Positive values move the floating element farther from the anchor element (for outside positioning) or further inside the anchor element (for inside positioning). Negative values have the opposite effect. If `side` is set to `'inside-center'`, this defaults to `0` instead of `4`."
        },
        {
          "name": "overlayProps",
          "type": "Partial<OverlayProps>",
          "defaultValue": "",
          "description": "Props to be spread on the internal `Overlay` component."
        },
        {
          "name": "focusTrapSettings",
          "type": "Partial<FocusTrapHookSettings>",
          "defaultValue": "",
          "description": "Settings to apply to the focus trap on the internal `Overlay` component."
        },
        {
          "name": "focusZoneSettings",
          "type": "Partial<FocusZoneHookSettings>",
          "defaultValue": "",
          "description": "Settings to apply to the focus zone on the internal `Overlay` component."
        },
        {
          "name": "className",
          "type": "string",
          "defaultValue": "",
          "description": "Class name for custom styling."
        },
        {
          "name": "preventOverflow",
          "type": "boolean",
          "defaultValue": "true",
          "description": "Determines if the Overlay width should be adjusted responsively if there is not enough space to display the Overlay. If `preventOverflow` is set to `false`, the Overlay will be displayed at the maximum width that fits within the viewport."
        },
        {
          "name": "height",
          "type": "'small' | 'initial' | 'large' | 'medium' | 'auto' | 'fit-content' | 'xsmall' | 'xlarge'",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "width",
          "type": "'small' | 'large' | 'medium' | 'auto' | 'xlarge' | 'xxlarge'",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "pinPosition",
          "type": "boolean",
          "required": false,
          "description": "If true, the overlay will attempt to prevent position shifting when sitting at the top of the anchor.",
          "defaultValue": "false"
        }
      ]
    },
    "autocomplete": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Autocomplete",
      "id": "autocomplete",
      "name": "Autocomplete",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-autocomplete--default",
          "code": "() => {\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n      onSubmit={(event) => event.preventDefault()}\n    >\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel-default\">\n          Label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              selectedItemIds={[]}\n              aria-labelledby=\"autocompleteLabel-default\"\n              items={items}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--with-token-input",
          "code": "() => {\n  const [tokens, setTokens] = useState<Datum[]>([])\n  const selectedTokenIds = tokens.map((token) => token.id)\n  const [selectedItemIds, setSelectedItemIds] =\n    useState<Array<string>>(selectedTokenIds)\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n    setSelectedItemIds(selectedItemIds.filter((id) => id !== tokenId))\n  }\n  const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n    if (!Array.isArray(newlySelectedItems)) {\n      return\n    }\n    setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n    if (newlySelectedItems.length < selectedItemIds.length) {\n      const newlySelectedItemIds = newlySelectedItems.map(({ id }) => id)\n      const removedItemIds = selectedTokenIds.filter(\n        (id) => !newlySelectedItemIds.includes(id),\n      )\n      for (const removedItemId of removedItemIds) {\n        onTokenRemove(removedItemId)\n      }\n      return\n    }\n    setTokens(\n      newlySelectedItems.map(({ id, text }) => ({\n        id,\n        text,\n      })),\n    )\n  }\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input\n            as={TextInputTokens}\n            tokens={tokens}\n            onTokenRemove={onTokenRemove}\n            block\n          />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={selectedItemIds}\n              onSelectedChange={onSelectedChange}\n              selectionVariant=\"multiple\"\n              aria-labelledby=\"autocompleteLabel\"\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--add-new-item",
          "code": "() => {\n  const [inputValue, setInputValue] = React.useState<string>('')\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel-add-new\">\n          Label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input\n            value={inputValue}\n            onChange={(e) => {\n              setInputValue(e.currentTarget.value)\n            }}\n          />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              selectedItemIds={[]}\n              aria-labelledby=\"autocompleteLabel-add-new\"\n              addNewItem={\n                inputValue &&\n                !items.map((item) => item.text).includes(inputValue)\n                  ? {\n                      text: inputValue,\n                      id: inputValue,\n                      // `handleAddItem` callback isn't needed for this specific example,\n                      // but it's included here to show that it exists\n                      handleAddItem: (selectedItem) => {\n                        // eslint-disable-next-line no-console\n                        console.log('added item:', selectedItem)\n                        return\n                      },\n                    }\n                  : undefined\n              }\n              items={items}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-search-filter-fn",
          "code": "() => {\n  const [filterVal, setFilterVal] = useState<string>('')\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n    setFilterVal(e.currentTarget.value)\n  }\n  const customFilterFn = (item: Datum) => item.text.includes(filterVal)\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input onChange={handleChange} />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={[]}\n              filterFn={customFilterFn}\n              aria-labelledby=\"autocompleteLabel\"\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n        <FormControl.Caption>\n          Items in dropdown are filtered if their text has no part that matches\n          the input value\n        </FormControl.Caption>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-sort-after-menu-close",
          "code": "() => {\n  const [selectedItemIds, setSelectedItemIds] = useState<Array<string>>([])\n  const isItemSelected = (itemId: string) => selectedItemIds.includes(itemId)\n  const onSelectedChange = (newlySelectedItems: Datum | Datum[]) => {\n    if (!Array.isArray(newlySelectedItems)) {\n      return\n    }\n    setSelectedItemIds(newlySelectedItems.map((item) => item.id))\n  }\n  const customSortFn = (itemIdA: string, itemIdB: string) =>\n    isItemSelected(itemIdA) === isItemSelected(itemIdB)\n      ? 0\n      : isItemSelected(itemIdA)\n        ? 1\n        : -1\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={selectedItemIds}\n              onSelectedChange={onSelectedChange}\n              sortOnCloseFn={customSortFn}\n              aria-labelledby=\"autocompleteLabel\"\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n        <FormControl.Caption>\n          When the dropdown closes, selected items are sorted to the end\n        </FormControl.Caption>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--with-callback-when-overlay-open-state-changes",
          "code": "() => {\n  const [isMenuOpen, setIsMenuOpen] = useState<boolean>(false)\n  const onOpenChange = (isOpen: boolean) => {\n    setIsMenuOpen(isOpen)\n  }\n  return (\n    <Stack as=\"form\" padding=\"normal\">\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              items={items}\n              selectedItemIds={[]}\n              onOpenChange={onOpenChange}\n              aria-labelledby=\"autocompleteLabel\"\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n      <div>\n        The menu is <strong>{isMenuOpen ? 'opened' : 'closed'}</strong>\n      </div>\n    </Stack>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--async-loading-of-items",
          "code": "(args: FormControlArgs<AutocompleteArgs>) => {\n  const { parentArgs, labelArgs, captionArgs, validationArgs } =\n    getFormControlArgsByChildComponent(args)\n  const { menuArgs, overlayArgs, textInputArgs } = getArgsByChildComponent(args)\n  const [loadedItems, setLoadedItems] = useState<Datum[]>([])\n  const onOpenChange = (isOpen: boolean) => {\n    if (isOpen) {\n      setTimeout(() => {\n        setLoadedItems(items)\n      }, 1500)\n    }\n  }\n  return (\n    <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": "() => {\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl>\n        <FormControl.Label id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input />\n          <Autocomplete.Menu\n            items={items}\n            selectedItemIds={[]}\n            aria-labelledby=\"autocompleteLabel\"\n          />\n        </Autocomplete>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--custom-overlay-menu-anchor",
          "code": "() => {\n  const menuAnchorRef = useRef<HTMLElement>(null)\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      <FormControl>\n        <FormControl.Label htmlFor=\"autocompleteInput\" id=\"autocompleteLabel\">\n          Default label\n        </FormControl.Label>\n        <Box\n          ref={menuAnchorRef as React.RefObject<HTMLDivElement>}\n          sx={{\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        >\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            />\n            <Autocomplete.Overlay menuAnchorRef={menuAnchorRef}>\n              <Autocomplete.Menu\n                items={items}\n                selectedItemIds={[]}\n                aria-labelledby=\"autocompleteLabel\"\n              />\n            </Autocomplete.Overlay>\n          </Autocomplete>\n        </Box>\n        <FormControl.Caption>\n          The overlay menu position is anchored to the div with the black border\n          instead of to the text input\n        </FormControl.Caption>\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--in-overlay-with-custom-scroll-container-ref",
          "code": "() => {\n  const scrollContainerRef = useRef<HTMLElement>(null)\n  const inputRef = useRef<HTMLInputElement>(null)\n  const triggerRef = useRef<HTMLButtonElement>(null)\n  const [isOpen, setIsOpen] = useState(false)\n  const [selectedItem, setSelectedItem] = useState<Datum>()\n  const handleOpen = () => {\n    setIsOpen(true)\n    inputRef.current && inputRef.current.focus()\n  }\n  const selectChange = (item: Datum[] | Datum) => {\n    setIsOpen(false)\n    if (Array.isArray(item) && item.length) setSelectedItem(item[0])\n    triggerRef.current?.focus()\n  }\n  return (\n    <Box\n      as=\"form\"\n      sx={{\n        p: 3,\n      }}\n    >\n      Selected item: {selectedItem ? selectedItem.text : 'none'}\n      <AnchoredOverlay\n        open={isOpen}\n        onOpen={handleOpen}\n        onClose={() => setIsOpen(false)}\n        width=\"large\"\n        focusTrapSettings={{\n          initialFocusRef: inputRef,\n        }}\n        side=\"inside-top\"\n        anchorRef={triggerRef}\n        renderAnchor={(props) => <Button {...props}>open overlay</Button>}\n      >\n        <Autocomplete>\n          <Box\n            sx={{\n              display: 'flex',\n              flexDirection: 'column',\n              height: '100%',\n            }}\n          >\n            <Box\n              sx={{\n                borderWidth: 0,\n                borderBottomWidth: 1,\n                borderColor: 'var(--borderColor-default)',\n                borderStyle: 'solid',\n              }}\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                block\n                aria-label=\"Search\"\n              />\n            </Box>\n            <Box\n              ref={scrollContainerRef as RefObject<HTMLDivElement>}\n              sx={{\n                overflow: 'auto',\n                flexGrow: 1,\n              }}\n            >\n              <Autocomplete.Menu\n                items={items}\n                selectedItemIds={[]}\n                customScrollContainerRef={scrollContainerRef}\n                aria-labelledby=\"autocompleteLabel\"\n                onSelectedChange={selectChange}\n              />\n            </Box>\n          </Box>\n        </Autocomplete>\n      </AnchoredOverlay>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-autocomplete-features--in-a-dialog",
          "code": "() => {\n  const outerContainerRef = useRef<HTMLDivElement>(null)\n  const [mounted, setMounted] = useState(false)\n  const [isDialogOpen, setIsDialogOpen] = useState(false)\n  useEffect(() => {\n    if (outerContainerRef.current instanceof HTMLElement) {\n      registerPortalRoot(outerContainerRef.current, 'outerContainer')\n      setMounted(true)\n    }\n  }, [isDialogOpen])\n  return (\n    <>\n      <Button onClick={() => setIsDialogOpen(true)}>Show dialog</Button>\n      <Dialog\n        aria-label=\"Dialog with autocomplete\"\n        id=\"dialog-with-autocomplete\"\n        isOpen={isDialogOpen}\n        onDismiss={() => setIsDialogOpen(false)}\n      >\n        <div ref={outerContainerRef}>\n          <Box\n            as=\"form\"\n            sx={{\n              p: 3,\n            }}\n          >\n            {mounted ? (\n              <FormControl>\n                <FormControl.Label id=\"autocompleteLabel\">\n                  Default label\n                </FormControl.Label>\n                <Autocomplete>\n                  <Autocomplete.Input data-testid=\"autocompleteInput\" />\n                  <Autocomplete.Overlay portalContainerName=\"outerContainer\">\n                    <Autocomplete.Menu\n                      items={items}\n                      selectedItemIds={[]}\n                      aria-labelledby=\"autocompleteLabel\"\n                    />\n                  </Autocomplete.Overlay>\n                </Autocomplete>\n              </FormControl>\n            ) : null}\n          </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"
        },
        {
          "name": "id",
          "type": "string",
          "description": "May be used to customize how the ID is set on the text input to be used by ARIA attributes on related elements.",
          "defaultValue": ""
        }
      ],
      "subcomponents": [
        {
          "name": "Autocomplete.Input",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "TextInput"
            },
            {
              "name": "openOnFocus",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether the associated autocomplete menu should open on an input focus event",
              "deprecated": true
            }
          ],
          "passthrough": {
            "element": "TextInput",
            "url": "/react/TextInput"
          }
        },
        {
          "name": "Autocomplete.Overlay",
          "props": [
            {
              "name": "menuAnchorRef",
              "type": "React.RefObject<HTMLElement>"
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "overlayProps",
              "deprecated": true,
              "type": "Partial<OverlayProps>",
              "description": "Props to be spread on the internal `Overlay` component."
            }
          ],
          "passthrough": {
            "element": "Overlay",
            "url": "/react/Overlay"
          }
        },
        {
          "name": "Autocomplete.Menu",
          "props": [
            {
              "name": "items",
              "required": true,
              "type": "T[]",
              "description": "The options for field values that are displayed in the dropdown menu. One or more may be selected depending on the value of the `selectionVariant` prop."
            },
            {
              "name": "selectedItemIds",
              "required": true,
              "type": "string[]",
              "description": "The IDs of the selected items"
            },
            {
              "name": "aria-labelledby",
              "required": true,
              "type": "string"
            },
            {
              "name": "addNewItem",
              "type": "Omit<T, 'id' | 'leadingVisual' | 'onAction'> & { handleAddItem: (item: Omit<T, 'leadingVisual' | 'onAction'>) => void; }",
              "description": "A menu item that is used to allow users make a selection that is not available in the array passed to the `items` prop. This menu item gets appended to the end of the list of options."
            },
            {
              "name": "emptyStateText",
              "type": "React.ReactNode | false",
              "description": "The text that appears in the menu when there are no options in the array passed to the `items` prop."
            },
            {
              "name": "filterFn",
              "type": "(item: T, i: number) => boolean",
              "description": "A custom function used to filter the options in the array passed to the `items` prop. By default, we filter out items that don't match the value of the autocomplete text input. The default filter is not case-sensitive."
            },
            {
              "name": "loading",
              "type": "boolean",
              "description": "Whether the data is loading for the menu items"
            },
            {
              "name": "sortOnCloseFn",
              "type": "(itemIdA: string | number, itemIdB: string | number) => number",
              "description": "The sort function that is applied to the options in the array passed to the `items` prop after the user closes the menu. By default, selected items are sorted to the top after the user closes the menu."
            },
            {
              "name": "selectionVariant",
              "type": "'single' | 'multiple'",
              "description": "Whether there can be one item selected from the menu or multiple items selected from the menu"
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "description": "Function that gets called when the menu is opened or closed"
            },
            {
              "name": "onSelectedChange",
              "type": "(item: T | T[]) => void",
              "description": "The function that is called when an item in the list is selected or deselected"
            },
            {
              "name": "customScrollContainerRef",
              "type": "React.MutableRefObject<HTMLElement | null>",
              "description": "If the menu is rendered in a scrolling element other than the `Autocomplete.Overlay` component, pass the ref of that element to `customScrollContainerRef` to ensure the container automatically scrolls when the user highlights an item in the menu that is outside the scroll container"
            }
          ]
        }
      ]
    },
    "avatar": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Avatar",
      "id": "avatar",
      "name": "Avatar",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-avatar--default",
          "code": "() => <Avatar src=\"https://avatars.githubusercontent.com/u/7143434?v=4\" />"
        },
        {
          "id": "components-avatar-features--square",
          "code": "() => (\n  <Avatar\n    square\n    alt=\"primer\"\n    src=\"https://avatars.githubusercontent.com/primer\"\n  />\n)"
        },
        {
          "id": "components-avatar-features--square-sx-prop",
          "code": "() => (\n  <Avatar\n    square\n    sx={{\n      border: '1px solid red',\n    }}\n    size={40}\n    alt=\"primer\"\n    src=\"https://avatars.githubusercontent.com/primer\"\n  />\n)"
        },
        {
          "id": "components-avatar-features--size",
          "code": "() => (\n  <div>\n    <Avatar\n      size={4}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={8}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={12}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={16}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={20}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={24}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={28}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={32}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={40}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={48}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={56}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={64}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n  </div>\n)"
        },
        {
          "id": "components-avatar-features--size-responsive",
          "code": "() => (\n  <div>\n    <Avatar\n      size={{\n        narrow: 4,\n        regular: 8,\n        wide: 12,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 8,\n        regular: 12,\n        wide: 16,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 12,\n        regular: 16,\n        wide: 20,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 16,\n        regular: 20,\n        wide: 24,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 20,\n        regular: 24,\n        wide: 28,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 24,\n        regular: 28,\n        wide: 32,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 28,\n        regular: 32,\n        wide: 40,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 32,\n        regular: 40,\n        wide: 48,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 40,\n        regular: 48,\n        wide: 56,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n    <Avatar\n      size={{\n        narrow: 48,\n        regular: 56,\n        wide: 64,\n      }}\n      alt=\"mona\"\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n    />\n  </div>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "alt",
          "type": "string",
          "defaultValue": "''",
          "description": "Provide alt text when the avatar is used without a name next to it."
        },
        {
          "name": "size",
          "type": "number | { narrow?: number; regular?: number; wide?: number; }",
          "defaultValue": "20",
          "description": "The size of the avatar in pixels."
        },
        {
          "name": "square",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the avatar will be square instead of circular."
        },
        {
          "name": "src",
          "type": "string",
          "required": false,
          "description": "URL of the avatar image.",
          "defaultValue": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "avatar_pair": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/AvatarPair",
      "id": "avatar_pair",
      "name": "AvatarPair",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-avatarpair--default",
          "code": "() => (\n  <AvatarPair>\n    <Avatar\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n      alt=\"Primer avatar, parent\"\n    />\n    <Avatar\n      src=\"https://avatars.githubusercontent.com/primer\"\n      alt=\"Primer avatar, child\"\n    />\n  </AvatarPair>\n)"
        },
        {
          "id": "components-avatarpair-features--parent-circle",
          "code": "() => (\n  <AvatarPair>\n    <Avatar\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n      alt=\"Primer avatar, parent\"\n    />\n    <Avatar\n      square\n      src=\"https://avatars.githubusercontent.com/primer\"\n      alt=\"Primer avatar, child\"\n    />\n  </AvatarPair>\n)"
        },
        {
          "id": "components-avatarpair-features--parent-square",
          "code": "() => (\n  <AvatarPair>\n    <Avatar\n      square\n      src=\"https://avatars.githubusercontent.com/primer\"\n      alt=\"Primer avatar, parent\"\n    />\n    <Avatar\n      src=\"https://avatars.githubusercontent.com/u/7143434?v=4\"\n      alt=\"Primer avatar, child\"\n    />\n  </AvatarPair>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "Avatar[]",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "avatar_stack": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/AvatarStack",
      "id": "avatar_stack",
      "name": "AvatarStack",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "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": "children",
          "type": "ReactNode",
          "description": "A set of Avatar components to stack",
          "defaultValue": ""
        },
        {
          "name": "alignRight",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Align the avatars to the right"
        },
        {
          "name": "disableExpand",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Do not spread the avatars on hover"
        },
        {
          "name": "size",
          "type": "number | { narrow?: number; regular?: number; wide?: number; }",
          "defaultValue": "20",
          "description": "The size of the avatar children in pixels."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling.",
          "defaultValue": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "banner": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Banner",
      "id": "banner",
      "name": "Banner",
      "status": "alpha",
      "a11yReviewed": true,
      "importPath": "@primer/react/experimental",
      "stories": [
        {
          "id": "experimental-components-banner--default",
          "code": "() => {\n  return (\n    <Banner\n      onDismiss={action('onDismiss')}\n      title=\"Info\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--critical",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Critical\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      variant=\"critical\"\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--info",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Info\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"info\"\n    ></Banner>\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--success",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Success\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"success\"\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--upsell",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Upsell\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"upsell\"\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--warning",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"warning\"\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--dismiss",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Notice\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--dismiss-with-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Notice\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--with-hidden-title",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      variant=\"warning\"\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--with-hidden-title-and-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      variant=\"warning\"\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--dismissible-with-hidden-title-and-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"warning\"\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--dismissible-with-hidden-title-and-secondary-action",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      hideTitle\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      onDismiss={action('onDismiss')}\n      variant=\"warning\"\n      secondaryAction={\n        <Banner.SecondaryAction leadingVisual={GitPullRequestIcon}>\n          Button\n        </Banner.SecondaryAction>\n      }\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--with-actions",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Warning\"\n      description={\n        <>\n          GitHub users are{' '}\n          <Link inline href=\"#\">\n            now required\n          </Link>{' '}\n          to enable two-factor authentication as an additional security measure.\n        </>\n      }\n      primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n      secondaryAction={<Banner.SecondaryAction>Button</Banner.SecondaryAction>}\n      variant=\"warning\"\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-features--custom-icon",
          "code": "() => {\n  return (\n    <Banner\n      title=\"Upsell\"\n      description=\"An example banner with a custom icon\"\n      icon={<CopilotIcon />}\n      onDismiss={action('onDismiss')}\n      variant=\"upsell\"\n    />\n  )\n}"
        },
        {
          "id": "experimental-components-banner-examples--with-announcement",
          "code": "() => {\n  type Choice = 'one' | 'two' | 'three'\n  const messages: Map<Choice, string> = new Map([\n    ['one', 'This is a message for choice one'],\n    ['two', 'This is a message for choice two'],\n    ['three', 'This is a message for choice three'],\n  ])\n  const [selected, setSelected] = React.useState<Choice>('one')\n  return (\n    <>\n      <Banner\n        title=\"Info\"\n        description={<AriaStatus>{messages.get(selected)}</AriaStatus>}\n        onDismiss={action('onDismiss')}\n        primaryAction={<Banner.PrimaryAction>Button</Banner.PrimaryAction>}\n        secondaryAction={\n          <Banner.SecondaryAction>Button</Banner.SecondaryAction>\n        }\n      />\n      <RadioGroup\n        sx={{\n          marginTop: 4,\n        }}\n        name=\"options\"\n        onChange={(selected) => {\n          setSelected(selected as Choice)\n        }}\n      >\n        <RadioGroup.Label>Choices</RadioGroup.Label>\n        <FormControl>\n          <Radio value=\"one\" defaultChecked />\n          <FormControl.Label>Choice one</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Radio value=\"two\" />\n          <FormControl.Label>Choice two</FormControl.Label>\n        </FormControl>\n        <FormControl>\n          <Radio value=\"three\" />\n          <FormControl.Label>Choice three</FormControl.Label>\n        </FormControl>\n      </RadioGroup>\n    </>\n  )\n}"
        }
      ],
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "Provide an optional label to override the default name for the Banner landmark region"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Provide an optional className to add to the outermost element rendered by the Banner"
        },
        {
          "name": "description",
          "type": "React.ReactNode",
          "description": "Provide an optional description for the Banner. This should provide supplemental information about the Banner"
        },
        {
          "name": "hideTitle",
          "type": "boolean",
          "description": "Whether to hide the title visually."
        },
        {
          "name": "icon",
          "type": "React.ReactNode",
          "description": "Provide a custom icon for the Banner. This is only available when `variant` is `info` or `upsell`"
        },
        {
          "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": "className",
              "type": "string",
              "description": "Class name(s) for custom styling.",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "Banner.PrimaryAction",
          "props": [],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        },
        {
          "name": "Banner.SecondaryAction",
          "props": [],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        }
      ]
    },
    "blankslate": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Blankslate",
      "id": "blankslate",
      "name": "Blankslate",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-blankslate--default",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Welcome to the mona wiki!</Blankslate.Heading>\n    <Blankslate.Description>\n      Wikis provide a place in your repository to lay out the roadmap of your\n      project, show the current status, and document software better, together.\n    </Blankslate.Description>\n    <Blankslate.PrimaryAction href=\"#\">\n      Create the first page\n    </Blankslate.PrimaryAction>\n    <Blankslate.SecondaryAction href=\"#\">\n      Learn more about wikis\n    </Blankslate.SecondaryAction>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-visual",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-primary-action-as-link",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n    <Blankslate.PrimaryAction href=\"#\">Primary action</Blankslate.PrimaryAction>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-primary-action-as-button",
          "code": "() => {\n  const [isOpen, setIsOpen] = React.useState(false)\n  const onDialogClose = React.useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Blankslate>\n        <Blankslate.Visual>\n          <BookIcon size=\"medium\" />\n        </Blankslate.Visual>\n        <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n        <Blankslate.Description>\n          Use it to provide information when no dynamic content exists.\n        </Blankslate.Description>\n        <Blankslate.PrimaryAction onClick={() => setIsOpen(true)}>\n          Primary action\n        </Blankslate.PrimaryAction>\n      </Blankslate>\n      {isOpen ? (\n        <ConfirmationDialog\n          title=\"Delete universe?\"\n          onClose={onDialogClose}\n          confirmButtonContent=\"Delete it!\"\n          confirmButtonType=\"danger\"\n        >\n          Deleting the universe could have disastrous effects, including but not\n          limited to destroying all life on Earth.\n        </ConfirmationDialog>\n      ) : null}\n    </>\n  )\n}"
        },
        {
          "id": "experimental-components-blankslate-features--with-secondary-action",
          "code": "() => (\n  <Blankslate>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n    <Blankslate.SecondaryAction href=\"#\">\n      Secondary action\n    </Blankslate.SecondaryAction>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--with-border",
          "code": "() => (\n  <Blankslate border>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--narrow",
          "code": "() => (\n  <Blankslate narrow>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        },
        {
          "id": "experimental-components-blankslate-features--spacious",
          "code": "() => (\n  <Blankslate spacious>\n    <Blankslate.Visual>\n      <BookIcon size=\"medium\" />\n    </Blankslate.Visual>\n    <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n    <Blankslate.Description>\n      Use it to provide information when no dynamic content exists.\n    </Blankslate.Description>\n  </Blankslate>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "border",
          "type": "boolean",
          "description": "Add a border around this component"
        },
        {
          "name": "narrow",
          "type": "boolean",
          "description": ""
        },
        {
          "name": "spacious",
          "type": "boolean",
          "description": ""
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) for custom styling.",
          "defaultValue": ""
        }
      ],
      "subcomponents": [
        {
          "name": "Blankslate.Visual",
          "props": []
        },
        {
          "name": "Blankslate.Heading",
          "props": [
            {
              "name": "as",
              "type": "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'"
            }
          ]
        },
        {
          "name": "Blankslate.Description",
          "props": []
        },
        {
          "name": "Blankslate.PrimaryAction",
          "props": [
            {
              "name": "href",
              "type": "string",
              "required": false,
              "description": "Link to complete primary action. If defined, will render as an anchor instead of a button."
            }
          ]
        },
        {
          "name": "Blankslate.SecondaryAction",
          "props": [
            {
              "name": "href",
              "type": "string",
              "description": "Link to complete secondary action"
            }
          ]
        }
      ]
    },
    "box": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/BranchName",
      "id": "branch_name",
      "name": "BranchName",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-branchname--default",
          "code": "() => <BranchName href=\"#\">branch_name</BranchName>"
        },
        {
          "id": "components-branchname-features--with-branch-icon",
          "code": "() => (\n  <BranchName href=\"#\">\n    <Stack direction=\"horizontal\" gap=\"condensed\" align=\"center\">\n      <Octicon icon={GitBranchIcon} />\n      branch_name\n    </Stack>\n  </BranchName>\n)"
        },
        {
          "id": "components-branchname-features--not-a-link",
          "code": "() => <BranchName as=\"span\">branch_name_as_span</BranchName>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "ref",
          "type": "React.RefObject<HTMLAnchorElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"a\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "breadcrumbs": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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": "className",
          "type": "string",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "children",
          "type": "Breadcrumbs.Item[]",
          "defaultValue": "",
          "description": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Breadcrumbs.Item",
          "props": [
            {
              "name": "selected",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Whether this item represents the current page"
            },
            {
              "name": "to",
              "type": "string | Partial<Path>",
              "required": false,
              "description": "Used when the item is rendered using a component like React Router's `Link`. The path to navigate to.",
              "defaultValue": ""
            },
            {
              "name": "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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--link",
          "code": "() => <Button variant=\"link\">Button that looks like a link</Button>"
        },
        {
          "id": "components-button-features--leading-visual",
          "code": "() => <Button leadingVisual={HeartIcon}>Leading visual</Button>"
        },
        {
          "id": "components-button-features--trailing-visual",
          "code": "() => <Button trailingVisual={EyeIcon}>Trailing visual</Button>"
        },
        {
          "id": "components-button-features--trailing-counter",
          "code": "() => {\n  const [count, setCount] = useState(0)\n  const onClick = () => {\n    setCount(count + 1)\n    announce(`Watch ${count + 1}`)\n  }\n  return (\n    <>\n      <Button onClick={onClick} count={count}>\n        Watch\n      </Button>\n      <AccessibilityNote />\n      <p>\n        In this example, a live region has been implemented to communicate the\n        change.\n      </p>\n    </>\n  )\n}"
        },
        {
          "id": "components-button-features--trailing-counter-with-no-text",
          "code": "() => <Button aria-label=\"Comments\" leadingVisual={CommentIcon} count={3} />"
        },
        {
          "id": "components-button-features--trailing-counter-all-variants",
          "code": "() => {\n  const [count, setCount] = useState(0)\n  const onClick = () => {\n    setCount(count + 1)\n    announce(`Watch ${count + 1}`)\n  }\n  return (\n    <>\n      <Stack gap=\"normal\" wrap=\"wrap\" direction=\"horizontal\">\n        <Button onClick={onClick} count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"primary\" disabled count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"danger\" count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"danger\" disabled count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"invisible\" count={count}>\n          Watch\n        </Button>\n        <Button onClick={onClick} variant=\"invisible\" disabled count={count}>\n          Watch\n        </Button>\n      </Stack>\n      <AccessibilityNote />\n      <p>\n        In these examples, a live region has been implemented to communicate the\n        change.\n      </p>\n    </>\n  )\n}"
        },
        {
          "id": "components-button-features--trailing-action",
          "code": "() => <Button trailingAction={TriangleDownIcon}>Trailing action</Button>"
        },
        {
          "id": "components-button-features--block",
          "code": "() => <Button block>Default</Button>"
        },
        {
          "id": "components-button-features--disabled",
          "code": "() => (\n  <div\n    style={{\n      display: 'flex',\n      flexDirection: 'row',\n      gap: '1rem',\n    }}\n  >\n    <Button disabled>Default</Button>\n    <Button variant=\"primary\" disabled>\n      Primary\n    </Button>\n    <Button variant=\"danger\" disabled>\n      Danger\n    </Button>\n    <Button variant=\"invisible\" disabled>\n      Invisible\n    </Button>\n  </div>\n)"
        },
        {
          "id": "components-button-features--inactive",
          "code": "() => (\n  <div\n    style={{\n      display: 'flex',\n      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>"
        },
        {
          "id": "components-button-features--loading",
          "code": "() => <Button loading>Default</Button>"
        },
        {
          "id": "components-button-features--loading-custom-announcement",
          "code": "() => (\n  <Button loading loadingAnnouncement=\"This is a custom loading announcement\">\n    Default\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-with-leading-visual",
          "code": "() => (\n  <Button loading leadingVisual={DownloadIcon}>\n    Export\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-with-trailing-visual",
          "code": "() => (\n  <Button loading trailingVisual={DownloadIcon}>\n    Export\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-with-trailing-action",
          "code": "() => (\n  <Button loading trailingAction={TriangleDownIcon}>\n    Export dropdown\n  </Button>\n)"
        },
        {
          "id": "components-button-features--loading-trigger",
          "code": "() => {\n  const [isLoading, setIsLoading] = useState(false)\n  const handleClick = () => {\n    setIsLoading(true)\n  }\n  return (\n    <Button\n      loading={isLoading}\n      onClick={handleClick}\n      leadingVisual={DownloadIcon}\n    >\n      Export\n    </Button>\n  )\n}"
        },
        {
          "id": "components-button-features--label-wrap",
          "code": "() => {\n  return (\n    <Stack\n      style={{\n        width: '200px',\n      }}\n    >\n      <Button labelWrap>\n        This button label will wrap if the label is too long\n      </Button>\n      <Button size=\"small\" labelWrap>\n        This small button label will wrap if the label is too long\n      </Button>\n      <Button size=\"large\" labelWrap>\n        This large button label will wrap if the label is too long\n      </Button>\n      <Button labelWrap leadingVisual={HeartIcon} trailingVisual={EyeIcon}>\n        This button label will wrap if the label is too long\n      </Button>\n    </Stack>\n  )\n}"
        },
        {
          "id": "components-button-features--inactive-button-with-tooltip",
          "code": "() => (\n  <Tooltip\n    text=\"Action unavailable: an error occured while loading respository permissions\"\n    direction=\"n\"\n  >\n    <Button inactive>Review changes</Button>\n  </Tooltip>\n)"
        },
        {
          "id": "components-button-features--expanded-button",
          "code": "() => (\n  <Stack align=\"start\">\n    <Button aria-expanded trailingAction={TriangleDownIcon}>\n      Review changes\n    </Button>\n    <Button aria-expanded trailingAction={TriangleDownIcon} variant=\"primary\">\n      Review changes\n    </Button>\n    <Button aria-expanded trailingAction={TriangleDownIcon} variant=\"invisible\">\n      Review changes\n    </Button>\n    <Button aria-expanded trailingAction={TriangleDownIcon} variant=\"danger\">\n      Review changes\n    </Button>\n  </Stack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "alignContent",
          "type": "'start' | 'center'",
          "description": "Content alignment for when visuals are present."
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "'button'"
        },
        {
          "name": "block",
          "type": "boolean",
          "description": "Allow button width to fill its container."
        },
        {
          "name": "children",
          "required": true,
          "type": "React.ReactNode",
          "description": "The content of the button."
        },
        {
          "name": "count",
          "type": "number",
          "description": "For counter buttons, the number to display."
        },
        {
          "name": "inactive",
          "type": "boolean",
          "description": "Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button.\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": "loading",
          "type": "boolean",
          "description": "When true, the button is in a loading state."
        },
        {
          "name": "loadingAnnouncement",
          "type": "string",
          "description": "The content to announce to screen readers when loading. This requires `loading` prop to be true"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLButtonElement>"
        },
        {
          "name": "size",
          "type": "'small'\n| 'medium'\n| 'large'",
          "defaultValue": "'medium'"
        },
        {
          "name": "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": "trailingAction",
          "type": "React.ElementType",
          "description": "Trailing action appears to the right of the trailing visual and is always locked to the end"
        },
        {
          "name": "variant",
          "type": "'default'\n| 'primary'\n| 'danger'\n| 'invisible'\n| 'link'",
          "defaultValue": "'default'",
          "description": "Change the visual style of the button."
        },
        {
          "name": "labelWrap",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the button label should wrap to multiple lines of it is longer than the button width."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "description": "Avoid disabling buttons because it will make them inaccessible to users who rely on keyboard navigation. Buttons that are disabled can not be clicked, selected, or navigated through.",
          "defaultValue": ""
        }
      ],
      "passthrough": {
        "element": "button",
        "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attributes"
      }
    },
    "icon_button": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Button",
      "id": "icon_button",
      "name": "IconButton",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-iconbutton--default",
          "code": "() => <IconButton icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--primary",
          "code": "() => <IconButton icon={HeartIcon} variant=\"primary\" aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--danger",
          "code": "() => <IconButton icon={HeartIcon} variant=\"danger\" aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--invisible",
          "code": "() => <IconButton icon={HeartIcon} variant=\"invisible\" aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--disabled",
          "code": "() => <IconButton disabled icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--small",
          "code": "() => <IconButton size=\"small\" icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--medium",
          "code": "() => <IconButton size=\"medium\" icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--large",
          "code": "() => <IconButton size=\"large\" icon={HeartIcon} aria-label=\"Favorite\" />"
        },
        {
          "id": "components-iconbutton-features--with-description",
          "code": "() => (\n  <IconButton\n    icon={InboxIcon}\n    aria-label=\"Notifications\"\n    description=\"You have no unread notifications.\"\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--external-tooltip",
          "code": "() => (\n  <Tooltip\n    text=\"this is a supportive description for icon button\"\n    direction=\"se\"\n  >\n    <IconButton icon={HeartIcon} aria-label=\"HeartIcon\" />\n  </Tooltip>\n)"
        },
        {
          "id": "components-iconbutton-features--external-tooltip-version-1",
          "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 icon={ChevronDownIcon} aria-label=\"Something\" />\n    </ActionMenu.Anchor>\n\n    <ActionMenu.Overlay width=\"medium\">\n      <ActionList>\n        <ActionList.Item onSelect={() => alert('Copy link clicked')}>\n          Copy link\n          <ActionList.TrailingVisual>⌘C</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Quote reply clicked')}>\n          Quote reply\n          <ActionList.TrailingVisual>⌘Q</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Item onSelect={() => alert('Edit comment clicked')}>\n          Edit comment\n          <ActionList.TrailingVisual>⌘E</ActionList.TrailingVisual>\n        </ActionList.Item>\n        <ActionList.Divider />\n        <ActionList.Item\n          variant=\"danger\"\n          onSelect={() => alert('Delete file clicked')}\n        >\n          Delete file\n          <ActionList.TrailingVisual>⌘D</ActionList.TrailingVisual>\n        </ActionList.Item>\n      </ActionList>\n    </ActionMenu.Overlay>\n  </ActionMenu>\n)"
        },
        {
          "id": "components-iconbutton-features--loading",
          "code": "() => (\n  <IconButton loading icon={HeartIcon} variant=\"primary\" aria-label=\"Primary\" />\n)"
        },
        {
          "id": "components-iconbutton-features--loading-trigger",
          "code": "() => {\n  const [isLoading, setIsLoading] = useState(false)\n  const handleClick = () => {\n    setIsLoading(true)\n    setTimeout(() => {\n      setIsLoading(false)\n    }, 3000)\n  }\n  return (\n    <IconButton\n      loading={isLoading}\n      onClick={handleClick}\n      icon={DownloadIcon}\n      aria-label=\"Download\"\n    />\n  )\n}"
        },
        {
          "id": "components-iconbutton-features--keybinding-hint-on-description",
          "code": "() => (\n  <IconButton\n    icon={InboxIcon}\n    aria-label=\"Notifications\"\n    description=\"You have unread notifications\"\n    keybindingHint=\"G+N\"\n  />\n)"
        },
        {
          "id": "components-iconbutton-features--keybinding-hint",
          "code": "() => <IconButton icon={BoldIcon} aria-label=\"Bold\" keybindingHint=\"Mod+B\" />"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "defaultValue": "",
          "required": true,
          "description": "This will be the Button description."
        },
        {
          "name": "variant",
          "type": "'default' | 'primary' | 'danger' | 'outline' | 'invisible' | 'link'",
          "defaultValue": "",
          "description": "Changes the look and feel of the button which is different for each variant"
        },
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "",
          "description": "Changes the size of the icon button component"
        },
        {
          "name": "inactive",
          "type": "boolean",
          "description": "Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button."
        },
        {
          "name": "icon",
          "type": "Component",
          "defaultValue": "",
          "description": "provide an octicon. It will be placed in the center of the button"
        },
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Use an aria label to describe the functionality of the button. Please refer to [our guidance on alt text](https://primer.style/guides/accessibility/alternative-text-for-images) for tips on writing good alternative text."
        },
        {
          "name": "keyshortcuts",
          "type": "string",
          "defaultValue": "",
          "deprecated": true,
          "description": "Use `keybindingHint` instead."
        },
        {
          "name": "keybindingHint",
          "type": "string",
          "description": "Optional keybinding hint to show in the tooltip for this button. See the `KeybindingHint` component documentation for the correct format for this string. Has no effect if tooltip is overridden or disabled. Does **not** bind any keybindings for this button - this is only for visual hints."
        },
        {
          "name": "tooltipDirection",
          "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
          "defaultValue": "'s'",
          "description": "The direction of the tooltip. ",
          "required": false
        },
        {
          "name": "description",
          "type": "string",
          "required": false,
          "description": "If `description` is provided, we will use a Tooltip to describe the button. Then `aria-label` is used to label the button.",
          "defaultValue": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "button_group": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ButtonGroup",
      "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    {/* We can remove these unsafe props after we resolve https://github.com/primer/react/issues/4129 */}\n    <IconButton icon={PlusIcon} aria-label=\"Add\" />\n    <IconButton icon={DashIcon} aria-label=\"Subtract\" />\n  </ButtonGroup>\n)"
        },
        {
          "id": "components-buttongroup-features--loading-buttons",
          "code": "() => {\n  const handleClick = () => {}\n  return (\n    <ButtonGroup>\n      <Button loading={true} onClick={handleClick}>\n        Button 1\n      </Button>\n      <Button onClick={handleClick}>Button 2</Button>\n      <Tooltip text=\"Additional info about the button\">\n        <Button onClick={handleClick}>Button 3</Button>\n      </Tooltip>\n    </ButtonGroup>\n  )\n}"
        },
        {
          "id": "components-buttongroup-features--dropdown-split",
          "code": "() => {\n  const actions = ['Action one', 'Action two', 'Action three']\n  const [selectedActionIndex, setSelectedActionIndex] =\n    React.useState<number>(0)\n  const selectedAction = actions[selectedActionIndex]\n  return (\n    <ButtonGroup>\n      <Button\n        onClick={() => {\n          alert(`Activated ${selectedAction}`)\n        }}\n      >\n        {selectedAction}\n      </Button>\n      <ActionMenu>\n        <ActionMenu.Button aria-label=\"More options\" icon={TriangleDownIcon} />\n        <ActionMenu.Overlay>\n          <ActionList>\n            {actions.map((action, index) => {\n              return (\n                <ActionList.Item\n                  key={action}\n                  onSelect={() => {\n                    setSelectedActionIndex(index)\n                  }}\n                >\n                  {action}\n                </ActionList.Item>\n              )\n            })}\n          </ActionList>\n        </ActionMenu.Overlay>\n      </ActionMenu>\n    </ButtonGroup>\n  )\n}"
        },
        {
          "id": "components-buttongroup-features--as-toolbar",
          "code": "() => (\n  <ButtonGroup role=\"toolbar\">\n    <Button>Button 1</Button>\n    <Button>Button 2</Button>\n    <Button>Button 3</Button>\n  </ButtonGroup>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        }
      ],
      "subcomponents": []
    },
    "checkbox": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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}"
        },
        {
          "id": "components-checkbox-features--indeterminate",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <Checkbox value=\"default\" indeterminate />\n      <FormControl.Label>Default label</FormControl.Label>\n    </FormControl>\n  </Box>\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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/CheckboxGroup",
      "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 required>\n      <Checkbox value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </CheckboxGroup>\n)"
        },
        {
          "id": "components-checkboxgroup-features--visually-hidden-label",
          "code": "() => (\n  <CheckboxGroup>\n    <CheckboxGroup.Label visuallyHidden>Choices</CheckboxGroup.Label>\n    <FormControl>\n      <Checkbox value=\"one\" defaultChecked />\n      <FormControl.Label>Choice one</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"two\" defaultChecked />\n      <FormControl.Label>Choice two</FormControl.Label>\n    </FormControl>\n    <FormControl>\n      <Checkbox value=\"three\" />\n      <FormControl.Label>Choice three</FormControl.Label>\n    </FormControl>\n  </CheckboxGroup>\n)"
        },
        {
          "id": "components-checkboxgroup-features--with-external-label",
          "code": "() => (\n  <>\n    <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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/CircleBadge",
      "id": "circle_badge",
      "name": "CircleBadge",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-circlebadge--default",
          "code": "() => (\n  <CircleBadge>\n    <CircleBadge.Icon icon={ZapIcon} aria-label=\"User badge\" />\n  </CircleBadge>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "variant",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "'medium'",
          "description": "Creates a smaller or larger badge. Has no effect if the `size` prop is set"
        },
        {
          "name": "size",
          "type": "number",
          "defaultValue": "",
          "description": "Sets the size of the badge in pixels. Overrides the `variant` prop when set"
        },
        {
          "name": "inline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Styles the badge to `display: inline`"
        },
        {
          "name": "ref",
          "type": "React.RefObject<HTMLDivElement>"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"div\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "CircleBadge.Icon",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "Octicon"
            }
          ],
          "passthrough": {
            "element": "Octicon",
            "url": "/Octicon"
          }
        }
      ]
    },
    "circle_octicon": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/CircleOcticon",
      "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.emphasis',\n      color: 'fg.onEmphasis',\n    }}\n    aria-label=\"Changes approved\"\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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/CounterLabel",
      "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>"
        },
        {
          "id": "components-counterlabel-features--secondary-theme",
          "code": "() => <CounterLabel scheme=\"secondary\">12</CounterLabel>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "scheme",
          "type": "'primary' | 'secondary'",
          "defaultValue": "",
          "description": "Pass in 'primary' for a darker background and inverse text, or 'secondary' for a lighter background and primary text. Omitting the scheme prop renders the default counter scheme"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) for custom styling.",
          "defaultValue": ""
        },
        {
          "name": "sx",
          "type": "BetterSystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "data_table": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/DataTable",
      "id": "data_table",
      "name": "DataTable",
      "status": "alpha",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "experimental-components-datatable--default",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-title",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-title-and-subtitle",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-sorting",
          "code": "() => {\n  const rows = Array.from(data).sort((a, b) => {\n    return b.updatedAt - a.updatedAt\n  })\n  return (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={rows}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n            sortBy: 'alphanumeric',\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            sortBy: 'datetime',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n        initialSortColumn=\"updatedAt\"\n        initialSortDirection=\"DESC\"\n      />\n    </Table.Container>\n  )\n}"
        },
        {
          "id": "experimental-components-datatable-features--with-actions",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Actions>\n      <IconButton\n        aria-label=\"Download\"\n        icon={DownloadIcon}\n        variant=\"invisible\"\n      />\n      <IconButton aria-label=\"Add row\" icon={PlusIcon} variant=\"invisible\" />\n    </Table.Actions>\n    <Table.Divider />\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-action",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Actions>\n      <Button>Action</Button>\n    </Table.Actions>\n    <Table.Divider />\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-row-action",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          id: 'actions',\n          header: () => <VisuallyHidden>Actions</VisuallyHidden>,\n          renderCell: (row) => {\n            return (\n              <IconButton\n                aria-label={`Download: ${row.name}`}\n                title={`Download: ${row.name}`}\n                icon={DownloadIcon}\n                variant=\"invisible\"\n                onClick={() => {\n                  action('Download')(row)\n                }}\n              />\n            )\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-row-actions",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          id: 'actions',\n          header: () => <VisuallyHidden>Actions</VisuallyHidden>,\n          renderCell: (row) => {\n            return (\n              <>\n                <IconButton\n                  aria-label={`Edit: ${row.name}`}\n                  title={`Edit: ${row.name}`}\n                  icon={PencilIcon}\n                  variant=\"invisible\"\n                  onClick={() => {\n                    action('Edit')(row)\n                  }}\n                />\n                <IconButton\n                  aria-label={`Delete: ${row.name}`}\n                  title={`Delete: ${row.name}`}\n                  icon={TrashIcon}\n                  variant=\"invisible\"\n                  onClick={() => {\n                    action('Delete')(row)\n                  }}\n                />\n              </>\n            )\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-row-action-menu",
          "code": "() => (\n  <Table.Container>\n    <Table.Title as=\"h2\" id=\"repositories\">\n      Repositories\n    </Table.Title>\n    <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n      A subtitle could appear here to give extra context to the data.\n    </Table.Subtitle>\n    <DataTable\n      aria-labelledby=\"repositories\"\n      aria-describedby=\"repositories-subtitle\"\n      data={data}\n      columns={[\n        {\n          header: 'Repository',\n          field: 'name',\n          rowHeader: true,\n        },\n        {\n          header: 'Type',\n          field: 'type',\n          renderCell: (row) => {\n            return <Label>{uppercase(row.type)}</Label>\n          },\n        },\n        {\n          header: 'Updated',\n          field: 'updatedAt',\n          renderCell: (row) => {\n            return <RelativeTime date={new Date(row.updatedAt)} />\n          },\n        },\n        {\n          header: 'Dependabot',\n          field: 'securityFeatures.dependabot',\n          renderCell: (row) => {\n            return row.securityFeatures.dependabot.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.dependabot.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          header: 'Code scanning',\n          field: 'securityFeatures.codeScanning',\n          renderCell: (row) => {\n            return row.securityFeatures.codeScanning.length > 0 ? (\n              <LabelGroup>\n                {row.securityFeatures.codeScanning.map((feature) => {\n                  return <Label key={feature}>{uppercase(feature)}</Label>\n                })}\n              </LabelGroup>\n            ) : null\n          },\n        },\n        {\n          id: 'actions',\n          header: () => <VisuallyHidden>Actions</VisuallyHidden>,\n          renderCell: (row) => {\n            return (\n              <ActionMenu>\n                <ActionMenu.Anchor>\n                  <IconButton\n                    aria-label={`Actions: ${row.name}`}\n                    title={`Actions: ${row.name}`}\n                    icon={KebabHorizontalIcon}\n                    variant=\"invisible\"\n                  />\n                </ActionMenu.Anchor>\n                <ActionMenu.Overlay>\n                  <ActionList>\n                    <ActionList.Item\n                      onSelect={() => {\n                        action('Copy')(row)\n                      }}\n                    >\n                      Copy row\n                    </ActionList.Item>\n                    <ActionList.Item>Edit row</ActionList.Item>\n                    <ActionList.Item>Export row as CSV</ActionList.Item>\n                    <ActionList.Divider />\n                    <ActionList.Item variant=\"danger\">\n                      Delete row\n                    </ActionList.Item>\n                  </ActionList>\n                </ActionMenu.Overlay>\n              </ActionMenu>\n            )\n          },\n        },\n      ]}\n    />\n  </Table.Container>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-custom-heading",
          "code": "() => (\n  <>\n    <Heading as=\"h2\" id=\"repositories\">\n      Security coverage\n    </Heading>\n    <p id=\"repositories-subtitle\">\n      Organization members can only see data for the most recently-updated\n      repositories. To see all repositories, talk to your organization\n      administrator about becoming a security manager.\n    </p>\n    <Table.Container>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={data}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n      />\n    </Table.Container>\n  </>\n)"
        },
        {
          "id": "experimental-components-datatable-features--with-no-content",
          "code": "() => {\n  const exampleEmptyData: Array<Repo> = []\n  return exampleEmptyData.length === 0 ? (\n    <Blankslate border>\n      <Blankslate.Visual>\n        <BookIcon size=\"medium\" />\n      </Blankslate.Visual>\n      <Blankslate.Heading>Blankslate heading</Blankslate.Heading>\n      <Blankslate.Description>\n        Use it to provide information when no dynamic content exists.\n      </Blankslate.Description>\n      <Blankslate.PrimaryAction href=\"#\">\n        Primary action\n      </Blankslate.PrimaryAction>\n      <Blankslate.SecondaryAction href=\"#\">\n        Secondary action link\n      </Blankslate.SecondaryAction>\n    </Blankslate>\n  ) : (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={exampleEmptyData}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n      />\n    </Table.Container>\n  )\n}"
        },
        {
          "id": "experimental-components-datatable-features--with-loading",
          "code": "() => {\n  const [loading] = React.useState(true)\n  return (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      {loading ? (\n        <Table.Skeleton\n          aria-labelledby=\"repositories\"\n          aria-describedby=\"repositories-subtitle\"\n          columns={columns}\n          rows={10}\n        />\n      ) : (\n        <DataTable\n          aria-labelledby=\"repositories\"\n          aria-describedby=\"repositories-subtitle\"\n          data={data}\n          columns={columns}\n        />\n      )}\n    </Table.Container>\n  )\n}"
        },
        {
          "id": "experimental-components-datatable-features--with-pagination",
          "code": "() => {\n  const pageSize = 10\n  const [pageIndex, setPageIndex] = React.useState(0)\n  const start = pageIndex * pageSize\n  const end = start + pageSize\n  const rows = repos.slice(start, end)\n  return (\n    <Table.Container>\n      <Table.Title as=\"h2\" id=\"repositories\">\n        Repositories\n      </Table.Title>\n      <Table.Subtitle as=\"p\" id=\"repositories-subtitle\">\n        A subtitle could appear here to give extra context to the data.\n      </Table.Subtitle>\n      <DataTable\n        aria-labelledby=\"repositories\"\n        aria-describedby=\"repositories-subtitle\"\n        data={rows}\n        columns={[\n          {\n            header: 'Repository',\n            field: 'name',\n            rowHeader: true,\n          },\n          {\n            header: 'Type',\n            field: 'type',\n            renderCell: (row) => {\n              return <Label>{uppercase(row.type)}</Label>\n            },\n          },\n          {\n            header: 'Updated',\n            field: 'updatedAt',\n            renderCell: (row) => {\n              return <RelativeTime date={new Date(row.updatedAt)} />\n            },\n          },\n          {\n            header: 'Dependabot',\n            field: 'securityFeatures.dependabot',\n            renderCell: (row) => {\n              return row.securityFeatures.dependabot.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.dependabot.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n          {\n            header: 'Code scanning',\n            field: 'securityFeatures.codeScanning',\n            renderCell: (row) => {\n              return row.securityFeatures.codeScanning.length > 0 ? (\n                <LabelGroup>\n                  {row.securityFeatures.codeScanning.map((feature) => {\n                    return <Label key={feature}>{uppercase(feature)}</Label>\n                  })}\n                </LabelGroup>\n              ) : null\n            },\n          },\n        ]}\n      />\n      <Table.Pagination\n        aria-label=\"Pagination for Repositories\"\n        pageSize={pageSize}\n        totalCount={repos.length}\n        onChange={({ pageIndex }) => {\n          setPageIndex(pageIndex)\n        }}\n      />\n    </Table.Container>\n  )\n}"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "aria-describedby",
          "type": "string",
          "description": "Provide an id to an element which uniquely describes this table"
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "description": "Provide an id to an element which uniquely labels this table"
        },
        {
          "name": "data",
          "type": "Array<Data>",
          "description": "Provide a collection of the rows which will be rendered inside of the table"
        },
        {
          "name": "columns",
          "type": "Array<Column<Data>>",
          "description": "Provide the columns for the table and the fields in `data` to which they correspond"
        },
        {
          "name": "cellPadding",
          "type": "'condensed' | 'normal' | 'spacious'",
          "description": "Specify the amount of space that should be available around the contents of a cell"
        },
        {
          "name": "aria-describedby",
          "type": "string",
          "required": false,
          "description": "Provide an id to an element which uniquely describes this table",
          "defaultValue": ""
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "required": false,
          "description": "Provide an id to an element which uniquely labels this table",
          "defaultValue": ""
        },
        {
          "name": "initialSortColumn",
          "type": "string | number",
          "required": false,
          "description": "Provide the id or field of the column by which the table is sorted. When\nusing this `prop`, the input data must be sorted by this column in\nascending order",
          "defaultValue": ""
        },
        {
          "name": "initialSortDirection",
          "type": "'ASC' | 'DESC'",
          "required": false,
          "description": "Provide the sort direction that the table should be sorted by on the\ncurrently sorted column",
          "defaultValue": ""
        }
      ],
      "subcomponents": [
        {
          "name": "Table",
          "props": [
            {
              "name": "aria-describedby",
              "type": "string",
              "description": "Provide an id to an element which uniquely describes this table"
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "Provide an id to an element which uniquely labels this table"
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "cellPadding",
              "type": "'condensed' | 'normal' | 'spacious'",
              "description": "Specify the amount of space that should be available around the contents of a cell"
            }
          ]
        },
        {
          "name": "Table.Head",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Actions",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Body",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Row",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Header",
          "props": [
            {
              "name": "align",
              "type": "'end' | 'start'",
              "required": false,
              "description": "The horizontal alignment of the cell's content",
              "defaultValue": ""
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Cell",
          "props": [
            {
              "name": "align",
              "type": "'end' | 'start'",
              "required": false,
              "description": "The horizontal alignment of the cell's content",
              "defaultValue": ""
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "scope",
              "type": "'row'",
              "description": "Provide the scope for a table cell, useful for defining a row header using `scope=\"row\"`"
            }
          ]
        },
        {
          "name": "Table.CellPlaceholder",
          "props": []
        },
        {
          "name": "Table.Container",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        },
        {
          "name": "Table.Divider",
          "props": []
        },
        {
          "name": "Table.Title",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "id",
              "type": "string",
              "required": true,
              "description": "Provide a unique id for the table subtitle. This should be used along with\n`aria-labelledby` on `DataTable`"
            }
          ]
        },
        {
          "name": "Table.Subtitle",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "id",
              "type": "string",
              "required": true,
              "description": "Provide a unique id for the table subtitle. This should be used along with\n`aria-describedby` on `DataTable`"
            }
          ]
        },
        {
          "name": "Table.Skeleton",
          "props": [
            {
              "name": "cellPadding",
              "type": "'condensed' | 'normal' | 'spacious'",
              "description": "Specify the amount of space that should be available around the contents of a cell",
              "defaultValue": "normal"
            },
            {
              "name": "columns",
              "required": true,
              "type": "Array<Column<Data>>"
            },
            {
              "name": "rows",
              "type": "number",
              "description": "Optionally specify the number of rows which should be included in the skeleton state of the component",
              "defaultValue": "10"
            }
          ]
        },
        {
          "name": "Table.Pagination",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "required": true,
              "description": "Defines a string value that labels the current element.\nProvide a label for the navigation landmark rendered by this component\n@see aria-labelledby."
            },
            {
              "name": "defaultPageIndex",
              "type": "string",
              "description": "Provide an optional index to specify the default selected page"
            },
            {
              "name": "id",
              "type": "string",
              "description": "Optionally provide an `id` that is placed on the navigation landmark\nrendered by this component"
            },
            {
              "name": "onChange",
              "type": "({ pageIndex }: { pageIndex: number }) => void",
              "description": "Optionally provide a handler that is called whenever the pagination state\nis updated"
            },
            {
              "name": "pageSize",
              "type": "number",
              "description": "Optionally specify the number of items within a page",
              "defaultValue": "25"
            },
            {
              "name": "totalCount",
              "type": "number",
              "required": true,
              "description": "Specify the total number of items within the collection"
            },
            {
              "name": "showPages",
              "type": "boolean | { narrow?: boolean; regular?: boolean; wide?: boolean; }",
              "required": false,
              "description": "Whether to show the page numbers",
              "defaultValue": "{narrow: false}"
            }
          ]
        },
        {
          "name": "Table.ErrorDialog",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "React.ReactNode",
              "description": "The content of the dialog. This is usually a message explaining the error."
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "'Error'",
              "description": "The title of the dialog. This is usually a short description of the error."
            },
            {
              "name": "onRetry",
              "type": "() => void",
              "description": "Event handler called when the user clicks the retry button."
            },
            {
              "name": "onDismiss",
              "type": "() => void",
              "description": "Event handler called when the dialog is dismissed."
            }
          ]
        },
        {
          "name": "Table.SortHeader",
          "props": [
            {
              "name": "direction",
              "type": "'ASC' | 'DESC' | 'NONE'",
              "required": true,
              "description": "Specify the sort direction for the TableHeader",
              "defaultValue": ""
            },
            {
              "name": "onToggleSort",
              "type": "() => void",
              "required": true,
              "description": "Provide a handler that is called when the sortable TableHeader is\ninteracted with via a click or keyboard interaction",
              "defaultValue": ""
            },
            {
              "name": "align",
              "type": "'end' | 'start'",
              "description": "The horizontal alignment of the cell's content",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "Column options",
          "props": [
            {
              "name": "align",
              "type": "'start' | 'end'",
              "description": "The horizontal alignment of the column's content"
            },
            {
              "name": "field",
              "type": "ObjectPaths<Data>",
              "description": "Optionally provide a field to render for this column. This may be the key of the object or a string that accesses nested objects through `.`. For example: `field: a.b.c` \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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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      <Details.Summary as={Button}>See Details</Details.Summary>\n      This is some content\n    </Details>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Details.Summary",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType<React.PropsWithChildren<any>>",
              "defaultValue": "summary",
              "required": false,
              "description": "HTML element to render summary as."
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "dialog_v2": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Dialog",
      "id": "dialog_v2",
      "docsId": "dialog",
      "name": "Dialog",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-dialog--default",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [secondOpen, setSecondOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n  const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          footerButtons={[\n            {\n              buttonType: 'default',\n              content: 'Open Second Dialog',\n              onClick: openSecondDialog,\n            },\n            {\n              buttonType: 'danger',\n              content: 'Delete the universe',\n              onClick: onDialogClose,\n            },\n            {\n              buttonType: 'primary',\n              content: 'Proceed',\n              onClick: openSecondDialog,\n            },\n          ]}\n        >\n          {lipsum}\n          {secondOpen && (\n            <Dialog\n              title=\"Inner dialog!\"\n              onClose={onSecondDialogClose}\n              width=\"small\"\n            >\n              Hello world\n            </Dialog>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--with-custom-renderers",
          "code": "({ width, height, subtitle }: DialogStoryProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button onClick={() => setIsOpen(!isOpen)}>Show dialog</Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          subtitle={subtitle ? 'This is a subtitle!' : undefined}\n          width={width}\n          height={height}\n          renderHeader={CustomHeader}\n          renderBody={CustomBody}\n          renderFooter={CustomFooter}\n          onClose={onDialogClose}\n          footerButtons={[\n            {\n              buttonType: 'danger',\n              content: 'Delete the universe',\n              onClick: onDialogClose,\n            },\n            {\n              buttonType: 'primary',\n              content: 'Proceed',\n            },\n          ]}\n        >\n          {lipsum}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--stress-test",
          "code": "({ width, height, subtitle }: DialogStoryProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [secondOpen, setSecondOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n  const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n  const manyButtons = new Array(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            },\n          ]}\n          position={{\n            narrow: 'fullscreen',\n            regular: 'center',\n          }}\n        >\n          {lipsum}\n          {secondOpen && (\n            <Dialog\n              title=\"Inner dialog!\"\n              onClose={onSecondDialogClose}\n              width=\"small\"\n            >\n              Hello world\n            </Dialog>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--repro-multistep-dialog-with-conditional-footer",
          "code": "({ width, height }: DialogStoryProps) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const [step, setStep] = React.useState(1)\n  const [inputText, setInputText] = React.useState('')\n  const dialogRef = useRef<HTMLDivElement>(null)\n  const renderFooterConditionally = () => {\n    if (step === 1) return null\n    return (\n      <Dialog.Footer>\n        <Button variant=\"primary\">Submit</Button>\n      </Dialog.Footer>\n    )\n  }\n  React.useEffect(() => {\n    // focus the close button when the step changes\n    const focusTarget = dialogRef.current?.querySelector(\n      'button[aria-label=\"Close\"]',\n    ) as HTMLButtonElement\n    if (step === 2) {\n      focusTarget.focus()\n    }\n  }, [step])\n  return (\n    <>\n      <Button onClick={() => setIsOpen(!isOpen)}>Show dialog</Button>\n      {isOpen && (\n        <Dialog\n          title={`Step ${step}`}\n          width={width}\n          height={height}\n          renderFooter={renderFooterConditionally}\n          onClose={onDialogClose}\n          footerButtons={[\n            {\n              buttonType: 'primary',\n              content: 'Proceed',\n            },\n          ]}\n          ref={dialogRef}\n        >\n          {step === 1 ? (\n            <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            <div>\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                  value={inputText}\n                  onChange={(event) => setInputText(event.target.value)}\n                />\n              </Box>\n            </div>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--bottom-sheet-narrow",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          position={{\n            narrow: 'bottom',\n            regular: 'center',\n          }}\n        >\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--full-screen-narrow",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          position={{\n            narrow: 'fullscreen',\n            regular: 'center',\n          }}\n        >\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--side-sheet",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(true)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(true)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog title=\"My Dialog\" onClose={onDialogClose} position=\"right\">\n          {bodyContent}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--return-focus-ref",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const triggerRef = React.useRef<HTMLButtonElement>(null)\n  const triggerButton = (\n    <Button ref={triggerRef} variant=\"primary\" onClick={() => setIsOpen(true)}>\n      Show dialog\n    </Button>\n  )\n  if (!isOpen) return triggerButton\n  return (\n    <React.Suspense fallback={<Button>Show Dialog</Button>}>\n      {triggerButton}\n      <Dialog title=\"title\" onClose={onDialogClose} returnFocusRef={triggerRef}>\n        body\n      </Dialog>\n    </React.Suspense>\n  )\n}"
        },
        {
          "id": "components-dialog-features--new-issues",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const initialFocusRef = useRef(null)\n  return (\n    <>\n      <Button onClick={() => setIsOpen(true)}>Show dialog</Button>\n      {isOpen ? (\n        <Dialog\n          initialFocusRef={initialFocusRef}\n          onClose={onDialogClose}\n          title=\"New issue\"\n          renderBody={() => (\n            <ActionList>\n              <ActionList.LinkItem\n                ref={initialFocusRef}\n                href=\"https://github.com\"\n              >\n                Item 1\n              </ActionList.LinkItem>\n              <ActionList.LinkItem href=\"https://github.com\">\n                Link\n              </ActionList.LinkItem>\n            </ActionList>\n          )}\n        ></Dialog>\n      ) : null}\n    </>\n  )\n}"
        },
        {
          "id": "components-dialog-features--retains-focus-trap-with-dynamic-content",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [secondOpen, setSecondOpen] = useState(false)\n  const [expandContent, setExpandContent] = useState(false)\n  const [changeBodyContent, setChangeBodyContent] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const onDialogClose = useCallback(() => setIsOpen(false), [])\n  const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])\n  const openSecondDialog = useCallback(() => setSecondOpen(true), [])\n  const renderFooterConditionally = () => {\n    if (!changeBodyContent) return null\n    return (\n      <Dialog.Footer>\n        <Button variant=\"primary\">Submit</Button>\n      </Dialog.Footer>\n    )\n  }\n  return (\n    <>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        Show dialog\n      </Button>\n      {isOpen && (\n        <Dialog\n          title=\"My Dialog\"\n          onClose={onDialogClose}\n          renderFooter={renderFooterConditionally}\n        >\n          <Button onClick={() => setExpandContent(!expandContent)}>\n            Click me to dynamically {expandContent ? 'remove' : 'render'}{' '}\n            content\n          </Button>\n          <Button onClick={() => setChangeBodyContent(!changeBodyContent)}>\n            Click me to {changeBodyContent ? 'remove' : 'add'} a footer\n          </Button>\n          <Button onClick={openSecondDialog}>\n            Click me to open a new dialog\n          </Button>\n          {expandContent && (\n            <Box>\n              {lipsum}\n              <Button>Dialog Button Example 1</Button>\n              <Button>Dialog Button Example 2</Button>\n            </Box>\n          )}\n          {secondOpen && (\n            <Dialog\n              title=\"Inner dialog!\"\n              onClose={onSecondDialogClose}\n              width=\"small\"\n            >\n              Hello world\n            </Dialog>\n          )}\n        </Dialog>\n      )}\n    </>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "title",
          "type": "React.ReactNode",
          "description": "Title of the Dialog. Also serves as the aria-label for this Dialog."
        },
        {
          "name": "subtitle",
          "type": "React.ReactNode",
          "description": "The Dialog's subtitle. Optional. Rendered below the title in smaller type with less contrast. Also serves as the aria-describedby for this Dialog."
        },
        {
          "name": "renderHeader",
          "type": "React.FunctionComponent<React.PropsWithChildren<DialogHeaderProps>>",
          "description": "Provide a custom renderer for the dialog header. This content is rendered directly into the dialog body area, full bleed from edge to edge, top to the start of the body element. Warning: using a custom renderer may violate Primer UX principles."
        },
        {
          "name": "renderBody",
          "type": "React.FunctionComponent<React.PropsWithChildren<DialogProps>>",
          "description": "Provide a custom render function for the dialog body. This content is rendered directly into the dialog body area, full bleed from edge to edge, header to footer. Warning: using a custom renderer may violate Primer UX principles."
        },
        {
          "name": "renderFooter",
          "type": "React.FunctionComponent<React.PropsWithChildren<DialogProps>>",
          "description": "Provide a custom render function for the dialog footer. This content is rendered directly into the dialog footer area, full bleed from edge to edge, end of the body element to bottom. Warning: using a custom renderer may violate Primer UX principles."
        },
        {
          "name": "footerButtons",
          "type": "DialogButtonProps[]",
          "description": "Specifies the buttons to be rendered in the Dialog footer."
        },
        {
          "name": "onClose",
          "type": "(gesture: 'close-button' | 'escape') => void",
          "description": "This method is invoked when a gesture to close the dialog is used (either an Escape key press or clicking the 'X' in the top-right corner). The gesture argument indicates the gesture that was used to close the dialog (either 'close-button' or 'escape')."
        },
        {
          "name": "role",
          "type": "'dialog' | 'alertdialog'",
          "description": "The ARIA role to assign to this dialog. @see https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal\n@see https://www.w3.org/TR/wai-aria-practices-1.1/#alertdialog"
        },
        {
          "name": "width",
          "type": "'small' | 'medium' | 'large' | 'xlarge'",
          "description": "The width of the dialog.\nsmall: 296px\nmedium: 320px\nlarge: 480px\nxlarge: 640px"
        },
        {
          "name": "height",
          "type": "'small' | 'large' | 'auto'",
          "description": "The height of the dialog.\nsmall: 296x480\nlarge: 480x640\nauto: variable based on contents"
        },
        {
          "name": "returnFocusRef",
          "type": "React.RefObject<HTMLElement>",
          "describedby": "Return focus to this element when the Dialog closes, instead of the element that had focus immediately before the Dialog opened"
        },
        {
          "name": "initialFocusRef",
          "type": "React.RefObject<HTMLElement>",
          "description": "Focus this element when the Dialog opens"
        },
        {
          "name": "position",
          "type": "'center' | 'left' | 'right' | { narrow: 'center' | 'left' | 'right' | 'bottom' | 'fullscreen', regular: 'center' | 'left' | 'right' | 'bottom' | 'fullscreen', wide: 'center' | 'left' | 'right' | 'bottom' | 'fullscreen' }",
          "required": false,
          "description": "The position of the dialog",
          "defaultValue": ""
        },
        {
          "name": "className",
          "type": "string | undefined",
          "defaultValue": "",
          "description": "CSS string"
        }
      ],
      "subcomponents": [
        {
          "name": "Dialog.Body",
          "props": []
        },
        {
          "name": "Dialog.Buttons",
          "props": [
            {
              "name": "buttons",
              "type": "DialogButtonProps[] (see table below)",
              "required": true
            }
          ]
        },
        {
          "name": "Dialog.CloseButton",
          "props": [
            {
              "name": "onClose",
              "type": "() => void",
              "required": true,
              "description": "Callback for closing the Dialog",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "Dialog.Footer",
          "props": []
        },
        {
          "name": "Dialog.Header",
          "props": []
        },
        {
          "name": "Dialog.Title",
          "props": []
        },
        {
          "name": "DialogButtonProps",
          "props": [
            {
              "name": "buttonType",
              "type": "'default' | 'danger' | 'primary' | 'normal'",
              "description": "The variant of Button to use"
            },
            {
              "name": "content",
              "type": "React.ReactNode",
              "required": true,
              "description": "The Button's inner text"
            },
            {
              "name": "autoFocus",
              "type": "boolean",
              "description": "If true, and if this is the only button with autoFocus set to true, focus this button automatically when the dialog appears."
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>",
              "description": " A reference to the rendered Button’s DOM node, used together with `autoFocus` for `focusTrap`’s `initialFocus`."
            }
          ]
        }
      ]
    },
    "dialog": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/DialogV1",
      "id": "dialog",
      "docsId": "dialog",
      "name": "Dialog",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-dialog--default",
          "code": "() => {\n  const [isOpen, setIsOpen] = useState(false)\n  const returnFocusRef = useRef(null)\n  return (\n    <div>\n      <Box\n        sx={{\n          mb: 3,\n        }}\n      >\n        <Banner\n          title=\"Planned for deprecation\"\n          description={\n            <div data-a11y-link-underlines=\"true\">\n              There are plans to deprecate this component in a future release.\n              We recommend using{' '}\n              <Link\n                inline={true}\n                href=\"/?path=/story/components-dialog--default\"\n              >\n                Dialog\n              </Link>{' '}\n              instead.\n            </div>\n          }\n          variant=\"warning\"\n        />\n      </Box>\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/deprecated",
      "props": [
        {
          "name": "isOpen",
          "type": "boolean",
          "description": "Whether or not the dialog is open"
        },
        {
          "name": "onDismiss",
          "type": "() => void",
          "description": "Function that will be called when the dialog is closed"
        },
        {
          "name": "returnFocusRef",
          "type": " React.RefObject<HTMLElement>",
          "description": "The element to restore focus back to after the `Dialog` is closed"
        },
        {
          "name": "initialFocusRef",
          "type": " React.RefObject<HTMLElement>",
          "description": "Element inside of the `Dialog` you'd like to be focused when the Dialog is opened. If nothing is passed to `initialFocusRef` the close button is focused."
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "description": "Pass an id to use for the aria-label. Use either a `aria-label` or an `aria-labelledby` but not both."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Pass a label to be used to describe the Dialog. Use either a `aria-label` or an `aria-labelledby` but not both."
        },
        {
          "name": "narrow",
          "type": "boolean"
        },
        {
          "name": "wide",
          "type": "boolean"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "Dialog.Header",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "feature_flags": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/FeatureFlags",
      "id": "feature_flags",
      "name": "FeatureFlags",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "flags",
          "type": "FeatureFlags",
          "required": true,
          "description": "Object where keys are feature flag names and values are boolean"
        }
      ],
      "subcomponents": []
    },
    "flash": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Flash",
      "id": "flash",
      "name": "Flash",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-flash--default",
          "code": "() => <Flash>Default</Flash>"
        },
        {
          "id": "components-flash-features--success",
          "code": "() => (\n  <Flash\n    variant=\"success\"\n    sx={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\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={CheckCircleIcon} aria-label=\"Success\" />\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      Success\n    </Box>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--danger",
          "code": "() => (\n  <Flash\n    variant=\"danger\"\n    sx={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\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} aria-label=\"Danger\" />\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      Danger\n    </Box>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--warning",
          "code": "() => (\n  <Flash\n    variant=\"warning\"\n    sx={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\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={AlertIcon} aria-label=\"Warning\" />\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      Warning\n    </Box>\n  </Flash>\n)"
        },
        {
          "id": "components-flash-features--full",
          "code": "() => (\n  <Flash\n    full\n    sx={{\n      display: 'grid',\n      gridTemplateColumns: 'min-content 1fr minmax(0, auto)',\n      gridTemplateAreas: `'visual message actions'`,\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} aria-label=\"Info\" />\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      Full\n    </Box>\n  </Flash>\n)"
        },
        {
          "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} aria-label=\"Info\" />\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} aria-label=\"Info\" />\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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/FormControl",
      "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 id=\"autocomplete-label\">\n          Autocomplete\n        </FormControl.Label>\n        <Autocomplete>\n          <Autocomplete.Input block />\n          <Autocomplete.Overlay>\n            <Autocomplete.Menu\n              aria-labelledby=\"autocomplete-label\"\n              items={[\n                {\n                  text: 'css',\n                  id: '0',\n                },\n                {\n                  text: 'css-in-js',\n                  id: '1',\n                },\n                {\n                  text: 'styled-system',\n                  id: '2',\n                },\n                {\n                  text: 'javascript',\n                  id: '3',\n                },\n                {\n                  text: 'typescript',\n                  id: '4',\n                },\n                {\n                  text: 'react',\n                  id: '5',\n                },\n                {\n                  text: 'design-systems',\n                  id: '6',\n                },\n              ]}\n              selectedItemIds={[]}\n            />\n          </Autocomplete.Overlay>\n        </Autocomplete>\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Select</FormControl.Label>\n        <Select>\n          <Select.Option value=\"figma\">Figma</Select.Option>\n          <Select.Option value=\"css\">Primer CSS</Select.Option>\n          <Select.Option value=\"prc\">Primer React components</Select.Option>\n          <Select.Option value=\"pvc\">Primer ViewComponents</Select.Option>\n        </Select>\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Textarea</FormControl.Label>\n        <Textarea />\n      </FormControl>\n    </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\n            id=\"custom-checkbox-one\"\n            aria-describedby=\"custom-checkbox-one-caption\"\n            value=\"checkOne\"\n          />\n          <FormControl.Label htmlFor=\"custom-checkbox-one\">\n            Checkbox one\n          </FormControl.Label>\n          <FormControl.Caption id=\"custom-checkbox-one-caption\">\n            Hint text for checkbox one\n          </FormControl.Caption>\n        </FormControl>\n        <FormControl layout=\"horizontal\">\n          <CustomCheckboxInput\n            id=\"custom-checkbox-two\"\n            aria-describedby=\"custom-checkbox-two-caption\"\n            value=\"checkTwo\"\n          />\n          <FormControl.Label htmlFor=\"custom-checkbox-two\">\n            Checkbox two\n          </FormControl.Label>\n          <FormControl.Caption id=\"custom-checkbox-two-caption\">\n            Hint text for checkbox two\n          </FormControl.Caption>\n        </FormControl>\n      </CheckboxGroup>\n    </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-select-panel",
          "code": "() => {\n  const [selected, setSelected] = React.useState<ItemInput[]>([\n    items[0],\n    items[1],\n  ])\n  const [filter, setFilter] = React.useState('')\n  const filteredItems = items.filter((item) =>\n    item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl required>\n      <FormControl.Label id=\"select_panel_label\">\n        Select Labels\n      </FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, id, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            aria-labelledby={`select_panel_label selectpanel_wrapper`}\n            id={id}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            <span id=\"selectpanel_wrapper\">{children ?? 'Select Labels'}</span>\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-formcontrol-features--with-leading-visual",
          "code": "() => (\n  <Stack gap=\"none\">\n    <FormControl>\n      <FormControl.Label>Option one</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n    </FormControl>\n\n    <FormControl>\n      <FormControl.Label>Option two</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n      <FormControl.Caption>This one has a caption</FormControl.Caption>\n    </FormControl>\n\n    <FormControl disabled>\n      <FormControl.Label>Option three</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n    </FormControl>\n\n    <FormControl disabled>\n      <FormControl.Label>Option four</FormControl.Label>\n      <FormControl.LeadingVisual>\n        <MarkGithubIcon />\n      </FormControl.LeadingVisual>\n      <Checkbox />\n      <FormControl.Caption>This one has a caption</FormControl.Caption>\n    </FormControl>\n  </Stack>\n)"
        },
        {
          "id": "components-formcontrol-features--disabled-inputs",
          "code": "() => (\n  <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)"
        },
        {
          "id": "components-formcontrol-features--with-caption",
          "code": "() => (\n  <FormControl>\n    <FormControl.Label>Example label</FormControl.Label>\n    <TextInput />\n    <FormControl.Caption>Example caption</FormControl.Caption>\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-caption-and-disabled",
          "code": "() => (\n  <FormControl disabled>\n    <FormControl.Label>Example label</FormControl.Label>\n    <TextInput />\n    <FormControl.Caption>Example caption</FormControl.Caption>\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-hidden-label",
          "code": "() => (\n  <FormControl>\n    <FormControl.Label visuallyHidden>Example label</FormControl.Label>\n    <TextInput />\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-required-indicator",
          "code": "() => (\n  <FormControl required>\n    <FormControl.Label requiredIndicator>Example label</FormControl.Label>\n    <TextInput />\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-success-validation",
          "code": "() => (\n  <FormControl required>\n    <FormControl.Label requiredIndicator>Example label</FormControl.Label>\n    <TextInput defaultValue=\"Input value\" />\n    <FormControl.Validation variant=\"success\">\n      Example success validation message\n    </FormControl.Validation>\n  </FormControl>\n)"
        },
        {
          "id": "components-formcontrol-features--with-error-validation",
          "code": "() => (\n  <FormControl required>\n    <FormControl.Label requiredIndicator>Example label</FormControl.Label>\n    <TextInput defaultValue=\"Input value\" />\n    <FormControl.Validation variant=\"error\">\n      Example error validation message\n    </FormControl.Validation>\n  </FormControl>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "children",
          "type": "FormControl.Label | FormControl.Caption | FormControl.Validation | Autocomplete | TextInput | TextInputWithTokens | Select",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Whether the control allows user input"
        },
        {
          "name": "id",
          "type": "string",
          "defaultValue": "a generated string",
          "description": "The unique identifier for this control. Used to associate the label, validation text, and caption text"
        },
        {
          "name": "required",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the user must specify a value for the input before the owning form can be submitted"
        },
        {
          "name": "id",
          "type": "string",
          "description": "The unique identifier for this control. Used to associate the label, validation text, and caption text",
          "defaultValue": ""
        },
        {
          "name": "layout",
          "type": "'vertical' | 'horizontal'",
          "description": "The direction the content flows.\nVertical layout is used by default, and horizontal layout is used for checkbox and radio inputs.",
          "defaultValue": "vertical"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) for custom styling.",
          "defaultValue": ""
        },
        {
          "name": "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": "htmlFor",
              "type": "string",
              "description": "This prop may be used to override the `htmlFor` set from FormControl's React Context.\nThe unique identifier for the associated input",
              "defaultValue": ""
            },
            {
              "name": "id",
              "type": "string",
              "description": "When `as` prop is 'label', it may be used to override the `htmlFor` given to the <label> element by FormControl's React Context. \n When 'as' prop is 'legend' or 'span', it is used as the `id` for the element."
            },
            {
              "name": "className",
              "type": "string",
              "description": "Class name(s) for custom styling.",
              "defaultValue": ""
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "FormControl.Caption",
          "props": [
            {
              "name": "id",
              "type": "string",
              "description": "Custom ID to override the ID set by FormControl's React Context",
              "defaultValue": ""
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "description": "The content (usually just text) that is rendered to give contextual info about the field"
            },
            {
              "name": "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": "id",
              "type": "string",
              "description": "May be used to override the ID assigned by FormControl's React Context",
              "defaultValue": ""
            },
            {
              "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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)"
        },
        {
          "id": "components-header-features--with-many-items",
          "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>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item>Item</Header.Item>\n    <Header.Item\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)"
        }
      ],
      "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Heading",
      "id": "heading",
      "name": "Heading",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-heading--default",
          "code": "() => <Heading>Default H2 Heading</Heading>"
        },
        {
          "id": "components-heading-features--test-sx",
          "code": "() => (\n  <Heading\n    sx={{\n      fontSize: 2,\n      fontWeight: 'normal',\n    }}\n  >\n    Heading with sx override\n  </Heading>\n)"
        },
        {
          "id": "components-heading-features--small",
          "code": "() => <Heading variant=\"small\">Small heading</Heading>"
        },
        {
          "id": "components-heading-features--medium",
          "code": "() => <Heading variant=\"medium\">Medium heading</Heading>"
        },
        {
          "id": "components-heading-features--large",
          "code": "() => <Heading variant=\"large\">Large heading</Heading>"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "sx",
          "type": "SystemStyleObject"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"h2\""
        },
        {
          "name": "variant",
          "type": "'large' | 'medium' | 'small'"
        }
      ]
    },
    "hidden": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Hidden",
      "id": "hidden",
      "name": "Hidden",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-hidden--default",
          "code": "() => (\n  <>\n    <Text>\n      The below content is visible when the viewport is regular or wide but\n      hidden when narrow:\n    </Text>\n    <Hidden when=\"narrow\">\n      This is the said content and it is visible when the viewport is regular or\n      wide but hidden when narrow\n    </Hidden>\n  </>\n)"
        },
        {
          "id": "experimental-components-hidden-features--hide-content",
          "code": "() => (\n  <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": "experimental-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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/InlineMessage",
      "id": "inline_message",
      "name": "InlineMessage",
      "status": "alpha",
      "a11yReviewed": false,
      "importPath": "@primer/react/experimental",
      "stories": [
        {
          "id": "experimental-components-inlinemessage--default",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"unavailable\">\n      An example inline message\n    </InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--critical",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"critical\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--success",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"success\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--unavailable",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"unavailable\">\n      An example inline message\n    </InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--warning",
          "code": "() => {\n  return (\n    <InlineMessage variant=\"warning\">An example inline message</InlineMessage>\n  )\n}"
        },
        {
          "id": "experimental-components-inlinemessage-features--multiline",
          "code": "() => {\n  return (\n    <div\n      style={{\n        maxWidth: '30ch',\n      }}\n    >\n      <InlineMessage variant=\"success\">\n        An example inline message that spans multiple lines\n      </InlineMessage>\n    </div>\n  )\n}"
        }
      ],
      "props": [
        {
          "name": "size",
          "description": "Specify the size of the inline message",
          "type": "'small' | 'medium'",
          "defaultValue": "'medium'",
          "required": false
        },
        {
          "name": "variant",
          "description": "Specify the type of the inline message",
          "type": "'critical' | 'success' | 'unvailable' | 'warning'",
          "required": true
        }
      ]
    },
    "KeybindingHint": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/KeybindingHint",
      "id": "KeybindingHint",
      "name": "KeybindingHint",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-keybindinghint-features--on-emphasis",
          "code": "(args) => (\n  <Box\n    sx={{\n      backgroundColor: 'var(--bgColor-black)',\n      p: 3,\n    }}\n  >\n    <KeybindingHint {...args} />\n  </Box>\n)"
        },
        {
          "id": "experimental-components-keybindinghint-features--on-primary",
          "code": "(args) => (\n  <Box\n    sx={{\n      backgroundColor: 'var(--button-primary-bgColor-rest)',\n      p: 3,\n    }}\n  >\n    <KeybindingHint {...args} />\n  </Box>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "keys",
          "type": "string",
          "description": "The keys involved in this keybinding."
        },
        {
          "name": "format",
          "type": "'condensed' | 'full'",
          "defaultValue": "'condensed'",
          "description": "Control the display format."
        },
        {
          "name": "variant",
          "type": "'normal' | 'onEmphasis'",
          "defaultValue": "'normal'",
          "description": "Set to `onEmphasis` for display on 'emphasis' colors."
        },
        {
          "name": "size",
          "type": "'small' | 'normal'",
          "defaultValue": "'normal'",
          "description": "Control the size of the hint."
        }
      ],
      "subcomponents": []
    },
    "label": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Label",
      "id": "label",
      "name": "Label",
      "status": "alpha",
      "a11yReviewed": 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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/LabelGroup",
      "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"
        },
        {
          "name": "as",
          "description": "Customize the element type of the rendered container.",
          "defaultValue": "ul",
          "type": "React.ElementType"
        }
      ],
      "subcomponents": []
    },
    "link": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Link",
      "id": "link",
      "name": "Link",
      "status": "alpha",
      "a11yReviewed": 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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/NavList",
      "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": "inactiveText",
              "type": "string",
              "description": "Text to explain why this item is currently inactive and cannot be activated.",
              "defaultValue": ""
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLAnchorElement>"
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"a\""
            },
            {
              "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": "children",
              "type": "ReactNode",
              "required": true,
              "description": "A related set of NavList.Items",
              "defaultValue": ""
            },
            {
              "name": "title",
              "type": "string",
              "description": "The text that gets rendered as the group's heading. Alternatively, you can pass the `NavList.GroupHeading` component as a child of `NavList.Group`.\n If both `title` and `NavList.GroupHeading` are passed, `NavList.GroupHeading` will be rendered as the heading."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.GroupHeading",
          "props": [
            {
              "name": "auxiliaryText",
              "type": "string",
              "required": false,
              "description": "Secondary text which provides additional information about a `Group`.",
              "defaultValue": ""
            },
            {
              "name": "variant",
              "type": "'subtle' | 'filled'",
              "required": false,
              "description": "Style variations. Usage is discretionary.\n\n- `\"filled\"` - Superimposed on a background, offset from nearby content\n- `\"subtle\"` - Relatively less offset from nearby content",
              "defaultValue": ""
            },
            {
              "name": "visuallyHidden",
              "type": "boolean",
              "required": false,
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.Divider",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLElement>"
            }
          ]
        },
        {
          "name": "NavList.TrailingAction",
          "props": [
            {
              "name": "as",
              "type": "a | button",
              "defaultValue": "button",
              "required": false,
              "description": "HTML element to render as."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Acccessible name for the control."
            },
            {
              "name": "icon",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Octicon to pass into IconButton. When this is not set, TrailingAction renders as a `Button` instead of an `IconButton`."
            },
            {
              "name": "href",
              "type": "string",
              "description": "href when the TrailingAction is rendered as a link."
            }
          ]
        }
      ]
    },
    "octicon": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Octicon",
      "id": "octicon",
      "name": "Octicon",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-octicon--default",
          "code": "() => <Octicon icon={HeartFillIcon} aria-label=\"Like\" size={32} />"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Specifies the aria-label attribute, which is read verbatim by screen readers "
        },
        {
          "name": "icon",
          "type": "Component",
          "defaultValue": "",
          "description": "Checks the input by default in uncontrolled modeName of the [Octicon component](https://primer.style/octicons/) used in the"
        },
        {
          "name": "color",
          "type": "string",
          "defaultValue": "",
          "description": "Sets an override color for the Octicon. Compatible with colors from the [Primer color system](https://primer.style/primitives/colors).\""
        },
        {
          "name": "size",
          "type": "number",
          "defaultValue": "16",
          "description": "Sets the uniform `width` and `height` of the SVG element"
        },
        {
          "name": "verticalAlign",
          "type": "string",
          "defaultValue": "text-bottom",
          "description": "Sets the `vertical-align` CSS property"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "overlay": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Overlay",
      "id": "overlay",
      "name": "Overlay",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "private-components-overlay--default",
          "code": "(args: Args) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const confirmButtonRef = useRef<HTMLButtonElement>(null)\n  const anchorRef = useRef<HTMLDivElement>(null)\n  const closeOverlay = () => setIsOpen(false)\n  const containerRef = useRef<HTMLDivElement>(null)\n  useFocusTrap({\n    containerRef,\n    disabled: !isOpen,\n  })\n  return (\n    <Box ref={anchorRef}>\n      <Button\n        ref={buttonRef}\n        onClick={() => {\n          setIsOpen(!isOpen)\n        }}\n      >\n        Open overlay\n      </Button>\n      {isOpen || args.open ? (\n        <Overlay\n          initialFocusRef={confirmButtonRef}\n          returnFocusRef={buttonRef}\n          ignoreClickRefs={[buttonRef]}\n          onEscape={closeOverlay}\n          onClickOutside={closeOverlay}\n          width=\"large\"\n          anchorSide=\"inside-right\"\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-label=\"Sample overlay\"\n          ref={containerRef}\n        >\n          <Box\n            sx={{\n              height: '100vh',\n              maxWidth: 'calc(-1rem + 100vw)',\n              display: 'flex',\n              justifyContent: 'center',\n              alignItems: 'center',\n            }}\n          >\n            <IconButton\n              aria-label=\"Close\"\n              onClick={closeOverlay}\n              icon={XIcon}\n              variant=\"invisible\"\n              sx={{\n                position: 'absolute',\n                left: '5px',\n                top: '5px',\n              }}\n            />\n            <Text>Look! an overlay</Text>\n          </Box>\n        </Overlay>\n      ) : null}\n    </Box>\n  )\n}"
        },
        {
          "id": "private-components-overlay-features--dialog-overlay",
          "code": "({ anchorSide, role, open }: Args) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const confirmButtonRef = useRef<HTMLButtonElement>(null)\n  const anchorRef = useRef<HTMLDivElement>(null)\n  const closeOverlay = () => setIsOpen(false)\n  useFocusTrap({\n    containerRef,\n    disabled: !isOpen,\n    initialFocusRef: confirmButtonRef,\n    returnFocusRef: buttonRef,\n  })\n  return (\n    <Box ref={anchorRef}>\n      <Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>\n        open overlay\n      </Button>\n      {isOpen || open ? (\n        <Overlay\n          initialFocusRef={confirmButtonRef}\n          returnFocusRef={buttonRef}\n          ignoreClickRefs={[buttonRef]}\n          onEscape={closeOverlay}\n          onClickOutside={closeOverlay}\n          width=\"small\"\n          anchorSide={anchorSide}\n          role={role}\n          aria-modal={role === 'dialog' ? 'true' : undefined}\n          aria-label={role === 'dialog' ? 'Confirmation screen' : undefined}\n          ref={containerRef}\n        >\n          <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": "private-components-overlay-features--positioned-overlays",
          "code": "({ right, role, open }: Args) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [direction, setDirection] = useState<'left' | 'right'>(\n    right ? 'right' : 'left',\n  )\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const confirmButtonRef = useRef<HTMLButtonElement>(null)\n  const anchorRef = useRef<HTMLDivElement>(null)\n  const closeOverlay = () => setIsOpen(false)\n  const containerRef = useRef<HTMLDivElement>(null)\n  useFocusTrap({\n    containerRef,\n    disabled: !isOpen,\n  })\n  return (\n    <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 || open ? (\n        direction === 'left' ? (\n          <Overlay\n            initialFocusRef={confirmButtonRef}\n            returnFocusRef={buttonRef}\n            ignoreClickRefs={[buttonRef]}\n            onEscape={closeOverlay}\n            onClickOutside={closeOverlay}\n            width=\"auto\"\n            anchorSide=\"inside-right\"\n            role={role}\n            aria-modal={role === 'dialog' ? 'true' : undefined}\n            aria-label={role === 'dialog' ? 'Left aligned overlay' : undefined}\n            ref={containerRef}\n          >\n            <Box\n              sx={{\n                width: ['350px', '500px'],\n              }}\n            >\n              <Box\n                sx={{\n                  height: '100vh',\n                  maxWidth: 'calc(-1rem + 100vw)',\n                  display: 'flex',\n                  justifyContent: 'center',\n                  alignItems: 'center',\n                }}\n              >\n                <IconButton\n                  aria-label=\"Close\"\n                  onClick={closeOverlay}\n                  icon={XIcon}\n                  variant=\"invisible\"\n                  sx={{\n                    position: 'absolute',\n                    left: '5px',\n                    top: '5px',\n                  }}\n                />\n                <Text>Look! left aligned</Text>\n              </Box>\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            role={role}\n            aria-modal={role === 'dialog' ? 'true' : undefined}\n            aria-label={role === 'dialog' ? 'Right aligned overlay' : undefined}\n            ref={containerRef}\n          >\n            <Box\n              sx={{\n                width: ['350px', '500px'],\n              }}\n            >\n              <Box\n                sx={{\n                  height: '100vh',\n                  maxWidth: 'calc(-1rem + 100vw)',\n                  display: 'flex',\n                  justifyContent: 'center',\n                  alignItems: 'center',\n                }}\n              >\n                <IconButton\n                  aria-label=\"Close\"\n                  onClick={closeOverlay}\n                  icon={XIcon}\n                  variant=\"invisible\"\n                  sx={{\n                    position: 'absolute',\n                    right: '5px',\n                    top: '5px',\n                  }}\n                />\n                <Text>Look! right aligned</Text>\n              </Box>\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": "overflow",
          "type": "'hidden' | 'scroll' | 'auto' | 'visible'",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "preventOverflow",
          "type": "boolean",
          "defaultValue": "true",
          "description": "Determines if the Overlay width should be adjusted responsively if `width` is set to either `auto`, `medium` or lower and there is not enough space to display the Overlay. \nIf `preventOverflow` is set to `false`, the Overlay will be displayed at the maximum width that fits within the viewport."
        },
        {
          "name": "role",
          "type": "ARIA role - will most often be 'dialog' or 'menu'",
          "required": false,
          "description": "ARIA role to use for the overlay",
          "defaultValue": ""
        },
        {
          "name": "data-test-id",
          "type": "unknown",
          "required": false,
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "page_header": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/PageHeader",
      "id": "page_header",
      "name": "PageHeader",
      "status": "beta",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "components-pageheader-features--has-title-only",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--has-large-title",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea variant=\"large\">\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-leading-and-trailing-visuals",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.LeadingVisual>\n          <GitPullRequestIcon />\n        </PageHeader.LeadingVisual>\n        <PageHeader.Title>Title</PageHeader.Title>\n        <PageHeader.TrailingVisual>\n          <Label>Beta</Label>\n        </PageHeader.TrailingVisual>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-leading-visual-hidden-on-regular-viewport",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.LeadingVisual\n          hidden={{\n            regular: true,\n          }}\n        >\n          <GitPullRequestIcon />\n        </PageHeader.LeadingVisual>\n        <PageHeader.Title>Title</PageHeader.Title>\n        <PageHeader.TrailingVisual>\n          <Label>Beta</Label>\n        </PageHeader.TrailingVisual>\n      </PageHeader.TitleArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-actions",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Actions>\n        <IconButton aria-label=\"Workflows\" icon={WorkflowIcon} />\n        <IconButton aria-label=\"Insights\" icon={GraphIcon} />\n        <Button variant=\"primary\" trailingVisual={TriangleDownIcon}>\n          Add Item\n        </Button>\n        <IconButton aria-label=\"Settings\" icon={GearIcon} />\n      </PageHeader.Actions>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-description-slot",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Add-pageheader-docs\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>add-pageheader-docs</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Description>\n        <Text\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": "components-pageheader-features--with-navigation-slot",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Pull request title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Navigation>\n        <UnderlineNav aria-label=\"Pull Request\">\n          <UnderlineNav.Item\n            icon={CommentDiscussionIcon}\n            counter=\"12\"\n            aria-current=\"page\"\n          >\n            Conversation\n          </UnderlineNav.Item>\n          <UnderlineNav.Item counter={3} icon={GitCommitIcon}>\n            Commits\n          </UnderlineNav.Item>\n          <UnderlineNav.Item counter={7} icon={ChecklistIcon}>\n            Checks\n          </UnderlineNav.Item>\n          <UnderlineNav.Item counter={4} icon={FileDiffIcon}>\n            Files Changes\n          </UnderlineNav.Item>\n        </UnderlineNav>\n      </PageHeader.Navigation>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-custom-navigation",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Pull request title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Pull request title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Navigation as=\"nav\" aria-label=\"Item list\">\n        <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": "components-pageheader-features--with-leading-and-trailing-actions",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.LeadingAction>\n        <IconButton\n          aria-label=\"Expand\"\n          icon={SidebarExpandIcon}\n          variant=\"invisible\"\n        />\n      </PageHeader.LeadingAction>\n      <PageHeader.TrailingAction>\n        <IconButton aria-label=\"Edit\" icon={PencilIcon} variant=\"invisible\" />\n      </PageHeader.TrailingAction>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-parent-link-and-actions-of-context-area",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.ContextArea>\n        <PageHeader.ParentLink href=\"http://github.com\">\n          Parent Link\n        </PageHeader.ParentLink>\n\n        <PageHeader.ContextAreaActions>\n          <Button size=\"small\" trailingAction={TriangleDownIcon}>\n            Add File\n          </Button>\n          <IconButton\n            size=\"small\"\n            aria-label=\"More Options\"\n            icon={KebabHorizontalIcon}\n          />\n        </PageHeader.ContextAreaActions>\n      </PageHeader.ContextArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-context-bar-and-actions-of-context-area",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Title\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title>Title</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.ContextArea>\n        <PageHeader.ContextBar>\n          <Breadcrumbs>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main\">\n              react\n            </Breadcrumbs.Item>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src\">\n              src\n            </Breadcrumbs.Item>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/tree/main/src/PageHeader\">\n              PageHeader\n            </Breadcrumbs.Item>\n            <Breadcrumbs.Item href=\"https://github.com/primer/react/blob/main/src/PageHeader/PageHeader.tsx\">\n              PageHeader.tsx\n            </Breadcrumbs.Item>\n          </Breadcrumbs>\n        </PageHeader.ContextBar>\n        <PageHeader.ContextAreaActions>\n          <Button size=\"small\" leadingVisual={GitBranchIcon}>\n            Main\n          </Button>\n          <IconButton\n            size=\"small\"\n            aria-label=\"More Options\"\n            icon={KebabHorizontalIcon}\n          />\n        </PageHeader.ContextAreaActions>\n      </PageHeader.ContextArea>\n    </PageHeader>\n  </Box>\n)"
        },
        {
          "id": "components-pageheader-features--with-actions-that-have-responsive-content",
          "code": "() => (\n  <Box\n    sx={{\n      padding: 3,\n    }}\n  >\n    <PageHeader role=\"banner\" aria-label=\"Webhooks\">\n      <PageHeader.TitleArea>\n        <PageHeader.Title as=\"h2\">Webhooks</PageHeader.Title>\n      </PageHeader.TitleArea>\n      <PageHeader.Actions>\n        <Hidden when={['narrow']}>\n          <Button variant=\"primary\">New webhook</Button>\n        </Hidden>\n        <Hidden when={['regular', 'wide']}>\n          <Button variant=\"primary\">New</Button>\n        </Hidden>\n      </PageHeader.Actions>\n    </PageHeader>\n  </Box>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string | undefined",
          "defaultValue": "",
          "description": "A unique label for the rendered landmark"
        },
        {
          "name": "className",
          "type": "string | undefined",
          "defaultValue": "",
          "description": "CSS string"
        },
        {
          "name": "hidden",
          "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
          "defaultValue": "false",
          "description": "Whether the content is hidden.\n The component can be hidden for all viewport widths, or specified viewport widths.\n Some children have a default value for this prop:\n - `PageHeader.ContextArea`, `PageHeader.ContextAreaActions`, `PageHeader.ContextBar`, and `PageHeader.ParentLink` are hidden on regular and wide viewports by default.\n - - `PageHeader.LeadingAction`, and `PageHeader.TrailingAction` are hidden on narrow viewports by default."
        },
        {
          "name": "role",
          "type": "AriaRole",
          "description": "The ARIA role to assign to the top-level node of this component."
        },
        {
          "name": "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": "aria-label",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "A unique label for the rendered landmark"
            },
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "description": "The URL to link to."
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "`{ narrow: false regular: true wide: true }`",
              "description": "Whether the parent link is hidden."
            },
            {
              "name": "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.Breadcrumbs",
          "props": [
            {
              "name": "className",
              "type": "string | undefined",
              "defaultValue": "",
              "description": "CSS string"
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the content is hidden."
            },
            {
              "name": "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/PageLayout",
      "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 aria-label=\"Side 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.{' '}\n          <Link inline href=\"#foo\">\n            Plura de lorem Ispum.\n          </Link>\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            tabIndex={0}\n            role=\"region\"\n            aria-label=\"Page content\"\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\" aria-label=\"Side pane\">\n      <Placeholder height={320} label=\"Pane\" />\n    </PageLayout.Pane>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--scroll-container-within-page-layout-pane",
          "code": "() => (\n  <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\" aria-label=\"Side pane\">\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            tabIndex={0}\n            role=\"region\"\n            aria-label=\"Page content\"\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      aria-label=\"Side pane\"\n    >\n      <Placeholder height={320} label=\"Pane\" />\n    </PageLayout.Pane>\n    <PageLayout.Content>\n      <Placeholder height={640} label=\"Content\" />\n    </PageLayout.Content>\n    <PageLayout.Footer>\n      <Placeholder height={64} label=\"Footer\" />\n    </PageLayout.Footer>\n  </PageLayout>\n)"
        },
        {
          "id": "components-pagelayout-features--with-custom-pane-heading",
          "code": "() => (\n  <PageLayout containerWidth=\"full\">\n    <PageLayout.Header>\n      <Placeholder height={64} label=\"Header\" />\n    </PageLayout.Header>\n    <PageLayout.Pane resizable position=\"start\" aria-label=\"Side pane\">\n      <Heading\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": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "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": "position",
              "type": "'end' | 'start' | { narrow?: 'end' | 'start'; regular?: 'end' | 'start'; wide?: 'end' | 'start'; }",
              "description": "Which side of the page the pane should be on. Can be changed for different viewport widths.",
              "defaultValue": ""
            },
            {
              "name": "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Pagehead",
      "id": "pagehead",
      "name": "Pagehead",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-pagehead--default",
          "code": "() => (\n  <Pagehead>\n    <Heading as=\"h2\" variant=\"small\">\n      Pagehead\n    </Heading>\n  </Pagehead>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "as",
          "type": "string",
          "defaultValue": "div",
          "description": "Sets the underlying HTML tag for the component"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "pagination": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Pagination",
      "id": "pagination",
      "name": "Pagination",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-pagination--default",
          "code": "() => {\n  const [page, setPage] = useState(2)\n  return (\n    <Pagination\n      pageCount={15}\n      currentPage={page}\n      onPageChange={(e, n) => {\n        e.preventDefault()\n        setPage(n)\n      }}\n      showPages={{\n        narrow: false,\n      }}\n    />\n  )\n}"
        },
        {
          "id": "components-pagination-features--larger-page-count-margin",
          "code": "() => (\n  <Pagination\n    pageCount={15}\n    currentPage={5}\n    marginPageCount={4}\n    onPageChange={(e) => e.preventDefault()}\n  />\n)"
        },
        {
          "id": "components-pagination-features--hide-page-numbers",
          "code": "() => (\n  <Pagination\n    pageCount={15}\n    currentPage={5}\n    showPages={false}\n    onPageChange={(e) => e.preventDefault()}\n  />\n)"
        },
        {
          "id": "components-pagination-features--hide-page-numbers-by-viewport",
          "code": "() => (\n  <>\n    <Pagination\n      pageCount={15}\n      currentPage={5}\n      showPages={{\n        narrow: false,\n      }}\n      onPageChange={(e) => e.preventDefault()}\n    />\n    <p>Page numbers are hidden on narrow viewports.</p>\n  </>\n)"
        },
        {
          "id": "components-pagination-features--higher-surrounding-page-count",
          "code": "() => (\n  <Pagination\n    pageCount={15}\n    currentPage={5}\n    surroundingPageCount={4}\n    onPageChange={(e) => e.preventDefault()}\n  />\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "currentPage",
          "type": "number",
          "defaultValue": "",
          "required": true,
          "description": "The currently selected page."
        },
        {
          "name": "pageCount",
          "type": "number",
          "defaultValue": "",
          "required": true,
          "description": "The total number of pages."
        },
        {
          "name": "hrefBuilder",
          "type": "function",
          "defaultValue": "",
          "description": "A function to generate links based on page number."
        },
        {
          "name": "marginPageCount",
          "type": "number",
          "defaultValue": "1",
          "description": "How many pages to always show at the left and right of the component."
        },
        {
          "name": "onPageChange",
          "type": "function",
          "defaultValue": "(e: MouseEvent<Element, MouseEvent>, n: number) => void",
          "description": "Called with event and page number when a page is clicked."
        },
        {
          "name": "showPages",
          "type": "boolean | { narrow?: boolean, regular?: boolean, wide?: boolean }",
          "defaultValue": "true",
          "description": "Whether or not to show the individual page links."
        },
        {
          "name": "surroundingPageCount",
          "type": "number",
          "defaultValue": "2",
          "description": "How many pages to display on each side of the currently selected page."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "pointer_box": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/PointerBox",
      "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": "bg",
          "type": "string | string & (string | number | symbol | null)[] | string & { [x: string]: string | number | symbol | undefined; [x: number]: string | number | symbol | undefined; }",
          "description": "Background color of the box\nThe color utility parses a component's `color` and `bg` props and converts them into CSS declarations.\nBy default the raw value of the prop is returned.\n\nColor palettes can be configured with the ThemeProvider to use keys as prop values, with support for dot notation.\nArray values are converted into responsive values.\n\n[MDN Reference](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color)",
          "defaultValue": ""
        },
        {
          "name": "border",
          "type": "string | number | string & (Border<TLengthStyledSystem> | null)[] | string & { [x: string]: Border<TLengthStyledSystem> | undefined; [x: number]: Border<TLengthStyledSystem> | undefined; } | number & (Border<TLengthStyledSystem> | null)[] | number & { [x: string]: Border<TLengthStyledSystem> | undefined; [x: number]: Border<TLengthStyledSystem> | undefined; }",
          "description": "Width of the border around the box\nThe border CSS property sets an element's border. It's a shorthand for border-width, border-style,\nand border-color.\n\n[MDN reference](https://developer.mozilla.org/en-US/docs/Web/CSS/border)",
          "defaultValue": ""
        },
        {
          "name": "borderColor",
          "type": "string | string & (string | number | symbol | null)[] | string & { [x: string]: string | number | symbol | undefined; [x: number]: string | number | symbol | undefined; }",
          "description": "Color of the border around the box\nThe border-color shorthand CSS property sets the color of all sides of an element's border.\n\n[MDN reference](https://developer.mozilla.org/en-US/docs/Web/CSS/border-color)",
          "defaultValue": ""
        },
        {
          "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Portal",
      "id": "portal",
      "name": "Portal",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "behaviors-portal--default",
          "code": "() => (\n  <>\n    Root position\n    <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": "behaviors-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": "behaviors-portal-features--custom-portal-root-by-registration",
          "code": "() => {\n  const outerContainerRef = React.useRef<HTMLDivElement>(null)\n  const [mounted, setMounted] = React.useState(false)\n  React.useEffect(() => {\n    if (outerContainerRef.current instanceof HTMLElement) {\n      registerPortalRoot(outerContainerRef.current)\n      setMounted(true)\n    }\n  }, [])\n  return (\n    <>\n      Root position\n      <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": "behaviors-portal-features--multiple-portal-roots",
          "code": "() => {\n  const outerContainerRef = React.useRef<HTMLDivElement>(null)\n  const innerContainerRef = React.useRef<HTMLDivElement>(null)\n  const [mounted, setMounted] = React.useState(false)\n  React.useEffect(() => {\n    if (\n      outerContainerRef.current instanceof HTMLElement &&\n      innerContainerRef.current instanceof HTMLElement\n    ) {\n      registerPortalRoot(outerContainerRef.current, 'outer')\n      registerPortalRoot(innerContainerRef.current, 'inner')\n      setMounted(true)\n    }\n  }, [outerContainerRef])\n  return (\n    <>\n      Root position\n      <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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ProgressBar",
      "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>\n    <ProgressBar.Item\n      progress={33}\n      aria-label=\"Photo Usage\"\n      sx={{\n        bg: 'accent.emphasis',\n      }}\n    />\n    <ProgressBar.Item\n      progress={23}\n      aria-label=\"Application Usage\"\n      bg={'danger.emphasis'}\n    />\n    <ProgressBar.Item\n      progress={14}\n      aria-label=\"Music Usage\"\n      bg={'severe.emphasis'}\n    />\n  </ProgressBar>\n)"
        },
        {
          "id": "components-progressbar-features--animated",
          "code": "() => <ProgressBar progress=\"50\" aria-label=\"Upload test.png\" animated />"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "animated",
          "type": "boolean",
          "description": "Whether the filled in area(s) of the progress bar will be animated or not"
        },
        {
          "name": "progress",
          "type": "number",
          "defaultValue": "0",
          "description": "Used to set the size of the green bar"
        },
        {
          "name": "barSize",
          "type": "| 'small' | 'large' | 'default'",
          "defaultValue": "'default'",
          "description": "Controls the height of the progress bar. If omitted, height is set to the default height."
        },
        {
          "name": "inline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Styles the progress bar inline"
        },
        {
          "name": "bg",
          "type": "string",
          "defaultValue": "'bg.successInverse'",
          "description": "Set the progress bar color"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "ProgressBar.Item",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "Defines a string value that labels the current element.\n@see aria-labelledby.",
              "defaultValue": ""
            },
            {
              "name": "bg",
              "type": "string",
              "description": "Set the progress segment color",
              "defaultValue": "success.emphasis"
            },
            {
              "name": "progress",
              "type": "string | number",
              "description": "Used to set the size of the green bar",
              "defaultValue": "0"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "radio": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/RadioGroup",
      "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.Caption",
          "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/RelativeTime",
      "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 (\n    <RelativeTime\n      noTitle={true}\n      {...rest}\n      date={new Date(date)}\n      format=\"micro\"\n    />\n  )\n}"
        },
        {
          "id": "components-relativetime-features--recent-time",
          "code": "(args) => {\n  const { ...rest } = args\n  return <RelativeTime noTitle={true} {...rest} date={new Date()} />\n}"
        },
        {
          "id": "components-relativetime-features--count-down-timer",
          "code": "(args) => {\n  const { ...rest } = args\n  return <RelativeTime noTitle={true} {...rest} />\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "datetime",
          "type": "string",
          "defaultValue": "",
          "required": true,
          "description": "An ISO8601 time representing the time"
        },
        {
          "name": "date",
          "type": "string",
          "defaultValue": "",
          "description": "Instead of passing the `datetime`, it is possible to pass a full `Date` object into the `date` prop"
        },
        {
          "name": "format",
          "type": "'auto' | 'micro' | 'elapsed'",
          "defaultValue": "'auto'",
          "description": "The format with which to display the time"
        },
        {
          "name": "tense",
          "type": "'auto' | 'past' | 'future'",
          "defaultValue": "'auto'",
          "description": "The tense to use when displaying a relative time"
        },
        {
          "name": "precision",
          "type": "'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'",
          "defaultValue": "'second'",
          "description": "The precision to use when displaying an elapsed time"
        },
        {
          "name": "threshold",
          "type": "string",
          "defaultValue": "'P30D'",
          "description": "The threshold (ISO8601 duration) to display relative dates within"
        },
        {
          "name": "prefix",
          "type": "string",
          "defaultValue": "'on'",
          "description": "The prefix to use when displaying a localised (non relative) date"
        },
        {
          "name": "second",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render seconds"
        },
        {
          "name": "minute",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render minutes"
        },
        {
          "name": "hour",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render hours"
        },
        {
          "name": "weekday",
          "type": "'short' | 'long' | 'narrow'",
          "defaultValue": "",
          "description": "The format with which to render weekdays"
        },
        {
          "name": "day",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render days"
        },
        {
          "name": "month",
          "type": "'numeric' | '2-digit' | 'short' | 'long' | 'narrow'",
          "defaultValue": "'numeric'",
          "description": "The format with which to render months"
        },
        {
          "name": "year",
          "type": "'numeric' | '2-digit'",
          "defaultValue": "",
          "description": "The format with which to render years"
        },
        {
          "name": "timeZoneName",
          "type": "'long' | 'short' | 'shortOffset' | 'longOffset' | 'shortGeneric' | 'longGeneric'",
          "defaultValue": "",
          "description": "The format with which to render the time zone"
        },
        {
          "name": "ref",
          "type": "React.RefObject<RelativeTimeElement>"
        },
        {
          "name": "noTitle",
          "type": "boolean",
          "defaultValue": "",
          "description": "Removes the `title` attribute provided on the element by default"
        },
        {
          "name": "attributeChangedCallback",
          "type": "(attrName: string, oldValue: unknown, newValue: unknown) => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "connectedCallback",
          "type": "() => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "onRelativeTimeUpdated",
          "type": "null | (event: RelativeTimeUpdatedEvent) => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "update",
          "type": "() => void",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "\"relative-time\""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "segmented_control": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SegmentedControl",
      "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": "size",
          "type": "'small' | 'medium'",
          "description": "The size of the buttons",
          "defaultValue": ""
        },
        {
          "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": "size",
              "type": "'small' | 'medium'",
              "defaultValue": "",
              "description": "The size of the buttons"
            },
            {
              "name": "defaultSelected",
              "type": "boolean",
              "defaultValue": "",
              "description": "Whether the segment is selected. This is used for uncontrolled SegmentedControls to pick one SegmentedControlButton that is selected on the initial render."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            },
            {
              "name": "ref",
              "type": "React.RefObject<HTMLButtonElement>"
            },
            {
              "name": "tooltipDirection",
              "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
              "required": false
            },
            {
              "name": "description",
              "type": "string",
              "required": false,
              "description": "If `description` is provided, we will use a Tooltip to describe the button. Then `aria-label` is used to label the button.",
              "defaultValue": ""
            }
          ]
        }
      ]
    },
    "select": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Select",
      "id": "select",
      "name": "Select",
      "status": "alpha",
      "a11yReviewed": 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    <Heading as=\"h2\" variant=\"small\">\n      Primer form title\n    </Heading>\n    <FormControl>\n      <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n      <Select>\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n      <FormControl.Caption>\n        Label is visually hidden; the title describes the purpose visually\n      </FormControl.Caption>\n    </FormControl>\n  </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)"
        },
        {
          "id": "components-select-features--with-placeholder-option",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Select placeholder=\"No choice selected\">\n        <Select.Option value=\"one\">Choice one</Select.Option>\n        <Select.Option value=\"two\">Choice two</Select.Option>\n        <Select.Option value=\"three\">Choice three</Select.Option>\n        <Select.Option value=\"four\">Choice four</Select.Option>\n        <Select.Option value=\"five\">Choice five</Select.Option>\n        <Select.Option value=\"six\">Choice six</Select.Option>\n      </Select>\n    </FormControl>\n  </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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SelectPanel",
      "id": "select_panel",
      "docsId": "select_panel",
      "name": "SelectPanel",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-selectpanel--default",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter(\n    (item) =>\n      // design guidelines say to always show selected items in the list\n      selected.some((selectedItem) => selectedItem.text === item.text) ||\n      // then filter the rest\n      item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    const aIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === a.text,\n    )\n    const bIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === b.text,\n    )\n    if (aIsSelected && !bIsSelected) return -1\n    if (!aIsSelected && bIsSelected) return 1\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\" // button text when no items are selected\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={selectedItemsSortedFirst}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-item-dividers",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter(\n    (item) =>\n      // design guidelines say to always show selected items in the list\n      selected.some((selectedItem) => selectedItem.text === item.text) ||\n      // then filter the rest\n      item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    const aIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === a.text,\n    )\n    const bIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === b.text,\n    )\n    if (aIsSelected && !bIsSelected) return -1\n    if (!aIsSelected && bIsSelected) return 1\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\" // button text when no items are selected\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={selectedItemsSortedFirst}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        showItemDividers={true}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-placeholder-for-search-input",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter(\n    (item) =>\n      // design guidelines say to always show selected items in the list\n      selected.some((selectedItem) => selectedItem.text === item.text) ||\n      // then filter the rest\n      item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    const aIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === a.text,\n    )\n    const bIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === b.text,\n    )\n    if (aIsSelected && !bIsSelected) return -1\n    if (!aIsSelected && bIsSelected) return 1\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\" // button text when no items are selected\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        placeholderText=\"Filter labels\"\n        open={open}\n        onOpenChange={setOpen}\n        items={selectedItemsSortedFirst}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--single-select",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput | undefined>(items[0])\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter(\n    (item) =>\n      item.text === selected?.text ||\n      item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    if (a.text === selected?.text) return -1\n    if (b.text === selected?.text) return 1\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Label</FormControl.Label>\n      <SelectPanel\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button trailingAction={TriangleDownIcon} {...anchorProps}>\n            {children ?? 'Select Labels'}\n          </Button>\n        )}\n        placeholder=\"Select labels\" // button text when no items are selected\n        open={open}\n        onOpenChange={setOpen}\n        items={selectedItemsSortedFirst}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        overlayProps={{\n          width: 'small',\n          height: 'xsmall',\n        }}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--multi-select",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter(\n    (item) =>\n      // design guidelines say to always show selected items in the list\n      selected.some((selectedItem) => selectedItem.text === item.text) ||\n      // then filter the rest\n      item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    const aIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === a.text,\n    )\n    const bIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === b.text,\n    )\n    if (aIsSelected && !bIsSelected) return -1\n    if (!aIsSelected && bIsSelected) return 1\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        title=\"Select labels\"\n        placeholder=\"Select labels\"\n        subtitle=\"Use labels to organize issues and pull requests\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button\n            trailingAction={TriangleDownIcon}\n            {...anchorProps}\n            aria-haspopup=\"dialog\"\n          >\n            {children}\n          </Button>\n        )}\n        open={open}\n        onOpenChange={setOpen}\n        items={selectedItemsSortedFirst}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-external-anchor",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter(\n    (item) =>\n      // design guidelines say to always show selected items in the list\n      selected.some((selectedItem) => selectedItem.text === item.text) ||\n      // then filter the rest\n      item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    const aIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === a.text,\n    )\n    const bIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === b.text,\n    )\n    if (aIsSelected && !bIsSelected) return -1\n    if (!aIsSelected && bIsSelected) return 1\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <Button\n        trailingAction={TriangleDownIcon}\n        ref={buttonRef}\n        onClick={() => setOpen(!open)}\n      >\n        {selected.map((selectedItem) => selectedItem.text).join(', ') ||\n          'Select labels'}\n      </Button>\n      <SelectPanel\n        renderAnchor={null}\n        anchorRef={buttonRef}\n        open={open}\n        onOpenChange={setOpen}\n        items={filteredItems}\n        selected={selectedItemsSortedFirst}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        overlayProps={{\n          width: 'small',\n          height: 'xsmall',\n        }}\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-footer",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>(items.slice(1, 3))\n  const [filter, setFilter] = useState('')\n  const filteredItems = items.filter(\n    (item) =>\n      // design guidelines say to always show selected items in the list\n      selected.some((selectedItem) => selectedItem.text === item.text) ||\n      // then filter the rest\n      item.text.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    const aIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === a.text,\n    )\n    const bIsSelected = selected.some(\n      (selectedItem) => selectedItem.text === b.text,\n    )\n    if (aIsSelected && !bIsSelected) return -1\n    if (!aIsSelected && bIsSelected) return 1\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Labels</FormControl.Label>\n      <SelectPanel\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button trailingAction={TriangleDownIcon} {...anchorProps}>\n            {children}\n          </Button>\n        )}\n        placeholder=\"Select labels\" // button text when no items are selected\n        open={open}\n        onOpenChange={setOpen}\n        items={selectedItemsSortedFirst}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        overlayProps={{\n          width: 'small',\n          height: 'medium',\n        }}\n        footer={\n          <Button size=\"small\" block>\n            Edit labels\n          </Button>\n        }\n      />\n    </FormControl>\n  )\n}"
        },
        {
          "id": "components-selectpanel-features--with-groups",
          "code": "() => {\n  const [selected, setSelected] = useState<ItemInput[]>([])\n  const [filter, setFilter] = useState('')\n  const filteredItems = listOfItems.filter(\n    (item) =>\n      // design guidelines say to always show selected item in the list\n      selected.some((selectedItem) => selectedItem.text === item.text) ||\n      // then filter the rest\n      item.text?.toLowerCase().startsWith(filter.toLowerCase()),\n  )\n  // design guidelines say to sort selected items first\n  const selectedItemsSortedFirst = filteredItems.sort((a, b) => {\n    if (a.groupId === b.groupId) {\n      const aIsSelected = selected.some(\n        (selectedItem) => selectedItem.text === a.text,\n      )\n      const bIsSelected = selected.some(\n        (selectedItem) => selectedItem.text === b.text,\n      )\n      if (aIsSelected && !bIsSelected) return -1\n      if (!aIsSelected && bIsSelected) return 1\n    }\n    return 0\n  })\n  const [open, setOpen] = useState(false)\n  return (\n    <FormControl>\n      <FormControl.Label>Options</FormControl.Label>\n      <SelectPanel\n        title=\"Attach files and symbols\"\n        subtitle=\"Choose which files and symbols you want to chat about. Use fewer references for more accurate responses.\"\n        renderAnchor={({ children, ...anchorProps }) => (\n          <Button trailingAction={TriangleDownIcon} {...anchorProps}>\n            {children}\n          </Button>\n        )}\n        placeholder=\"Select options\" // button text when no items are selected\n        groupMetadata={groupMetadata}\n        open={open}\n        onOpenChange={setOpen}\n        items={selectedItemsSortedFirst}\n        selected={selected}\n        onSelectedChange={setSelected}\n        onFilterChange={setFilter}\n        overlayProps={{\n          width: 'large',\n          height: 'xlarge',\n        }}\n      />\n    </FormControl>\n  )\n}"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "items",
          "type": "ItemInput[]",
          "required": true,
          "description": "A collection of `Item` props and `Item`-level custom `Item` renderers.",
          "defaultValue": ""
        },
        {
          "name": "title",
          "type": "string | React.ReactElement",
          "defaultValue": "\"Select an item\" or \"Select items\"",
          "description": "A descriptive title for the panel"
        },
        {
          "name": "subtitle",
          "type": "string | React.ReactElement",
          "defaultValue": "",
          "description": "When provided, a subtitle is displayed below the title"
        },
        {
          "name": "onOpenChange",
          "type": "( open: boolean, gesture: | 'anchor-click' | 'anchor-key-press' | 'click-outside' | 'escape' | 'selection' ) => void",
          "defaultValue": "",
          "required": true,
          "description": ""
        },
        {
          "name": "placeholder",
          "type": "string",
          "defaultValue": "",
          "description": "Text used in anchor when there are no selected items"
        },
        {
          "name": "placeholderText",
          "type": "string",
          "defaultValue": "Filter items",
          "description": "Text used as placeholder for search input"
        },
        {
          "name": "inputLabel",
          "type": "string",
          "defaultValue": "Same as placeholderText",
          "description": "The aria-label for the filter input"
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "aria-label to attach to the base DOM node of the list",
          "defaultValue": ""
        },
        {
          "name": "filterValue",
          "type": "string",
          "description": "The current value of the search input",
          "defaultValue": ""
        },
        {
          "name": "selected",
          "type": "ItemInput | ItemInput[] | undefined",
          "defaultValue": "",
          "required": true,
          "description": "Specify the selected item(s)"
        },
        {
          "name": "open",
          "type": "boolean",
          "required": true,
          "description": "Determines whether the overlay portion of the component should be shown or not",
          "defaultValue": ""
        },
        {
          "name": "anchorId",
          "type": "string",
          "description": "An override to the internal id that will be spread on to the renderAnchor",
          "defaultValue": ""
        },
        {
          "name": "anchorRef",
          "type": "RefObject<HTMLElement>",
          "description": "An override to the internal renderAnchor ref that will be used to position the overlay.\nWhen renderAnchor is null this can be used to make an anchor that is detached from ActionMenu.\nAn override to the internal ref that will be spread on to the renderAnchor",
          "defaultValue": ""
        },
        {
          "name": "onSelectedChange",
          "type": "(selected: ItemInput | ItemInput[]) => void",
          "defaultValue": "",
          "required": true,
          "description": "Provide a callback called when the selected item(s) change"
        },
        {
          "name": "onFilterChange",
          "type": "(value: string, e: ChangeEvent<HTMLInputElement>) => void",
          "description": "Callback when the search input changes",
          "defaultValue": ""
        },
        {
          "name": "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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\" />"
        },
        {
          "id": "components-spinner-features--suppress-screen-reader-text",
          "code": "() => (\n  <Box\n    sx={{\n      alignItems: 'center',\n      display: 'flex',\n      gap: '0.25rem',\n    }}\n  >\n    <Spinner size=\"small\" srText={null} />\n    <AriaStatus>Loading...</AriaStatus>\n  </Box>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "size",
          "type": "'small' | 'medium' | 'large'",
          "description": "Sets the width and height of the spinner."
        },
        {
          "name": "srText",
          "type": "string | null",
          "defaultValue": "Loading",
          "description": "Sets the text conveyed by assistive technologies such as screen readers. Set to `null` if the loading state is displayed in a text node somewhere else on the page."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Sets the text conveyed by assistive technologies such as screen readers.",
          "deprecated": true
        },
        {
          "name": "className",
          "type": "string",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "data-*",
          "type": "string"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "split_page_layout": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SplitPageLayout",
      "id": "split_page_layout",
      "name": "SplitPageLayout",
      "status": "alpha",
      "a11yReviewed": 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\" aria-label=\"Pane\">\n      <Placeholder label=\"Pane\" height={400} />\n    </SplitPageLayout.Pane>\n    <SplitPageLayout.Content>\n      <Placeholder label=\"Content\" height={600} />\n    </SplitPageLayout.Content>\n    <SplitPageLayout.Footer>\n      <Placeholder label=\"Footer\" height={100} />\n    </SplitPageLayout.Footer>\n  </SplitPageLayout>\n)"
        },
        {
          "id": "components-splitpagelayout-features--settings-page",
          "code": "() => (\n  <SplitPageLayout>\n    <SplitPageLayout.Pane position=\"start\" aria-label=\"Navigation Pane\">\n      <NavList aria-label=\"Main navigation\">\n        <NavList.Item href=\"#\">Profile</NavList.Item>\n        <NavList.Item href=\"#\" aria-current=\"page\">\n          Account\n        </NavList.Item>\n        <NavList.Item href=\"#\">Emails</NavList.Item>\n        <NavList.Item href=\"#\">Notifications</NavList.Item>\n      </NavList>\n    </SplitPageLayout.Pane>\n    <SplitPageLayout.Content>\n      <Heading\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": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the header."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'line'",
              "description": ""
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the header is hidden."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "SplitPageLayout.Content",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "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": "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": "true",
              "description": "Whether the pane should stick to the top of the screen while the content scrolls."
            },
            {
              "name": "offsetHeader",
              "type": "number | string",
              "defaultValue": "0",
              "description": "Use offsetHeader along with the sticky prop to push the sticky pane down to make room for a sticky header if necessary. Use the type `string` to specify the height with a unit i.e. 5rem; otherwise the type `number` will be taken as px."
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the pane."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'line'",
              "description": ""
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the pane is hidden."
            },
            {
              "name": "position",
              "type": "'end' | 'start' | {narrow?: 'end' | 'start', narrow?: 'end' | 'start', wide?: 'end' | 'start'}",
              "description": "Which side of the page the pane should be on. Can be changed for different viewport widths.",
              "defaultValue": "start"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "SplitPageLayout.Footer",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "description": "A unique label for the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "An id to an element which uniquely labels the rendered main landmark",
              "defaultValue": ""
            },
            {
              "name": "padding",
              "type": "| 'none' | 'condensed' | 'normal'",
              "defaultValue": "'normal'",
              "description": "The amount of padding inside the footer."
            },
            {
              "name": "divider",
              "type": "| 'none' | 'line' | { narrow?: | 'none' | 'line' | 'filled' regular?: | 'none' | 'line' wide?: | 'none' | 'line' }",
              "defaultValue": "'line'",
              "description": ""
            },
            {
              "name": "hidden",
              "type": "| boolean | { narrow?: boolean regular?: boolean wide?: boolean }",
              "defaultValue": "false",
              "description": "Whether the footer is hidden."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "stack": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Stack",
      "id": "stack",
      "name": "Stack",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-stack--default",
          "code": "() => (\n  <Stack>\n    <div\n      style={{\n        background: 'var(--display-lemon-bgColor-muted)',\n        borderRadius: 'var(--borderRadius-medium)',\n        padding: 'var(--base-size-8)',\n      }}\n    >\n      First\n    </div>\n    <div\n      style={{\n        background: 'var(--display-olive-bgColor-muted)',\n        borderRadius: 'var(--borderRadius-medium)',\n        padding: 'var(--base-size-8)',\n      }}\n    >\n      Second\n    </div>\n    <div\n      style={{\n        background: 'var(--display-lime-bgColor-muted)',\n        borderRadius: 'var(--borderRadius-medium)',\n        padding: 'var(--base-size-8)',\n      }}\n    >\n      Third\n    </div>\n  </Stack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "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."
        },
        {
          "name": "className",
          "type": "string"
        }
      ],
      "subcomponents": [
        {
          "name": "Stack.Item",
          "props": [
            {
              "name": "grow",
              "type": "boolean | ResponsiveValue<boolean>",
              "description": "Allow item to keep size or expand to fill the available space."
            },
            {
              "name": "className",
              "type": "string"
            }
          ]
        }
      ]
    },
    "state_label": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/StateLabel",
      "id": "state_label",
      "name": "StateLabel",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-statelabel-features--issue-opened",
          "code": "() => <StateLabel status=\"issueOpened\">Open</StateLabel>"
        },
        {
          "id": "components-statelabel-features--issue-closed",
          "code": "() => <StateLabel status=\"issueClosed\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--issue-closed-not-planned",
          "code": "() => <StateLabel status=\"issueClosedNotPlanned\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--issue-draft",
          "code": "() => <StateLabel status=\"issueDraft\">Draft</StateLabel>"
        },
        {
          "id": "components-statelabel-features--pull-opened",
          "code": "() => <StateLabel status=\"pullOpened\">Open</StateLabel>"
        },
        {
          "id": "components-statelabel-features--pull-closed",
          "code": "() => <StateLabel status=\"pullClosed\">Closed</StateLabel>"
        },
        {
          "id": "components-statelabel-features--pull-merged",
          "code": "() => <StateLabel status=\"pullMerged\">Merged</StateLabel>"
        },
        {
          "id": "components-statelabel-features--queued",
          "code": "() => <StateLabel status=\"pullQueued\">Queued</StateLabel>"
        },
        {
          "id": "components-statelabel-features--draft",
          "code": "() => <StateLabel status=\"draft\">Draft</StateLabel>"
        },
        {
          "id": "components-statelabel-features--unavailable",
          "code": "() => <StateLabel status=\"unavailable\">Unavailable</StateLabel>"
        },
        {
          "id": "components-statelabel-features--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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/SubNav",
      "id": "sub_nav",
      "name": "SubNav",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-subnav-features--selected",
          "code": "() => (\n  <SubNav aria-label=\"Main\">\n    <SubNav.Links>\n      <SubNav.Link href=\"#home\" selected>\n        Home\n      </SubNav.Link>\n      <SubNav.Link href=\"#documentation\">Documentation</SubNav.Link>\n      <SubNav.Link href=\"#support\">Support</SubNav.Link>\n    </SubNav.Links>\n  </SubNav>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "actions",
          "type": "React.ReactNode",
          "description": "Place another element, such as a button, to the opposite side of the navigation items."
        },
        {
          "name": "align",
          "type": "'right'",
          "description": "Use `right` to have navigation items aligned right."
        },
        {
          "name": "full",
          "type": "boolean",
          "description": "Used to make navigation fill the width of the container."
        },
        {
          "name": "label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element.",
          "defaultValue": ""
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "SubNav.Link",
          "props": [
            {
              "name": "as",
              "type": "React.ElementType",
              "default": "'a'"
            },
            {
              "name": "href",
              "type": "string"
            },
            {
              "name": "selected",
              "type": "boolean",
              "description": "Whether this item represents the current page"
            },
            {
              "name": "to",
              "type": "string | Partial<Path>",
              "description": "Used when the item is rendered using a component like React Router's `Link`. The path to navigate to."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "SubNav.Links",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "tab_nav": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TabNav",
      "id": "tab_nav",
      "name": "TabNav",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-tabnav--default",
          "code": "() => (\n  <TabNav aria-label=\"Main\">\n    <TabNav.Link href=\"#\" selected>\n      Home\n    </TabNav.Link>\n    <TabNav.Link href=\"#\">Documentation</TabNav.Link>\n    <TabNav.Link href=\"#\">Support</TabNav.Link>\n  </TabNav>\n)"
        },
        {
          "id": "deprecated-components-tabnav-features--selected",
          "code": "() => (\n  <TabNav aria-label=\"Main\">\n    <TabNav.Link href=\"#\">Home</TabNav.Link>\n    <TabNav.Link href=\"#\" selected>\n      Documentation\n    </TabNav.Link>\n    <TabNav.Link href=\"#\">Support</TabNav.Link>\n  </TabNav>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "description": "Used to set the `aria-label` on the top level `<nav>` element."
        },
        {
          "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": "to",
              "type": "string | Partial<Path>",
              "description": "Used when the item is rendered using a component like React Router's `Link`. The path to navigate to."
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        }
      ]
    },
    "text": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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    size=\"small\"\n  >\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--size-small",
          "code": "() => (\n  <Text as=\"span\" size=\"small\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--size-medium",
          "code": "() => (\n  <Text as=\"span\" size=\"medium\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--size-large",
          "code": "() => (\n  <Text as=\"span\" size=\"large\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--light-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"light\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--normal-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"normal\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--medium-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"medium\">\n    Stylized text\n  </Text>\n)"
        },
        {
          "id": "components-text-features--semibold-weight",
          "code": "() => (\n  <Text as=\"span\" weight=\"semibold\">\n    Stylized text\n  </Text>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "as",
          "defaultValue": "'span'",
          "type": "React.ElementType"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        },
        {
          "name": "size",
          "type": "'large' | 'medium' | 'small'"
        },
        {
          "name": "weight",
          "type": "'light' | 'normal' | 'medium' | 'semibold'"
        },
        {
          "name": "whiteSpace",
          "type": "'pre' | 'normal' | 'nowrap' | 'pre-wrap' | 'pre-line'"
        }
      ],
      "subcomponents": []
    },
    "text_input": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TextInput",
      "id": "text_input",
      "name": "TextInput",
      "status": "alpha",
      "a11yReviewed": 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    <Heading as=\"h2\" variant=\"small\">\n      Primer form title\n    </Heading>\n    <FormControl>\n      <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n      <TextInput />\n      <FormControl.Caption>\n        Label is visually hidden; the title describes the purpose visually\n      </FormControl.Caption>\n    </FormControl>\n  </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  const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput leadingVisual={Checkmark} />\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Enter monies</FormControl.Label>\n        <TextInput leadingVisual=\"$\" />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-trailing-icon",
          "code": "() => {\n  const Checkmark = () => <CheckIcon aria-label=\"Checkmark\" />\n  return (\n    <Box>\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput trailingVisual={Checkmark} />\n      </FormControl>\n      <FormControl>\n        <FormControl.Label>Enter monies</FormControl.Label>\n        <TextInput trailingVisual=\"minutes\" placeholder=\"200\" />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-trailing-action",
          "code": "() => {\n  const [value, setValue] = useState('sample text')\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(event.target.value)\n  }\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput\n          value={value}\n          onChange={handleChange}\n          trailingAction={\n            <Stack\n              justify=\"center\"\n              style={{\n                minWidth: '34px',\n              }}\n            >\n              {value.length ? (\n                <TextInput.Action\n                  onClick={() => setValue('')}\n                  icon={XCircleFillIcon}\n                  aria-label=\"Clear input\"\n                />\n              ) : undefined}\n            </Stack>\n          }\n        />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-tooltip-direction",
          "code": "() => {\n  const [value, setValue] = useState('sample text')\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(event.target.value)\n  }\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInput\n          value={value}\n          onChange={handleChange}\n          trailingAction={\n            <Stack\n              justify=\"center\"\n              style={{\n                minWidth: '34px',\n              }}\n            >\n              {value.length ? (\n                <TextInput.Action\n                  onClick={() => setValue('')}\n                  icon={XCircleFillIcon}\n                  aria-label=\"Clear input\"\n                  tooltipDirection=\"nw\"\n                />\n              ) : undefined}\n            </Stack>\n          }\n        />\n      </FormControl>\n    </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={Calendar} {...args} value=\"auto\" />\n        </FormControl>\n      </Box>\n      <Box mb={2}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={Calendar}\n            {...args}\n            loaderPosition=\"leading\"\n            value=\"leading\"\n          />\n        </FormControl>\n      </Box>\n      <Box mb={5}>\n        <FormControl>\n          <FormControl.Label>Default label</FormControl.Label>\n          <TextInput\n            leadingVisual={Calendar}\n            {...args}\n            loaderPosition=\"trailing\"\n            value=\"trailing\"\n          />\n        </FormControl>\n      </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={Calendar} {...args} value=\"auto\" />\n          </FormControl>\n        </Box>\n        <Box mb={2}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput\n              trailingVisual={Calendar}\n              {...args}\n              loaderPosition=\"leading\"\n              value=\"leading\"\n            />\n          </FormControl>\n        </Box>\n        <Box mb={5}>\n          <FormControl>\n            <FormControl.Label>Default label</FormControl.Label>\n            <TextInput\n              trailingVisual={Calendar}\n              {...args}\n              loaderPosition=\"trailing\"\n              value=\"trailing\"\n            />\n          </FormControl>\n        </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={Calendar}\n            trailingVisual={Calendar}\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={Calendar}\n            trailingVisual={Calendar}\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={Calendar}\n            trailingVisual={Calendar}\n            {...args}\n            loaderPosition=\"trailing\"\n            value=\"trailing\"\n          />\n        </FormControl>\n      </Box>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinput-features--with-autocomplete-attribute",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>First name</FormControl.Label>\n      <TextInput autoComplete=\"given-name\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Last name</FormControl.Label>\n      <TextInput autoComplete=\"family-name\" />\n    </FormControl>\n  </Box>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Gives the input an accessible name."
        },
        {
          "name": "autoComplete",
          "type": "string",
          "defaultValue": "",
          "description": "Allows input to autofill based on value given."
        },
        {
          "name": "block",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Creates a full-width input element"
        },
        {
          "name": "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": "loaderText",
          "type": "string",
          "defaultValue": "Loading",
          "description": "Text for screen readers to convey the loading state, should be descriptive and explain what is loading. This prop should only be used if there is visible context explaining what is loading, to ensure that context is provided to all users."
        },
        {
          "name": "leadingVisual",
          "type": "string | React.ComponentType",
          "defaultValue": "",
          "description": "Visual positioned on the left edge inside the input"
        },
        {
          "name": "monospace",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Shows input in monospace font"
        },
        {
          "name": "trailingVisual",
          "type": "string | React.ComponentType",
          "defaultValue": "",
          "description": "Visual positioned on the right edge inside the input"
        },
        {
          "name": "trailingAction",
          "type": "React.ReactElement<HTMLProps<HTMLButtonElement>>",
          "defaultValue": "",
          "description": "A visual that renders inside the input after the typing area"
        },
        {
          "name": "validationStatus",
          "type": "'error' | 'success'",
          "defaultValue": "",
          "description": "Style the input to match the status"
        },
        {
          "name": "variant",
          "type": "'small' | 'medium' | 'large'",
          "defaultValue": "",
          "deprecated": true,
          "description": "(Use size) Creates a smaller or larger input than the default."
        },
        {
          "name": "width",
          "type": "string | number | 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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TextInputWithTokens",
      "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}"
        },
        {
          "id": "components-textinputwithtokens-features--prevent-tokens-from-wrapping",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          preventTokenWrapping\n        />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinputwithtokens-features--max-height",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 7))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <Box\n      sx={{\n        maxWidth: '300px',\n      }}\n    >\n      {/* Setting max-width to force tokens to wrap and demo `maxHeight` behavior */}\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          maxHeight={70}\n          block // `block` only needed to fill parent width without overflowing\n        />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinputwithtokens-features--size",
          "code": "() => {\n  const [tokens, setTokens] = useState([...mockTokens].slice(0, 3))\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          size=\"small\"\n        />\n      </FormControl>\n    </Box>\n  )\n}"
        },
        {
          "id": "components-textinputwithtokens-features--truncated",
          "code": "() => {\n  const [tokens, setTokens] = useState(mockTokens)\n  const onTokenRemove: (tokenId: string | number) => void = (tokenId) => {\n    setTokens(tokens.filter((token) => token.id !== tokenId))\n  }\n  return (\n    <Box as=\"form\">\n      <FormControl>\n        <FormControl.Label>Default label</FormControl.Label>\n        <TextInputWithTokens\n          tokens={tokens}\n          onTokenRemove={onTokenRemove}\n          visibleTokenCount={5}\n        />\n      </FormControl>\n    </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"
        }
      ],
      "passthrough": {
        "element": "TextInput",
        "url": "/react/TextInput"
      },
      "subcomponents": []
    },
    "textarea": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Textarea",
      "id": "textarea",
      "name": "Textarea",
      "status": "alpha",
      "a11yReviewed": 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    <Heading as=\"h2\" variant=\"small\">\n      Primer form title\n    </Heading>\n    <FormControl>\n      <FormControl.Label visuallyHidden>Primer form label</FormControl.Label>\n      <Textarea />\n      <FormControl.Caption>\n        Label is visually hidden; the title describes the purpose visually\n      </FormControl.Caption>\n    </FormControl>\n  </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)"
        },
        {
          "id": "components-textarea-features--custom-height",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea rows={3} />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textarea-features--custom-width",
          "code": "() => (\n  <Box as=\"form\">\n    <FormControl>\n      <FormControl.Label>Default label</FormControl.Label>\n      <Textarea cols={60} />\n    </FormControl>\n  </Box>\n)"
        },
        {
          "id": "components-textarea-features--custom-resize-behavior",
          "code": "() => (\n  <Stack as=\"form\">\n    <FormControl>\n      <FormControl.Label>\n        Resize in either direction (default)\n      </FormControl.Label>\n      <Textarea resize=\"both\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>No resize</FormControl.Label>\n      <Textarea resize=\"none\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Horizontal resize</FormControl.Label>\n      <Textarea resize=\"horizontal\" />\n    </FormControl>\n    <FormControl>\n      <FormControl.Label>Vertical resize</FormControl.Label>\n      <Textarea resize=\"vertical\" />\n    </FormControl>\n  </Stack>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "required",
          "type": "boolean",
          "defaultValue": "",
          "description": "Indicates to the user and assistive technologies that the field value is required"
        },
        {
          "name": "cols",
          "type": "number",
          "defaultValue": "",
          "description": "Specifies the visible width of a text area."
        },
        {
          "name": "rows",
          "type": "number",
          "defaultValue": "",
          "description": "Specifies the visible height of a text area."
        },
        {
          "name": "block",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Expands with width of the component to fill the parent elements"
        },
        {
          "name": "resize",
          "type": "'both' | 'horizontal' | 'vertical' | 'none'",
          "defaultValue": "'both'",
          "description": "Changes the resize behavior"
        },
        {
          "name": "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"
        },
        {
          "name": "className",
          "type": "string | undefined",
          "description": "The className to apply to the wrapper element"
        }
      ],
      "subcomponents": []
    },
    "timeline": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--clip-sidebar",
          "code": "() => (\n  <Timeline clipSidebar>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--condensed-items",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item condensed>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Item condensed>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\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\n          icon={GitMergeIcon}\n          color=\"fg.onEmphasis\"\n          aria-label=\"Merged\"\n        />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n    <Timeline.Break />\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitBranchIcon} aria-label=\"Branch\" />\n      </Timeline.Badge>\n      <Timeline.Body>This is a message</Timeline.Body>\n    </Timeline.Item>\n  </Timeline>\n)"
        },
        {
          "id": "components-timeline-features--with-inline-links",
          "code": "() => (\n  <Timeline>\n    <Timeline.Item>\n      <Timeline.Badge>\n        <Octicon icon={GitCommitIcon} aria-label=\"Commit\" />\n      </Timeline.Badge>\n      <Timeline.Body>\n        <Link\n          href=\"#\"\n          sx={{\n            fontWeight: 'bold',\n            color: 'fg.default',\n            mr: 1,\n            '&:hover': {\n              color: 'var(--fgColor-accent)',\n            },\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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/ToggleSwitch",
      "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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/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    </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    </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    </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    </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      </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": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Tooltip",
      "id": "tooltip",
      "name": "Tooltip",
      "docsId": "tooltip",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-tooltip--default",
          "code": "() => (\n  <>\n    <Box\n      sx={{\n        mb: 3,\n      }}\n    >\n      <Banner\n        title=\"Planned for deprecation\"\n        description={\n          <div data-a11y-link-underlines=\"true\">\n            There are plans to deprecate this component in a future release. We\n            recommend using{' '}\n            <Link\n              inline={true}\n              href=\"/?path=/story/components-tooltipv2--default\"\n            >\n              Tooltip\n            </Link>{' '}\n            instead.\n          </div>\n        }\n        variant=\"warning\"\n      />\n    </Box>\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  </>\n)"
        },
        {
          "id": "deprecated-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": "deprecated-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/deprecated",
      "props": [
        {
          "name": "align",
          "type": "'left' | 'right'"
        },
        {
          "name": "direction",
          "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'",
          "defaultValue": "n",
          "description": "Sets where the tooltip renders in relation to the target."
        },
        {
          "name": "noDelay",
          "type": "boolean",
          "description": "When set to `true`, tooltip appears without any delay."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Text used in `aria-label` (for accessibility)"
        },
        {
          "name": "wrap",
          "type": "boolean",
          "description": "Use `true` to allow text within tooltip to wrap."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "tooltip_v2": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TooltipV2",
      "id": "tooltip_v2",
      "name": "Tooltip",
      "docsId": "tooltip",
      "status": "beta",
      "a11yReviewed": 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-tooltipv2-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-tooltipv2-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-tooltipv2-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-tooltipv2-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-tooltipv2-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-tooltipv2-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-tooltipv2-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-tooltipv2-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": "keybindingHint",
          "type": "string",
          "description": "Optional keybinding hint to indicate the availability of a keyboard shortcut. Supported syntax is described in the docs for the `KeybindingHint` component."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "tree_view": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/TreeView",
      "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\" truncate={false}>\n      <TreeView.Item id=\"src\" defaultExpanded>\n        <TreeView.LeadingVisual>\n          <TreeView.DirectoryIcon />\n        </TreeView.LeadingVisual>\n        src\n        <TreeView.SubTree>\n          <TreeView.Item id=\"src/Avatar.tsx\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            Avatar.tsx\n          </TreeView.Item>\n          <TreeView.Item id=\"src/Button\" current>\n            <TreeView.LeadingVisual>\n              <TreeView.DirectoryIcon />\n            </TreeView.LeadingVisual>\n            Button\n            <TreeView.SubTree>\n              <TreeView.Item id=\"src/Button/Button.tsx\">\n                <TreeView.LeadingVisual>\n                  <FileIcon />\n                </TreeView.LeadingVisual>\n                Button.tsx\n              </TreeView.Item>\n              <TreeView.Item id=\"src/Button/Button.test.tsx\">\n                <TreeView.LeadingVisual>\n                  <FileIcon />\n                </TreeView.LeadingVisual>\n                Button.test.tsx\n              </TreeView.Item>\n            </TreeView.SubTree>\n          </TreeView.Item>\n          <TreeView.Item id=\"src/ReallyLongFileNameThatShouldBeTruncated.tsx\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            ReallyLongFileNameThatShouldBeTruncated.tsx\n          </TreeView.Item>\n        </TreeView.SubTree>\n      </TreeView.Item>\n      <TreeView.Item\n        id=\"public\"\n        // eslint-disable-next-line no-console\n        onExpandedChange={(isExpanded) =>\n          console.log(\n            `${isExpanded ? 'Expanded' : 'Collapsed'} \"public\" folder `,\n          )\n        }\n      >\n        <TreeView.LeadingVisual>\n          <TreeView.DirectoryIcon />\n        </TreeView.LeadingVisual>\n        public\n        <TreeView.SubTree>\n          <TreeView.Item id=\"public/index.html\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            index.html\n          </TreeView.Item>\n          <TreeView.Item id=\"public/favicon.ico\">\n            <TreeView.LeadingVisual>\n              <FileIcon />\n            </TreeView.LeadingVisual>\n            favicon.ico\n          </TreeView.Item>\n        </TreeView.SubTree>\n      </TreeView.Item>\n      <TreeView.Item id=\"package.json\">\n        <TreeView.LeadingVisual>\n          <FileIcon />\n        </TreeView.LeadingVisual>\n        package.json\n      </TreeView.Item>\n    </TreeView>\n  </nav>\n)"
        },
        {
          "id": "components-treeview-features--files-changed",
          "code": "() => {\n  return (\n    <nav aria-label=\"Files\">\n      <TreeView aria-label=\"Files\" truncate={false}>\n        <TreeView.Item id=\"src\" defaultExpanded>\n          <TreeView.LeadingVisual>\n            <TreeView.DirectoryIcon />\n          </TreeView.LeadingVisual>\n          src\n          <TreeView.SubTree>\n            <TreeView.Item id=\"src/Avatar.tsx\">\n              <TreeView.LeadingVisual>\n                <FileIcon />\n              </TreeView.LeadingVisual>\n              Avatar.tsx\n              <TreeView.TrailingVisual label=\"added\">\n                <Octicon icon={DiffAddedIcon} 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": "aria-label",
          "type": "string",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "description": "",
          "defaultValue": ""
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name(s) used to customize styles",
          "defaultValue": ""
        },
        {
          "name": "flat",
          "type": "boolean",
          "description": "Prevents the tree from indenting items. This should only be used when the tree is used to display a flat list of items."
        },
        {
          "name": "truncate",
          "type": "boolean",
          "description": "Whether to truncate node text",
          "defaultValue": "true"
        },
        {
          "name": "children",
          "type": "React.ReactNode",
          "required": true
        }
      ],
      "subcomponents": [
        {
          "name": "TreeView.Item",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "required": true
            },
            {
              "name": "id",
              "type": "string",
              "required": true,
              "description": "A unique identifier for the item."
            },
            {
              "name": "aria-label",
              "type": "string",
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "description": "",
              "defaultValue": ""
            },
            {
              "name": "className",
              "type": "string",
              "description": "Class name(s) used to customize styles",
              "defaultValue": ""
            },
            {
              "name": "current",
              "type": "boolean",
              "defaultValue": "false",
              "description": "Indicates whether the item is the current item. No more than one item should be current at once. The path to the current item will be expanded by default."
            },
            {
              "name": "defaultExpanded",
              "type": "boolean",
              "description": "The expanded state of the item when it is initially rendered. Use when you do not need to control the state."
            },
            {
              "name": "expanded",
              "type": "boolean",
              "description": "The controlled expanded state of item. Must be used in conjunction with onExpandedChange."
            },
            {
              "name": "containIntrinsicSize",
              "type": "string",
              "description": "The size of this item's contents. Passing this will set 'content-visiblity: auto' on the content container, delaying rendering until the item is in the viewport."
            },
            {
              "name": "onExpandedChange",
              "type": "(expanded: boolean) => void",
              "description": "Event handler called when the expanded state of the item changes."
            },
            {
              "name": "onSelect",
              "type": "(event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) => void"
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "true",
              "description": "Truncate the item's text content with an ellipsis."
            },
            {
              "name": "ref",
              "type": "React.Ref<HTMLElement>"
            }
          ]
        },
        {
          "name": "TreeView.LeadingVisual",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "| React.ReactNode\n| (props: {isExpanded: boolean}) => React.ReactNode)"
            },
            {
              "name": "label",
              "type": "string",
              "description": "Provide an accessible label for the visual. This is not necessary for decorative visuals."
            }
          ]
        },
        {
          "name": "TreeView.TrailingVisual",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "| React.ReactNode\n| (props: {isExpanded: boolean}) => React.ReactNode)"
            },
            {
              "name": "label",
              "type": "string",
              "description": "Provide an accessible label for the visual. This is not necessary for decorative visuals."
            }
          ]
        },
        {
          "name": "TreeView.DirectoryIcon",
          "props": []
        },
        {
          "name": "TreeView.SubTree",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode"
            },
            {
              "name": "state",
              "type": "| 'initial'\n| 'loading'\n| 'done'\n| 'error'",
              "description": "Specify a state if items in the subtree are loaded asynchronously. An asynchronous subtree can be in one of the following states: 'initial', 'loading', 'done', or 'error'. In the 'initial' state, items are neither loaded nor loading. In the 'loading' state, items are loading and the subtree will render a loading indicator. In the 'done' state, items are loaded. Screen readers will announce when a subtree enters the 'done' state. An 'error' state means that an error 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": "aria-label",
              "type": "string",
              "description": "An accessible name for the subtree. It is recommended that you provide a short version of the parent list item's name as the name of the subtree."
            }
          ]
        },
        {
          "name": "TreeView.ErrorDialog",
          "props": [
            {
              "name": "children",
              "required": true,
              "type": "React.ReactNode",
              "description": "The content of the dialog. This is usually a message explaining the error."
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "'Error'",
              "description": "The title of the dialog. This is usually a short description of the error."
            },
            {
              "name": "onRetry",
              "type": "() => void",
              "description": "Event handler called when the user clicks the retry button."
            },
            {
              "name": "onDismiss",
              "type": "() => void",
              "description": "Event handler called when the dialog is dismissed."
            }
          ]
        }
      ]
    },
    "truncate": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/Truncate",
      "id": "truncate",
      "name": "Truncate",
      "status": "alpha",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "components-truncate--default",
          "code": "() => <Truncate title=\"Some example text\">Some example text</Truncate>"
        },
        {
          "id": "components-truncate-features--expandable",
          "code": "() => (\n  <Truncate title=\"Hover this example text\" expandable>\n    Hover this example text\n  </Truncate>\n)"
        },
        {
          "id": "components-truncate-features--inline",
          "code": "() => (\n  <>\n    <ArrowRightIcon />\n    <Truncate title=\"Inline example text\" inline>\n      Inline example text\n    </Truncate>\n    <ArrowLeftIcon />\n  </>\n)"
        },
        {
          "id": "components-truncate-features--max-width",
          "code": "() => (\n  <Truncate title=\"Some example text with a max width\" maxWidth={200}>\n    Some example text with a max width\n  </Truncate>\n)"
        }
      ],
      "importPath": "@primer/react",
      "props": [
        {
          "name": "maxWidth",
          "type": "number",
          "defaultValue": "125",
          "description": "Sets the max-width of the text."
        },
        {
          "name": "inline",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Displays text as inline block and vertical aligns to the top."
        },
        {
          "name": "expandable",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Allows the truncated text to be displayed on hover."
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "'div'"
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "underline_nav": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/UnderlineNav",
      "id": "underline_nav",
      "name": "UnderlineNav",
      "status": "beta",
      "a11yReviewed": true,
      "stories": [
        {
          "id": "components-underlinenav-features--default",
          "code": "() => {\n  const children = ['Code', 'Pull requests', 'Actions', 'Projects', 'Wiki']\n  return (\n    <UnderlineNav aria-label=\"Repository\">\n      {children.map((child: string, index: number) => (\n        <UnderlineNavItem\n          key={index}\n          href=\"#\"\n          aria-current={index === 0 ? 'page' : undefined}\n        >\n          {child}\n        </UnderlineNavItem>\n      ))}\n    </UnderlineNav>\n  )\n}"
        },
        {
          "id": "components-underlinenav-features--with-icons",
          "code": "() => {\n  return (\n    <UnderlineNav aria-label=\"Repository with icons\">\n      <UnderlineNav.Item 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": "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 | string",
              "defaultValue": "",
              "description": "The number to display in the counter label."
            },
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "description": "The URL that the item navigates to. 'href' is passed to the underlying '<a>' element. If 'as' is specified, the component may need different props and 'href' is ignored. (Required prop for the react router is 'to' for example)"
            },
            {
              "name": "icon",
              "type": "Component",
              "defaultValue": "",
              "description": "The leading icon comes before item label"
            },
            {
              "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"
          }
        }
      ]
    },
    "filtered_search": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/deprecated/FilteredSearch",
      "id": "filtered_search",
      "name": "FilteredSearch",
      "status": "deprecated",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "deprecated-components-filteredsearch--default",
          "code": "() => (\n  <FilteredSearch>\n    <ActionMenu>\n      <ActionMenu.Button as=\"summary\">Filter</ActionMenu.Button>\n      <ActionMenu.Overlay>\n        <ActionList>\n          <ActionList.Item>Item 1</ActionList.Item>\n          <ActionList.Item>Item 2</ActionList.Item>\n          <ActionList.Item>Item 3</ActionList.Item>\n        </ActionList>\n      </ActionMenu.Overlay>\n    </ActionMenu>\n    <TextInput aria-label=\"Filtered search\" leadingVisual={SearchIcon} />\n  </FilteredSearch>\n)"
        }
      ],
      "importPath": "@primer/react/deprecated",
      "props": [
        {
          "name": "children",
          "type": "React.ReactNode",
          "description": "FilteredSearch is expected to contain an `ActionMenu` followed by a `TextInput`."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "legacy_underline_nav": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/deprecated/UnderlineNav",
      "id": "legacy_underline_nav",
      "name": "UnderlineNav",
      "status": "deprecated",
      "a11yReviewed": 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"
            }
          ]
        }
      ]
    },
    "issue_label": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/IssueLabel",
      "id": "issue_label",
      "name": "IssueLabel",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-issuelabel--default",
          "code": "() => <IssueLabel text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-pink",
          "code": "() => <IssueLabel variant=\"pink\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-plum",
          "code": "() => <IssueLabel variant=\"plum\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-purple",
          "code": "() => <IssueLabel variant=\"purple\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-indigo",
          "code": "() => <IssueLabel variant=\"indigo\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-blue",
          "code": "() => <IssueLabel variant=\"blue\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-cyan",
          "code": "() => <IssueLabel variant=\"cyan\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-teal",
          "code": "() => <IssueLabel variant=\"teal\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-pine",
          "code": "() => <IssueLabel variant=\"pine\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-green",
          "code": "() => <IssueLabel variant=\"green\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-lime",
          "code": "() => <IssueLabel variant=\"lime\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-olive",
          "code": "() => <IssueLabel variant=\"olive\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-lemon",
          "code": "() => <IssueLabel variant=\"lemon\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-yellow",
          "code": "() => <IssueLabel variant=\"yellow\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-orange",
          "code": "() => <IssueLabel variant=\"orange\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-red",
          "code": "() => <IssueLabel variant=\"red\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-coral",
          "code": "() => <IssueLabel variant=\"coral\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-gray",
          "code": "() => <IssueLabel variant=\"gray\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-brown",
          "code": "() => <IssueLabel variant=\"brown\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--variant-auburn",
          "code": "() => <IssueLabel variant=\"auburn\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--hex-color",
          "code": "(args: { fillColor: `#${string}` }) => (\n  <IssueLabel text=\"Issue label\" fillColor={args.fillColor} />\n)"
        },
        {
          "id": "experimental-components-issuelabel-features--as-link",
          "code": "() => <IssueLabel href=\"/\" text=\"Issue label\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--as-button",
          "code": "() => <IssueLabel text=\"Issue label\" as=\"button\" />"
        },
        {
          "id": "experimental-components-issuelabel-features--on-click",
          "code": "() => <IssueLabel text=\"Issue label\" onClick={() => alert('clicked')} />"
        },
        {
          "id": "experimental-components-issuelabel-features--group-of-labels",
          "code": "() => (\n  <Stack direction=\"horizontal\" gap=\"condensed\" wrap=\"wrap\">\n    <IssueLabel variant=\"blue\" text=\"Issue label\" />\n    <IssueLabel variant=\"purple\" text=\"Another label\" />\n    <IssueLabel variant=\"green\" text=\"A third label\" />\n    <IssueLabel variant=\"orange\" text=\"Issue label\" />\n    <IssueLabel variant=\"yellow\" text=\"Another label\" />\n    <IssueLabel variant=\"brown\" text=\"A third label\" />\n  </Stack>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "fillColor",
          "type": "string",
          "description": "The hex code for a custom background color"
        },
        {
          "name": "variant",
          "type": "'pink'\n| 'plum'\n| 'purple'\n| 'indigo'\n| 'blue'\n| 'cyan'\n| 'teal'\n| 'pine'\n| 'green'\n| 'lime'\n| 'olive'\n| 'lemon'\n| 'yellow'\n| 'orange'\n| 'red'\n| 'coral'\n| 'gray'\n| 'brown'\n| 'auburn'",
          "defaultValue": "'gray'",
          "description": "Color variant for the background and text color"
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling."
        },
        {
          "name": "href",
          "type": "string"
        },
        {
          "name": "as",
          "type": "React.ElementType",
          "defaultValue": "'span'"
        },
        {
          "name": "text",
          "type": "string",
          "description": "Label text."
        },
        {
          "name": "id",
          "type": "string",
          "description": "A unique identifier that can be associated with the label."
        }
      ],
      "subcomponents": []
    },
    "select_panel_v2": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/SelectPanel2",
      "id": "select_panel_v2",
      "docsId": "select_panel",
      "name": "SelectPanel",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-selectpanel--default",
          "code": "() => {\n  const initialSelectedLabels = data.issue.labelIds // mock initial state: has selected labels\n  const [selectedLabelIds, setSelectedLabelIds] = React.useState<string[]>(\n    initialSelectedLabels,\n  )\n\n  /* Selection */\n  const onLabelSelect = (labelId: string) => {\n    if (!selectedLabelIds.includes(labelId))\n      setSelectedLabelIds([...selectedLabelIds, labelId])\n    else setSelectedLabelIds(selectedLabelIds.filter((id) => id !== labelId))\n  }\n  const onClearSelection = () => {\n    setSelectedLabelIds([])\n  }\n  const onSubmit = () => {\n    data.issue.labelIds = selectedLabelIds // pretending to persist changes\n  }\n  const onCancel = () => {\n    setSelectedLabelIds(initialSelectedLabels)\n  }\n\n  /* Filtering */\n  const [filteredLabels, setFilteredLabels] = React.useState(data.labels)\n  const [query, setQuery] = React.useState('')\n  const onSearchInputChange: React.ChangeEventHandler<HTMLInputElement> = (\n    event,\n  ) => {\n    const query = event.currentTarget.value\n    setQuery(query)\n    if (query === '') setFilteredLabels(data.labels)\n    else {\n      setFilteredLabels(\n        data.labels\n          .map((label) => {\n            if (label.name.toLowerCase().startsWith(query))\n              return {\n                priority: 1,\n                label,\n              }\n            else if (label.name.toLowerCase().includes(query))\n              return {\n                priority: 2,\n                label,\n              }\n            else if (label.description?.toLowerCase().includes(query))\n              return {\n                priority: 3,\n                label,\n              }\n            else\n              return {\n                priority: -1,\n                label,\n              }\n          })\n          .filter((result) => result.priority > 0)\n          .map((result) => result.label),\n      )\n    }\n  }\n  const sortingFn = (\n    itemA: {\n      id: string\n    },\n    itemB: {\n      id: string\n    },\n  ) => {\n    const initialSelectedIds = data.issue.labelIds\n    if (\n      initialSelectedIds.includes(itemA.id) &&\n      initialSelectedIds.includes(itemB.id)\n    )\n      return 1\n    else if (initialSelectedIds.includes(itemA.id)) return -1\n    else if (initialSelectedIds.includes(itemB.id)) return 1\n    else return 1\n  }\n  const itemsToShow = query ? filteredLabels : data.labels.sort(sortingFn)\n  return (\n    <>\n      <SelectPanel\n        title=\"Select labels\"\n        onSubmit={onSubmit}\n        onCancel={onCancel}\n        onClearSelection={onClearSelection}\n      >\n        <SelectPanel.Button>Assign label</SelectPanel.Button>\n\n        <SelectPanel.Header>\n          <SelectPanel.SearchInput\n            aria-label=\"Search\"\n            onChange={onSearchInputChange}\n          />\n        </SelectPanel.Header>\n\n        {itemsToShow.length === 0 ? (\n          <SelectPanel.Message\n            variant=\"empty\"\n            title={`No labels found for \"${query}\"`}\n          >\n            Try a different search term\n          </SelectPanel.Message>\n        ) : (\n          <ActionList>\n            {itemsToShow.map((label) => (\n              <ActionList.Item\n                key={label.id}\n                onSelect={() => onLabelSelect(label.id)}\n                selected={selectedLabelIds.includes(label.id)}\n              >\n                <ActionList.LeadingVisual>\n                  <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": "experimental-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": "experimental-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": "experimental-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": "experimental-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\n            onChange={onSearchInputChange}\n            aria-label=\"Search\"\n          />\n        </SelectPanel.Header>\n\n        {selectedAssigneeIds.length >= MAX_LIMIT ? (\n          <SelectPanel.Message variant=\"warning\" size=\"inline\">\n            You have reached the limit of {MAX_LIMIT} assignees on your free\n            account. <Link href=\"/upgrade\">Upgrade your account.</Link>\n          </SelectPanel.Message>\n        ) : null}\n\n        {itemsToShow.length === 0 ? (\n          <SelectPanel.Message\n            variant=\"empty\"\n            title={`No labels found for \"${query}\"`}\n          >\n            Try a different search term\n          </SelectPanel.Message>\n        ) : (\n          <ActionList>\n            {itemsToShow.map((collaborator) => (\n              <ActionList.Item\n                key={collaborator.id}\n                onSelect={() => onCollaboratorSelect(collaborator.id)}\n                selected={selectedAssigneeIds.includes(collaborator.id)}\n                disabled={\n                  selectedAssigneeIds.length >= MAX_LIMIT &&\n                  !selectedAssigneeIds.includes(collaborator.id)\n                }\n              >\n                <ActionList.LeadingVisual>\n                  <Avatar\n                    src={`https://github.com/${collaborator.login}.png`}\n                  />\n                </ActionList.LeadingVisual>\n                {collaborator.login}\n                <ActionList.Description>\n                  {collaborator.login}\n                </ActionList.Description>\n              </ActionList.Item>\n            ))}\n          </ActionList>\n        )}\n\n        <SelectPanel.Footer />\n      </SelectPanel>\n    </>\n  )\n}"
        },
        {
          "id": "experimental-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": "experimental-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": "experimental-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": "experimental-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": "experimental-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": "defaultOpen",
          "type": "boolean",
          "description": "",
          "defaultValue": "false"
        },
        {
          "name": "description",
          "type": "string",
          "description": "When provided, a description is displayed below the title"
        },
        {
          "name": "variant",
          "type": "'anchored' | 'modal'",
          "defaultValue": "anchored"
        },
        {
          "name": "selectionVariant",
          "type": "'multiple' | 'single' | 'instant'",
          "defaultValue": "multiple"
        },
        {
          "name": "onSubmit",
          "type": "(event: React.FormEvent) => void",
          "description": "Function that will be called when the panel is closed"
        },
        {
          "name": "onCancel",
          "type": "() => void",
          "description": "Function that will be called when the selection is submitted"
        },
        {
          "name": "onClearSelection",
          "type": "() => void",
          "description": "Function that will be called when the clear selection is selection"
        },
        {
          "name": "anchorRef",
          "type": "React.RefObject<HTMLButtonElement>",
          "description": "Useful for defining an external anchor"
        },
        {
          "name": "open",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If defined, will control the open/closed state of the panel."
        },
        {
          "name": "children",
          "type": "React.ReactNode[]",
          "description": "Recommended: `SelectPanel.Button`, `SelectPanel.Header`, `ActionList`, `SelectPanel.Loading`, `SelectPanel.Message`, `SelectPanel.Footer`"
        },
        {
          "name": "width",
          "type": "| 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | 'auto'",
          "defaultValue": "'medium'",
          "description": "Sets the width of the Dialog, pick from our set list of widths, or pass `auto` to automatically set the width based on the contents. `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `480px`, `xlarge` corresponds to `640px`, `xxlarge` corresponds to `960px`."
        },
        {
          "name": "height",
          "type": "| 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'fit-content'",
          "defaultValue": "'large'",
          "description": "Sets the height of the `Dialog`, pick from our set list of heights, or pass `fit-content` to set the height based on the contents. `xsmall` corresponds to `192px`, `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `432px`, `xlarge` corresponds to `600px`."
        },
        {
          "name": "maxHeight",
          "type": "'small' | 'large' | 'medium' | 'fit-content' | 'xlarge'",
          "description": "",
          "defaultValue": "'large'"
        }
      ],
      "subcomponents": [
        {
          "name": "SelectPanel.Button",
          "props": [
            {
              "name": "children",
              "type": "React.ReactElement",
              "required": true,
              "defaultValue": ""
            }
          ],
          "passthrough": {
            "element": "Button",
            "url": "/react/Button"
          }
        },
        {
          "name": "SelectPanel.Header",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "description": "Rendered before the list. Recommended: `SelectPanel.SearchInput`"
            },
            {
              "name": "onBack",
              "type": "() => void",
              "description": "",
              "defaultValue": ""
            }
          ]
        },
        {
          "name": "SelectPanel.SearchInput",
          "props": [
            {
              "name": "onChange",
              "type": "React.ChangeEventHandler<HTMLInputElement>",
              "description": "Callback when input text changes, use this for search/filter"
            },
            {
              "name": "loading",
              "type": "boolean",
              "description": "Useful for subtle loading states while fetching items asynchronously"
            }
          ],
          "passthrough": {
            "element": "TextInput",
            "url": "/react/TextInput"
          }
        },
        {
          "name": "SelectPanel.Footer",
          "props": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "description": "Optional: `<SelectPanel.SecondaryButton>`"
            }
          ]
        },
        {
          "name": "SelectPanel.SecondaryAction",
          "props": [
            {
              "name": "variant",
              "type": "'button' | 'link' | 'checkbox'"
            }
          ]
        },
        {
          "name": "SelectPanel.Loading",
          "props": [
            {
              "name": "children",
              "type": "string"
            }
          ]
        },
        {
          "name": "SelectPanel.Message",
          "props": [
            {
              "name": "variant",
              "type": "'warning' | 'error' | 'empty'"
            },
            {
              "name": "size",
              "type": "'inline' | 'full'"
            },
            {
              "name": "title",
              "type": "string",
              "description": "`inline` variant does not accept `title`"
            },
            {
              "name": "children",
              "type": "React.ReactNode"
            }
          ]
        }
      ]
    },
    "skeleton_avatar": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/Skeleton",
      "id": "skeleton_avatar",
      "name": "SkeletonAvatar",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-skeleton-skeletonavatar--default",
          "code": "() => <SkeletonAvatar />"
        },
        {
          "id": "experimental-components-skeleton-skeletonavatar-features--square",
          "code": "() => <SkeletonAvatar square />"
        },
        {
          "id": "experimental-components-skeleton-skeletonavatar-features--size",
          "code": "() => (\n  <div>\n    <SkeletonAvatar size={4} />\n    <SkeletonAvatar size={8} />\n    <SkeletonAvatar size={12} />\n    <SkeletonAvatar size={16} />\n    <SkeletonAvatar size={20} />\n    <SkeletonAvatar size={24} />\n    <SkeletonAvatar size={28} />\n    <SkeletonAvatar size={32} />\n    <SkeletonAvatar size={40} />\n    <SkeletonAvatar size={48} />\n    <SkeletonAvatar size={56} />\n    <SkeletonAvatar size={64} />\n  </div>\n)"
        },
        {
          "id": "experimental-components-skeleton-skeletonavatar-features--size-responsive",
          "code": "() => (\n  <div>\n    <SkeletonAvatar\n      size={{\n        narrow: 4,\n        regular: 8,\n        wide: 12,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 8,\n        regular: 12,\n        wide: 16,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 12,\n        regular: 16,\n        wide: 20,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 16,\n        regular: 20,\n        wide: 24,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 20,\n        regular: 24,\n        wide: 28,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 24,\n        regular: 28,\n        wide: 32,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 28,\n        regular: 32,\n        wide: 40,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 32,\n        regular: 40,\n        wide: 48,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 40,\n        regular: 48,\n        wide: 56,\n      }}\n    />\n    <SkeletonAvatar\n      size={{\n        narrow: 48,\n        regular: 56,\n        wide: 64,\n      }}\n    />\n  </div>\n)"
        },
        {
          "id": "experimental-components-skeleton-skeletonavatar-features--in-a-stack",
          "code": "() => (\n  <AvatarStack>\n    <SkeletonAvatar />\n    <SkeletonAvatar />\n    <SkeletonAvatar />\n    <SkeletonAvatar />\n  </AvatarStack>\n)"
        },
        {
          "id": "experimental-components-skeleton-skeletonavatar-features--in-an-avatar-pair",
          "code": "() => (\n  <AvatarPair>\n    <SkeletonAvatar />\n    <SkeletonAvatar />\n  </AvatarPair>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "size",
          "type": "number | { narrow?: number; regular?: number; wide?: number; }",
          "defaultValue": "20",
          "description": "The size of the avatar in pixels."
        },
        {
          "name": "square",
          "type": "boolean",
          "defaultValue": "false",
          "description": "If true, the avatar will be square instead of circular."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling."
        }
      ],
      "subcomponents": []
    },
    "skeleton_box": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/Skeleton",
      "id": "skeleton_box",
      "name": "SkeletonBox",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-skeleton-skeletonbox--default",
          "code": "() => <SkeletonBox />"
        },
        {
          "id": "experimental-components-skeleton-skeletonbox-features--custom-height",
          "code": "() => <SkeletonBox height=\"4rem\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletonbox-features--custom-width",
          "code": "() => <SkeletonBox width=\"300px\" />"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "width",
          "type": "string",
          "description": "Width of the skeleton box. Accepts any valid CSS `width` value."
        },
        {
          "name": "height",
          "defaultValue": "1rem",
          "type": "string",
          "description": "Height of the skeleton box. Accepts any valid CSS `height` value."
        },
        {
          "name": "className",
          "type": "string",
          "description": "The className of the skeleton box",
          "defaultValue": ""
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": []
    },
    "skeleton_text": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/Skeleton",
      "id": "skeleton_text",
      "name": "SkeletonText",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-skeleton-skeletontext--default",
          "code": "() => <SkeletonText />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--with-max-width",
          "code": "() => <SkeletonText maxWidth={200} />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--with-multiple-lines",
          "code": "() => <SkeletonText lines={3} />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--display",
          "code": "() => <SkeletonText size=\"display\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--subtitle",
          "code": "() => <SkeletonText size=\"subtitle\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--title-large",
          "code": "() => <SkeletonText size=\"titleLarge\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--title-medium",
          "code": "() => <SkeletonText size=\"titleMedium\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--title-small",
          "code": "() => <SkeletonText size=\"titleSmall\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--body-large",
          "code": "() => <SkeletonText size=\"bodyLarge\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--body-medium",
          "code": "() => <SkeletonText size=\"bodyMedium\" />"
        },
        {
          "id": "experimental-components-skeleton-skeletontext-features--body-small",
          "code": "() => <SkeletonText size=\"bodySmall\" />"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "size",
          "defaultValue": "'bodyMedium'",
          "type": "'display' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall' | 'subtitle'",
          "description": "Size of the text that the skeleton is replacing."
        },
        {
          "name": "lines",
          "defaultValue": "1",
          "type": "number",
          "description": "Number of lines of skeleton text to render."
        },
        {
          "name": "maxWidth",
          "type": "string",
          "description": "Maximum width that the line(s) of skeleton text can take up.  Accepts any valid CSS `max-width` value."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Class name for custom styling."
        }
      ],
      "subcomponents": []
    },
    "underline_panels": {
      "source": "https://github.com/primer/react/tree/main/packages/react/src/experimental/UnderlinePanels",
      "id": "underline_panels",
      "name": "UnderlinePanels",
      "status": "draft",
      "a11yReviewed": false,
      "stories": [
        {
          "id": "experimental-components-underlinepanels--default",
          "code": "() => {\n  const tabs = ['Tab 1', 'Tab 2', 'Tab 3']\n  const panels = ['Panel 1', 'Panel 2', 'Panel 3']\n  return (\n    <UnderlinePanels aria-label=\"Select a tab\">\n      {tabs.map((tab: string, index: number) => (\n        <UnderlinePanels.Tab\n          key={index}\n          aria-selected={index === 0 ? true : undefined}\n        >\n          {tab}\n        </UnderlinePanels.Tab>\n      ))}\n      {panels.map((panel: string, index: number) => (\n        <UnderlinePanels.Panel key={index}>{panel}</UnderlinePanels.Panel>\n      ))}\n    </UnderlinePanels>\n  )\n}"
        },
        {
          "id": "experimental-components-underlinepanels-features--labelled-by-external-element",
          "code": "() => (\n  <>\n    <h2 id=\"my-heading\">UnderlinePanels example</h2>\n    <UnderlinePanels aria-labelledby=\"my-heading\">\n      <UnderlinePanels.Tab>Tab 1</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab>Tab 2</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab>Tab 3</UnderlinePanels.Tab>\n      <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n    </UnderlinePanels>\n  </>\n)"
        },
        {
          "id": "experimental-components-underlinepanels-features--selected-tab",
          "code": "() => (\n  <UnderlinePanels aria-label=\"Select a tab\" id=\"tab-panels\">\n    <UnderlinePanels.Tab>Tab 1</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab aria-selected={true}>Tab 2</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab>Tab 3</UnderlinePanels.Tab>\n    <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n  </UnderlinePanels>\n)"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-counters",
          "code": "() => {\n  return (\n    <UnderlinePanels aria-label=\"Tabs with counters\">\n      <UnderlinePanels.Tab counter=\"11K\">Tab 1</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab counter={12}>Tab 2</UnderlinePanels.Tab>\n      <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    </UnderlinePanels>\n  )\n}"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-counters-in-loading-state",
          "code": "() => {\n  return (\n    <UnderlinePanels aria-label=\"Tabs with counters\" loadingCounters>\n      <UnderlinePanels.Tab counter=\"11K\">Tab 1</UnderlinePanels.Tab>\n      <UnderlinePanels.Tab counter={12}>Tab 2</UnderlinePanels.Tab>\n      <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n      <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    </UnderlinePanels>\n  )\n}"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-icons",
          "code": "() => (\n  <UnderlinePanels aria-label=\"Tabs with icons\">\n    <UnderlinePanels.Tab icon={CodeIcon}>Tab 1</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={EyeIcon}>Tab 2</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GitPullRequestIcon}>Tab 3</UnderlinePanels.Tab>\n    <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n  </UnderlinePanels>\n)"
        },
        {
          "id": "experimental-components-underlinepanels-features--with-icons-hidden-on-narrow-screen",
          "code": "() => (\n  <UnderlinePanels aria-label=\"Tabs with icons\">\n    <UnderlinePanels.Tab icon={CodeIcon}>Tab 1</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={EyeIcon}>Tab 2</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GitPullRequestIcon}>Tab 3</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={CommentDiscussionIcon}>\n      Tab 4\n    </UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={PlayIcon}>Tab 5</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={ProjectIcon}>Tab 6</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GraphIcon}>Tab 7</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={GearIcon}>Tab 8</UnderlinePanels.Tab>\n    <UnderlinePanels.Tab icon={ShieldLockIcon}>Tab 9</UnderlinePanels.Tab>\n    <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 4</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 5</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 6</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 7</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 8</UnderlinePanels.Panel>\n    <UnderlinePanels.Panel>Panel 9</UnderlinePanels.Panel>\n  </UnderlinePanels>\n)"
        }
      ],
      "importPath": "@primer/react/experimental",
      "props": [
        {
          "name": "aria-label",
          "type": "string",
          "defaultValue": "",
          "description": "Accessible name for the tab list"
        },
        {
          "name": "aria-labelledby",
          "type": "string",
          "defaultValue": "",
          "description": "ID of the element containing the name for the tab list"
        },
        {
          "name": "children",
          "type": "Array<UnderlinePanels.Tab | UnderlinePanels.Panel>",
          "defaultValue": "",
          "required": true,
          "description": "Tabs (UnderlinePanels.Tab) and panels (UnderlinePanels.Panel) to render"
        },
        {
          "name": "id",
          "type": "string",
          "defaultValue": "",
          "description": "Custom string to use when generating the IDs of tabs and `aria-labelledby` for the panels"
        },
        {
          "name": "loadingCounters",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Loading state for all counters. It displays loading animation for individual counters until all are resolved. It is needed to prevent multiple layout shift."
        },
        {
          "name": "sx",
          "type": "SystemStyleObject"
        }
      ],
      "subcomponents": [
        {
          "name": "UnderlinePanels.Tab",
          "props": [
            {
              "name": "aria-selected",
              "type": "| boolean | 'true' | 'false'",
              "defaultValue": "false",
              "description": "Whether this is the selected tab. For more information about `aria-selected`, see [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-selected)."
            },
            {
              "name": "onSelect",
              "type": "(event) => void",
              "defaultValue": "",
              "description": "The handler that gets called when the tab is selected"
            },
            {
              "name": "counter",
              "type": "number | string",
              "defaultValue": "",
              "description": "Content of CounterLabel rendered after tab text label"
            },
            {
              "name": "icon",
              "type": "Component",
              "defaultValue": "",
              "description": "Icon rendered before the tab text label"
            },
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ]
        },
        {
          "name": "UnderlinePanels.Panel",
          "props": [
            {
              "name": "sx",
              "type": "SystemStyleObject"
            }
          ],
          "passthrough": {
            "element": "div",
            "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#Attributes"
          }
        }
      ]
    }
  }
}